ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何利用vba代码通过采集数据并多次整理得到特定格式数据结果?

如何利用vba代码通过采集数据并多次整理得到特定格式数据结果?

作者:绿色风 分类: 时间:2022-08-17 浏览:96
楼主
kevinchengcw
Q: 如何利用vba代码通过采集数据并多次整理得到特定格式数据结果?
注: 源数据与结果数据示例如下图所示。

 
A: 代码如下:
  1. Sub test()
  2. Dim Arr, Arr2, Result, Result2, Dic As Object, N&, I&, Str$
  3. Arr = Worksheets("gh").[a1].CurrentRegion.Value  '将两个工作表的源数据区域放入数组中
  4. Arr2 = Worksheets("abits").[a1].CurrentRegion.Value
  5. Set Dic = CreateObject("scripting.dictionary")  '创建字典项目,用于存放各个字段存于数组中的位置
  6. With CreateObject("vbscript.regexp")    '创建正则,用于提取特定文本
  7.     .Global = True  '全局有效
  8.     .Pattern = "[^()]+?(?=\))"  '提取括号中内容
  9.     ReDim Result(1 To 5, 1 To 1)  '初始化结果数组
  10.     For N = LBound(Arr) + 1 To UBound(Arr)  '循环第一个源数据数组
  11.         If Trim(Arr(N, 2)) <> "" Then  '如果是有效字段,则
  12.             If Dic.exists(Arr(N, 2)) Then  '判断字典中是否有该字段,如果有,将内容串接到结果数组中的指定位置
  13.                 Result(1, Dic(Arr(N, 2))) = Result(1, Dic(Arr(N, 2))) & "/" & Evaluate(.Execute(Arr(N, 3))(0).Value)
  14.                 Result(2, Dic(Arr(N, 2))) = Result(2, Dic(Arr(N, 2))) & "+" & Split(Arr(N, 3), "(")(0) & "M"
  15.             Else  '如果没有,则判断数组最大下标是否已使用,如果已使用,则为数组增加一列
  16.                 I = UBound(Result, 2)
  17.                 If Result(1, I) <> "" Then
  18.                     I = I + 1
  19.                     ReDim Preserve Result(1 To 5, 1 To I)
  20.                 End If
  21.                 Result(1, I) = Evaluate(.Execute(Arr(N, 3))(0).Value)  '计算得到的版式的结果,放入数组指定位置
  22.                 Result(2, I) = Split(Arr(N, 3), "(")(0) & "M"  '将另一结果加上后缀存入数组中
  23.                 Dic.Add Arr(N, 2), I   '添加该字段的字典项,记录下数组下标位置
  24.             End If
  25.         End If
  26.     Next N
  27.     For N = LBound(Arr2) + 1 To UBound(Arr2)  '循环第二个数据源数组
  28.         If Trim(Arr2(N, 4)) <> "" Then  '如果是有效数据
  29.             Str = Arr2(N, 4)  '将数据赋值给变量
  30.             If Dic.exists(Str) Then  '同样判断是否存在该数据项并进行同上一过程类似的操作
  31.                 Result(3, Dic(Str)) = Arr2(N, 1)  
  32.                 Result(4, Dic(Str)) = Arr2(N, 2)
  33.                 Result(5, Dic(Str)) = Arr2(N, 3)
  34.             End If
  35.         Else
  36.             Result(5, Dic(Str)) = Result(5, Dic(Str)) & "," & Arr2(N, 3)
  37.         End If
  38.     Next N
  39. End With
  40. ReDim Result2(LBound(Result, 2) To UBound(Result, 2), LBound(Result) To UBound(Result))  '重定义写入到工作表的数组
  41. For N = LBound(Result2) To UBound(Result2)  '循环之前等到的结果,组合整理好最终结果
  42.     Result2(N, 1) = "GSM900 S" & Result(1, N) & "(" & Result(2, N) & ")"
  43.     Result2(N, 2) = Result(3, N)
  44.     Result2(N, 3) = Result(4, N)
  45.     Result2(N, 4) = Result(5, N)
  46. Next N
  47. With Worksheets("2")  '将结果写入到指定工作表中
  48.     [c2].Resize(Dic.Count, 1) = Application.Transpose(Dic.keys)
  49.     [g2].Resize(UBound(Result2), UBound(Result2, 2)) = Result2
  50. End With
  51. Set Dic = Nothing  '清空字典项目
  52. End Sub
详见附件及素材源帖.
规划方案.rar
2楼
xmyjk
太壮观了,辛苦K哥了。

免责声明

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

评论列表
sitemap