Excel精英培训网

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

[已解决]批量查询多工作表各区间相同数组的问题

[复制链接]
发表于 2013-7-14 08:06 | 显示全部楼层 |阅读模式
附件 批量查询各区间相同数组.rar (385.26 KB, 下载次数: 25)
发表于 2013-7-14 10:01 | 显示全部楼层
这个问题,就是工作量太大。可以提供个思路给你:用字典,取出五列的数据为KEY,循环下一个,如果在字典里有,则提出字典中的ITEM,和提出本行,到SHEET0表中。再套上外循环每个区间,再外套上外循环每个工作表,再外套循环每个工作簿。
工作量太大,所以只好作罢。
回复

使用道具 举报

发表于 2013-7-14 10:03 | 显示全部楼层
  1. Sub 遍历工作簿()
  2.     Dim strPath As String, strFile As String
  3.     strPath = ThisWorkbook.Path & Application.PathSeparator & "数据文件" & Application.PathSeparator
  4.     strFile = Dir(strPath & "*.xlsx")
  5.     With Application
  6.         .ScreenUpdating = False
  7.         .DisplayAlerts = False
  8.         .EnableEvents = False
  9.         .Calculation = xlCalculationManual
  10.     End With

  11.     Do While Len(strFile)
  12.         If strFile <> ThisWorkbook.Name Then
  13.             Call 汇总(strPath & strFile)
  14.         End If
  15.         strFile = Dir
  16.     Loop
  17.     With Application
  18.         .ScreenUpdating = True
  19.         .DisplayAlerts = True
  20.         .EnableEvents = True
  21.         .Calculation = xlCalculationAutomatic
  22.     End With
  23.     MsgBox "查找结束"
  24. End Sub
  25. Sub 汇总(strFullname As String)
  26.     Dim i As Byte, k As Long
  27.     Dim lLastRow As Long, lRow As Long
  28.     Dim objwb As Workbook
  29.     Dim objDic As Object, objDicTemp As Object
  30.     Dim strKey As String, Key, Item
  31.     Dim arr, arrTemp
  32.    
  33.     On Error GoTo ErrorHandler

  34.     Set objwb = GetObject(strFullname)
  35.     Windows(objwb.Name).Visible = True
  36.     Set objDic = CreateObject("scripting.dictionary")
  37.     lRow = 1
  38.     With objwb

  39.         For i = 1 To .Worksheets.Count - 1
  40.             With .Worksheets("sheet" & i)
  41.                 lLastRow = .Cells(Rows.Count, 1).End(xlUp).Row
  42.                 arr = .Range("a1:p" & lLastRow).Value
  43.             End With

  44.             For k = LBound(arr) To UBound(arr)
  45.                 If Not objDic.exists(arr(k, 4)) Then
  46.                     objDic.Add arr(k, 4), CreateObject("scripting.dictionary")
  47.                 End If
  48.                 Set objDicTemp = objDic(arr(k, 4))
  49.                 strKey = arr(k, 10) & "#" & arr(k, 11) & "#" & arr(k, 13) & "#" & arr(k, 14) & "#" & arr(k, 16)
  50.                 objDicTemp(strKey) = objDicTemp(strKey) & k & ","
  51.                 Set objDic(arr(k, 4)) = objDicTemp
  52.             Next

  53.             For Each Key In objDic.keys
  54.                 Set objDicTemp = objDic(Key)
  55.                 For Each Item In objDicTemp.items
  56.                     With .Worksheets("sheet0")
  57.                         If (Len(Item) - Len(Replace(Item, ",", ""))) > 1 Then
  58.                             arrTemp = Split(Item, ",")
  59.                             For k = LBound(arrTemp) To UBound(arrTemp) - 1
  60.                                 .Cells(lRow, 1).Resize(, UBound(arr, 2)).Value = WorksheetFunction.Index(arr, arrTemp(k), 0)
  61.                                 lRow = lRow + 1
  62.                             Next
  63.                             .Cells(lRow - 1, 18).Value = Key
  64.                             lRow = lRow + 1
  65.                         End If
  66.                     End With
  67.                 Next
  68.             Next
  69.             objDic.RemoveAll
  70.         Next
  71.         .Close True
  72.     End With
  73.     Exit Sub

  74. ErrorHandler:
  75.     MsgBox Err.Number & vbCrLf & Err.Description, vbCritical + vbOKCancel, IIf(objwb Is Nothing, "", objwb.Name)
  76.     If Not objwb Is Nothing Then
  77.         objwb.Close False
  78.     End If
  79. End Sub
复制代码

评分

参与人数 1 +1 收起 理由
YangYangg + 1 很给力!

查看全部评分

回复

使用道具 举报

发表于 2013-7-14 10:03 | 显示全部楼层
你的1,2貌似数据都是一样的吧,我看SHEET0得出的结果是一样的。

你给验证下。
回复

使用道具 举报

发表于 2013-7-14 10:09 | 显示全部楼层
貌似最好中的区间跟你的不同了,我写的是文件名了,得再改下。
回复

使用道具 举报

发表于 2013-7-14 10:12 | 显示全部楼层
没看清,我填的是区间名,你要求的是表名。
  1. Sub 遍历工作簿()
  2.     Dim strPath As String, strFile As String
  3.     strPath = ThisWorkbook.Path & Application.PathSeparator & "数据文件" & Application.PathSeparator
  4.     strFile = Dir(strPath & "*.xlsx")
  5.     With Application
  6.         .ScreenUpdating = False
  7.         .DisplayAlerts = False
  8.         .EnableEvents = False
  9.         .Calculation = xlCalculationManual
  10.     End With

  11.     Do While Len(strFile)
  12.         If strFile <> ThisWorkbook.Name Then
  13.             Call 汇总(strPath & strFile)
  14.         End If
  15.         strFile = Dir
  16.     Loop
  17.     With Application
  18.         .ScreenUpdating = True
  19.         .DisplayAlerts = True
  20.         .EnableEvents = True
  21.         .Calculation = xlCalculationAutomatic
  22.     End With
  23.     MsgBox "查找结束"
  24. End Sub
  25. Sub 汇总(strFullname As String)
  26.     Dim i As Byte, k As Long
  27.     Dim lLastRow As Long, lRow As Long
  28.     Dim objwb As Workbook
  29.     Dim objDic As Object, objDicTemp As Object
  30.     Dim strKey As String, Key, Item
  31.     Dim arr, arrTemp
  32.    
  33.     On Error GoTo ErrorHandler

  34.     Set objwb = GetObject(strFullname)
  35.     Windows(objwb.Name).Visible = True
  36.     Set objDic = CreateObject("scripting.dictionary")
  37.     lRow = 1
  38.     With objwb

  39.         For i = 1 To .Worksheets.Count - 1
  40.             With .Worksheets("sheet" & i)
  41.                 lLastRow = .Cells(Rows.Count, 1).End(xlUp).Row
  42.                 arr = .Range("a1:p" & lLastRow).Value
  43.             End With

  44.             For k = LBound(arr) To UBound(arr)
  45.                 If Not objDic.exists(arr(k, 4)) Then
  46.                     objDic.Add arr(k, 4), CreateObject("scripting.dictionary")
  47.                 End If
  48.                 Set objDicTemp = objDic(arr(k, 4))
  49.                 strKey = arr(k, 10) & "#" & arr(k, 11) & "#" & arr(k, 13) & "#" & arr(k, 14) & "#" & arr(k, 16)
  50.                 objDicTemp(strKey) = objDicTemp(strKey) & k & ","
  51.                 Set objDic(arr(k, 4)) = objDicTemp
  52.             Next

  53.             For Each Key In objDic.keys
  54.                 Set objDicTemp = objDic(Key)
  55.                 For Each Item In objDicTemp.items
  56.                     With .Worksheets("sheet0")
  57.                         If (Len(Item) - Len(Replace(Item, ",", ""))) > 1 Then
  58.                             arrTemp = Split(Item, ",")
  59.                             For k = LBound(arrTemp) To UBound(arrTemp) - 1
  60.                                 .Cells(lRow, 1).Resize(, UBound(arr, 2)).Value = WorksheetFunction.Index(arr, arrTemp(k), 0)
  61.                                 lRow = lRow + 1
  62.                             Next
  63.                             .Cells(lRow - 1, 18).Value = i
  64.                             lRow = lRow + 1
  65.                         End If
  66.                     End With
  67.                 Next
  68.             Next
  69.             objDic.RemoveAll
  70.         Next
  71.         .Close True
  72.     End With
  73.     Exit Sub

  74. ErrorHandler:
  75.     MsgBox Err.Number & vbCrLf & Err.Description, vbCritical + vbOKCancel, IIf(objwb Is Nothing, "", objwb.Name)
  76.     If Not objwb Is Nothing Then
  77.         objwb.Close False
  78.     End If
  79. End Sub
复制代码
回复

使用道具 举报

发表于 2013-7-14 10:12 | 显示全部楼层    本楼为最佳答案   
批量查询各区间相同数组附件.rar (24.48 KB, 下载次数: 17)
回复

使用道具 举报

 楼主| 发表于 2013-7-14 10:41 | 显示全部楼层
hwc2ycy 发表于 2013-7-14 10:03
你的1,2貌似数据都是一样的吧,我看SHEET0得出的结果是一样的。

你给验证下。

谢谢老师帮助。试了一下真实数据。运行很正常。但与预期结果相差很大。即同一张工作薄,用非批量查询出来的数据,与用批量查询出来的数据,差别很大。仔细对比了一下,发现:批量查询,返回的结果,R列数工作表标识,成了区间标识。

2.jpg

R列的数据,是代表工作表的,即:47就是Sheet47    48就是Sheet48  , 这里发现,与D列的区间数全部都是相同的。

估计问题就出在这里。
回复

使用道具 举报

发表于 2013-7-14 11:09 | 显示全部楼层
后来的代码修正了这个。
回复

使用道具 举报

 楼主| 发表于 2013-7-14 11:11 | 显示全部楼层
hwc2ycy 发表于 2013-7-14 10:12
SHEET1里有个按钮,直接点按钮即可。

经测试,运行正常。只是结果的返回方式有点区别。对比了一下,批量查询速度快很多。决定取批量查询方式,而改变后续一个程序了。

谢谢老师帮助,再谢!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 14:29 , Processed in 0.392607 second(s), 17 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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