Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2642|回复: 5

[已解决]VBA实现多表格竖向查找合并

[复制链接]
发表于 2015-4-8 14:28 | 显示全部楼层 |阅读模式
本帖最后由 jk0932 于 2015-4-28 21:39 编辑

有若干个表格,首列都存在相同项目,每个表格有若干行,若干列,现在需要按照Book1的首列把其他表格中的内容进行查找到Book1中中,普通方法是粘贴表头,然后用vlookup查找,逐列对应,但很麻烦,
求VBA实现列合并,如附件所示

发现运行结果并未得到正确值;求更新
最佳答案
2015-4-8 14:47
相同地区品种的累加为一列,原数据中有两列“河北”
  1. Sub 导入文件()
  2.     Application.ScreenUpdating = False
  3.     Dim Filename, wb As Workbook, Sht As Worksheet
  4.     Filename = Dir(ThisWorkbook.Path & "\*.xlsx")
  5.     Set d = CreateObject("scripting.dictionary")     '品种+地区
  6.     Set d1 = CreateObject("scripting.dictionary")   '品种
  7.     Set d2 = CreateObject("scripting.dictionary")    '地区
  8.     Do While Filename <> ""
  9.         If Filename <> ThisWorkbook.Name Then
  10.             fn = ThisWorkbook.Path & "" & Filename
  11.             Set wb = Workbooks.Open(fn)
  12.             Set Sht = wb.Worksheets(1)
  13.             arr = Sht.[a1].CurrentRegion
  14.             For j = 2 To UBound(arr, 2)  '地区
  15.                 If Len(arr(1, j)) > 0 Then d2(arr(1, j)) = ""
  16.             Next
  17.             For i = 2 To UBound(arr)
  18.                 d1(arr(i, 1)) = ""    '品种
  19.                 For j = 2 To UBound(arr, 2)
  20.                     x = arr(i, 1) & arr(1, j)
  21.                     d(x) = d(x) + arr(i, j)          '品种+地区,数量累加
  22.                 Next
  23.             Next
  24.             wb.Close False
  25.         End If
  26.         Filename = Dir
  27.     Loop
  28.     Set Sht = Nothing
  29.     With Sheet1
  30.         .[a1].Resize(1, d2.Count) = d2.keys
  31.         .[a2].Resize(d1.Count) = Application.Transpose(d1.keys)
  32.         arr = .[a1].CurrentRegion
  33.         For i = 2 To UBound(arr)
  34.             For j = 2 To UBound(arr, 2)
  35.                 x = arr(i, 1) & arr(1, j)
  36.                 arr(i, j) = d(x)
  37.             Next
  38.         Next
  39.         .[a1].CurrentRegion = arr
  40.     End With
  41.     Application.ScreenUpdating = True
  42. End Sub
复制代码

求解.rar

72.65 KB, 下载次数: 12

发表于 2015-4-8 14:47 | 显示全部楼层    本楼为最佳答案   
相同地区品种的累加为一列,原数据中有两列“河北”
  1. Sub 导入文件()
  2.     Application.ScreenUpdating = False
  3.     Dim Filename, wb As Workbook, Sht As Worksheet
  4.     Filename = Dir(ThisWorkbook.Path & "\*.xlsx")
  5.     Set d = CreateObject("scripting.dictionary")     '品种+地区
  6.     Set d1 = CreateObject("scripting.dictionary")   '品种
  7.     Set d2 = CreateObject("scripting.dictionary")    '地区
  8.     Do While Filename <> ""
  9.         If Filename <> ThisWorkbook.Name Then
  10.             fn = ThisWorkbook.Path & "" & Filename
  11.             Set wb = Workbooks.Open(fn)
  12.             Set Sht = wb.Worksheets(1)
  13.             arr = Sht.[a1].CurrentRegion
  14.             For j = 2 To UBound(arr, 2)  '地区
  15.                 If Len(arr(1, j)) > 0 Then d2(arr(1, j)) = ""
  16.             Next
  17.             For i = 2 To UBound(arr)
  18.                 d1(arr(i, 1)) = ""    '品种
  19.                 For j = 2 To UBound(arr, 2)
  20.                     x = arr(i, 1) & arr(1, j)
  21.                     d(x) = d(x) + arr(i, j)          '品种+地区,数量累加
  22.                 Next
  23.             Next
  24.             wb.Close False
  25.         End If
  26.         Filename = Dir
  27.     Loop
  28.     Set Sht = Nothing
  29.     With Sheet1
  30.         .[a1].Resize(1, d2.Count) = d2.keys
  31.         .[a2].Resize(d1.Count) = Application.Transpose(d1.keys)
  32.         arr = .[a1].CurrentRegion
  33.         For i = 2 To UBound(arr)
  34.             For j = 2 To UBound(arr, 2)
  35.                 x = arr(i, 1) & arr(1, j)
  36.                 arr(i, j) = d(x)
  37.             Next
  38.         Next
  39.         .[a1].CurrentRegion = arr
  40.     End With
  41.     Application.ScreenUpdating = True
  42. End Sub
复制代码

求解.rar

96.84 KB, 下载次数: 27

回复

使用道具 举报

 楼主| 发表于 2015-4-14 22:20 | 显示全部楼层
grf1973 发表于 2015-4-8 14:47
相同地区品种的累加为一列,原数据中有两列“河北”

x = arr(i, 1) & arr(1, j) 第20行是什么意思?
d(x) = d(x) + arr(i, j)   第21行是如何实现的?
回复

使用道具 举报

发表于 2015-4-15 11:01 | 显示全部楼层
1、x = arr(i, 1) & arr(1, j) 第20行是什么意思?
答:把A列每个单元格和第1行每个单元格相连作为key。比如“苹果北京”“梨子河北”。。。。。
2、d(x) = d(x) + arr(i, j)   第21行是如何实现的?
答:各key所对应的数量累加。比如文件1“梨子河北”有100,文件2“梨子河北”有200,那么“梨子河北”所对应的数量就是100+200=300
回复

使用道具 举报

 楼主| 发表于 2015-4-28 21:38 | 显示全部楼层
grf1973 发表于 2015-4-8 14:47
相同地区品种的累加为一列,原数据中有两列“河北”

运行结果发现有问题,地区北京应该从A2开始,现在却在A1,问题结果如下:
北京西安河南河北山西广东广西太原成都
苹果3214601132322713
梨子1115792747476418
葡萄干27131136466661131
巴旦木6418781112121832
榴莲干1131311819191447
牡蛎1832321432321566
虾仁14471101547471312
豆腐干1566621966661819
牛肉干13121161312123111
马肉干18191441819191312
豆乳31111311714181819
鸡蛋3214601132322713
牛肉奶昔1115792747476418
羊奶27131136466661131
红豆6418781112121832
大米1131311819191447
库尔勒1832321432321566
哈密桃14471101547471312
芒果1566621966661819
西单13121161312123111
橘子品18191441819191312
雪莲31111311714181819

虎主3214601132322713
毛皮1115792747476418

回复

使用道具 举报

发表于 2015-4-29 13:50 | 显示全部楼层
惭愧惭愧,犯了点小错误。改过来了。

求解.rar

96.59 KB, 下载次数: 24

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-27 01:51 , Processed in 0.239086 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表