Excel VBA - 索引和匹配vba错误

时间:2015-01-05 08:40:46

标签: excel excel-vba vba

我对VBA很新,我遇到了工作表功能问题。我不确定我是否正确使用它,因为我遇到了运行时错误' 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 个答案:

答案 0 :(得分:2)

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

  1. 您没有使用a正确限定Range和Cells调用 工作表对象;
  2. 您不能使用Range(cells(x, y)),除非     Cells(x, y)处的单元格值是范围的地址。
  3. 您的括号在索引/匹配部分中不正确。
  4. 试试这个:

    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