Excel VBA - 索引和匹配 vba 错误

Excel VBA - index and match vba error

我是 VBA 的新手,工作表函数有问题。我不确定我是否正确使用它,因为我一直收到运行时错误“1004”:“_Global”的方法 'Range' 失败。下面是我的 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. 您不能使用 Range(cells(x, y)) 除非 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