ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何运用VBA将每个子表指定位置的数据均排成一行依次填入总表中呢?

如何运用VBA将每个子表指定位置的数据均排成一行依次填入总表中呢?

作者:绿色风 分类: 时间:2022-08-17 浏览:77
楼主
0Mouse
Q:如何运用VBA将每个子表指定位置的数据均排成一行依次填入总表中呢?
示例:
子表1:

 
子表2:

 
子表3:

 
总表汇总结果:(列数太多,截图中部分列被隐藏)

 
注:3个子表中,红色矩形框框住的区域内选项选取方式存在差异,分别为“■”、“√”(勾)和“V”(大写字母V)。
A:代码如下:
  1. Sub 汇总()
  2. Application.ScreenUpdating = False '关闭屏幕更新
  3. Dim fp$, fn$, arr, i%, j%, brr, rg As Range, k As Byte, sr1$, sr2$ '定义变量
  4. fp = ThisWorkbook.Path & "\" '将汇总表文件所在路径赋值给fp变量
  5. fn = Dir(fp & "*.xlsx") '获取路径下的Excel文件的文件名
  6. arr = [A1].CurrentRegion '将汇总表A1单元格所在区域数据赋值给arr
  7. For k = 1 To UBound(arr, 2) '循环arr数组的每一列
  8.     If arr(1, k) = "" Then arr(1, k) = arr(1, k - 1) '将数组第一行各列空值填入与其左侧相同的内容
  9. Next
  10. ReDim brr(1 To 1000, 1 To UBound(arr, 2)) '重新定义brr数组两个维度的上下限
  11. Do While fn <> "" '循环路径下的各个工作簿,直到fn为空
  12.     If fn <> ThisWorkbook.Name Then '如果不是本工作簿
  13.         i = i + 1
  14.         Workbooks.Open fp & fn '打开Dir返回的文件名对应的Excel文档
  15.         For j = 1 To UBound(arr, 2) '循环arr数组的每一列
  16.             With ActiveWorkbook.Sheets(1)
  17.                 Set rg = .Cells.Find(arr(2, j)) '查找arr数组第二行各列的数值,并用rg代表找到的单元格
  18.                 If arr(1, j) = "基本情况" Or arr(1, j) = "转型前" Or arr(1, j) = "特殊指标" Then
  19.                     If arr(2, j) = "人员人数(人)" Then
  20.                         brr(i, j) = rg.Offset(, 2) '找到的单元格往右偏移2列
  21.                     Else
  22.                         brr(i, j) = rg.Offset(, 1)
  23.                     End If
  24.                 ElseIf arr(1, j) = "转型后" Then
  25.                     If arr(2, j) = "人员人数(人)" Then
  26.                         brr(i, j) = rg.Offset(, 8)
  27.                     Else
  28.                         brr(i, j) = rg.Offset(, 1).Offset(, 1)
  29.                     End If
  30.                 Else
  31.                     sr1 = Replace(rg.Offset(, 1), " ", "   ") '通过替换增加空格数
  32.                     sr2 = Replace(rg.Offset(, 1), " ", "") '通过替换删除空格数
  33.                     If InStr(1, rg.Offset(, 1), "■") Then
  34.                         brr(i, j) = Trim(Mid(sr1, InStr(1, sr1, "■") + 1, 4)) '将sr1变量中从“■”下一个字符开始的连续4个字符去除首尾多余空格后赋值给brr(i,j)
  35.                     ElseIf Split(sr2, "□")(0) = "" Then
  36.                         brr(i, j) = Split(sr2, "□")(2)
  37.                     Else
  38.                         brr(i, j) = Split(sr2, "□")(1)
  39.                     End If
  40.                     sr1 = "": sr2 = "" '清空sr1和sr2变量
  41.                 End If
  42.             End With
  43.         Next
  44.         ActiveWorkbook.Close False '关闭活动工作簿,不保存
  45.     End If
  46.     fn = Dir '获取下一个文件名
  47. Loop
  48. [A3].Resize(i, UBound(arr, 2)).ClearContents '清空目标区域数据
  49. [A3].Resize(i, UBound(arr, 2)) = brr '将brr数组存储的数据写入目标区域
  50. Erase brr: Erase arr '清空数组变量
  51. Application.ScreenUpdating = True '开启屏幕更新
  52. End Sub
附件:
运用VBA将每个子表指定位置的数据均排成一行依次填入总表中.rar
2楼
亡者天下
谢谢分享
3楼
老糊涂
谢谢分享

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap