ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 我的酷贴 > Excel VBA > 用VBA实现批量符合条件的数据互换

用VBA实现批量符合条件的数据互换

作者:绿色风 分类: 时间:2022-08-18 浏览:91
楼主
kevinchengcw
利用VBA及字典功能,可以良好的实现数据区交换功能,本例所引用为一交换实例,代码如下:
  1. Sub test()
  2. Dim Dic1, Dic2, Arr
  3. Dim M, N, I As Integer
  4. Set Dic1 = CreateObject("scripting.dictionary")  '创建字典
  5. Set Dic2 = CreateObject("scripting.dictionary")
  6. With Worksheets("表1")
  7.     I = .Cells.Find("期末金额").Column  '查找“期末金额”所在的列
  8.     For M = .Cells.Find("期末金额").Row + 2 To .Cells(.Cells.Find("合计:").Row - 1, I).End(3).Row  '枚举“期末金额”到“合计”之间有数据的单元格
  9.         If .Cells(M, I).Value < 0 Then   '如果单元格是负值
  10.             Dic1.Add .Cells(M, I - 3).Value & "|" & .Cells(M, I - 2).Value & "|" & .Cells(M, I - 1).Value, Abs(.Cells(M, I).Value)  '添加字典项,对应的负值取绝对值
  11.             .Range(.Cells(M, I - 3), .Cells(M, I)).ClearContents  '清空已添加项目数据
  12.         End If
  13.     Next M
  14. End With
  15. With Worksheets("表2")
  16.     I = .Cells.Find("期末金额").Column   '取得“期末金额”所在列
  17.     For M = .Cells.Find("期末金额").Row + 2 To .Cells(.Cells.Find("合计:").Row - 1, I).End(3).Row   '枚举“期末金额”与“合计”之间有数据的单元格
  18.         If .Cells(M, I).Value < 0 Then   '如果单元格是负值
  19.             Dic2.Add .Cells(M, I - 3).Value & "|" & .Cells(M, I - 2).Value & "|" & .Cells(M, I - 1).Value, Abs(.Cells(M, I).Value)  '添加字典项
  20.             .Range(.Cells(M, I - 3), .Cells(M, I)).ClearContents  '清空已添加数据
  21.         End If
  22.     Next M
  23.     Arr = Dic1.keys   '将字典1的keys赋值给数组
  24.     M = .Cells(.Cells.Find("合计").Row - 1, I - 3).End(3).Row + 1   '取得对应数据区的第一个空行
  25.     For N = LBound(Arr) To UBound(Arr)   '循环写入另一工作表里取得的对应项
  26.         Debug.Print Split(Arr(N), "|")(0)
  27.         .Cells(M, I - 3) = Split(Arr(N), "|")(0)
  28.         .Cells(M, I - 2) = Split(Arr(N), "|")(1)
  29.         .Cells(M, I - 1) = Split(Arr(N), "|")(2)
  30.         .Cells(M, I) = Dic1(Arr(N))
  31.         M = M + 1
  32.     Next N
  33. End With
  34. Erase Arr   '清空数组
  35. With Worksheets("表1")   '继续对“表1”进行同样操作
  36.     I = .Cells.Find("期末金额").Column
  37.     Arr = Dic2.keys
  38.     M = .Cells(.Cells.Find("合计").Row - 1, I - 3).End(3).Row + 1
  39.     For N = LBound(Arr) To UBound(Arr)
  40.         .Cells(M, I - 3) = Split(Arr(N), "|")(0)
  41.         .Cells(M, I - 2) = Split(Arr(N), "|")(1)
  42.         .Cells(M, I - 1) = Split(Arr(N), "|")(2)
  43.         .Cells(M, I) = Dic2(Arr(N))
  44.         M = M + 1
  45.     Next N
  46. End With
  47. Set Dic1 = Nothing  '清空项目
  48. Set Dic2 = Nothing
  49. End Sub


本例中使用了查找引用,对于添加删除行列,只要不影响到表格区的结构就不会影响代码结果

详见附件
数据互换.rar
2楼
donghan
不错,学习一下

免责声明

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

评论列表
sitemap