Excel VBA – 索引和匹配vba错误

我对VBA非常新,而且在工作表function方面有问题。 我不确定是否正确使用它,因为我得到了一个运行时错误“1004”:方法“_Global”的范围失败。 下面是我的VBA,希望你们能帮我一把。 谢谢!

Sub MergeAllWorkbooks2() Dim FolderPath As String Dim X As Long Dim i As Long Dim FileName As String Dim WorkBk As Workbook Dim SourceRange As Range Dim DestRange As Range 'path of directory FolderPath = "C:\Users\XXXX\Desktop\New folder\XXXXX\" ' Setting starting points X = 3 ' Call Dir the first time, pointing it to all Excel files in the folder path. FileName = Dir(FolderPath & "*.xl*") ' Loop until Dir returns an empty string. Do Until FileName = "" ' Open a workbook in the folder Set WorkBk = Workbooks.Open(FolderPath & FileName) 'Set the source range Set SourceRange = WorkBk.Worksheets(1).Range("C2:C7") ' Set the destination range Workbooks("Summary.xlsm").Worksheets("Sheet1").Activate Set DestRange = Workbooks("Summary.xlsm").Worksheets("Sheet1").Range(Cells(4, X), Cells(9, X)) ' Copy over the values from the source to the destination. DestRange.Value = SourceRange.Value 'Get hourly from each file For i = 12 To 8762 Workbooks("Summary.xlsm").Worksheets("Sheet1").Range(Cells(12, X), Range(Cells(12, X).End(xlDown))) = _ Application.WorksheetFunction.Index(WorkBk.Worksheets(2).Range("B3:B8762"), Application.Match(Workbooks("Summary.xlsm").Worksheets("Sheet1").Range(Cells(i, X)), WorkBk.Worksheets(2).Range("A3:A8763")), 0) Next i ' Increase NColumn so that we know where to copy data next. X = X + DestRange.Columns.Count ' Close the source workbook without saving changes. WorkBk.Close savechanges:=False ' Use Dir to get the next file name. FileName = Dir() Loop ' Range("C4:C9", Range("C4:C9").End(xlToRight)).Sort key1:=Range("b7"), key2:=Range("b8"), key3:=Range("b9"), _ ' order1:=xlAscending, Orientation:=xlLeftToRight endTime = Now() totTimeSec = Round(((endTime - startTime) * (24 * CLng(3600))), 1) MsgBox (totTimeSec & " seconds") End Sub 

我没有通过所有的代码检查问题,但主要的是:

  1. 你没有正确地使用工作表对象来限定Range和Cells的调用。
  2. 除非Cells(x, y)处的Cells(x, y)的值是范围的地址,否则不能使用Range(cells(x, y))
  3. 您的括号在索引/匹配部分中不正确。

试试这个:

 Sub MergeAllWorkbooks2() Dim FolderPath As String Dim X As Long Dim i As Long Dim FileName As String Dim WorkBk As Workbook Dim SourceRange As Range Dim DestRange As Range Dim wsDest As Worksheet 'path of directory FolderPath = "C:\Users\XXXX\Desktop\New folder\XXXXX\" ' Setting starting points X = 3 ' Call Dir the first time, pointing it to all Excel files in the folder path. FileName = Dir(FolderPath & "*.xl*") ' Loop until Dir returns an empty string. Do Until FileName = "" ' Open a workbook in the folder Set WorkBk = Workbooks.Open(FolderPath & FileName) 'Set the source range Set SourceRange = WorkBk.Worksheets(1).Range("C2:C7") ' Set the destination range Set wsDest = Workbooks("Summary.xlsm").Worksheets("Sheet1") Set DestRange = wsDest.Range(wsDest.Cells(4, X), wsDest.Cells(9, X)) ' Copy over the values from the source to the destination. DestRange.Value = SourceRange.Value 'Get hourly from each file For i = 12 To 8762 wsDest.Range(wsDest.Cells(12, X), wsDest.Cells(12, X).End(xlDown)) = _ Application.WorksheetFunction.Index(WorkBk.Worksheets(2).Range("B3:B8762"), Application.Match(wsDest.Cells(i, X), WorkBk.Worksheets(2).Range("A3:A8763"), 0), 1) Next i ' Increase NColumn so that we know where to copy data next. X = X + DestRange.Columns.Count ' Close the source workbook without saving changes. WorkBk.Close savechanges:=False ' Use Dir to get the next file name. FileName = Dir() Loop ' Range("C4:C9", Range("C4:C9").End(xlToRight)).Sort key1:=Range("b7"), key2:=Range("b8"), key3:=Range("b9"), _ ' order1:=xlAscending, Orientation:=xlLeftToRight endTime = Now() totTimeSec = Round(((endTime - startTime) * (24 * CLng(3600))), 1) MsgBox (totTimeSec & " seconds") End Sub