如何调试此VBA代码?

时间:2016-05-31 06:44:54

标签: excel vba excel-vba

我使用以下代码遍历文件夹中的工作簿,每个工作簿都有多个工作表。我总共有7本工作簿,但是我得到的只有3本工作簿到达摘要表后我Run time error:1004 Method 'open' of object 'workbooks' failed.我是VBA的新手,并且不知道如何解决这个问题。有人可以帮我调试吗?

Public Sub ConsolidateSheets()

    Dim Wb1 As Workbook
    Dim Wb2 As Workbook
    Dim ws1 As Worksheet
    Dim ws2 As Worksheet
    Dim ws3 As Worksheet
    Dim rng1 As Range
    Dim rng2 As Range
    Dim rng3 As Range
    Dim rngArea As Range
    Dim lrowSpace As Long
    Dim lSht As Long
    Dim lngCalc As Long
    Dim lngRow As Long
    Dim lngCol As Long
    Dim X()
    Dim bProcessFolder As Boolean
    Dim bNewSheet As Boolean
    Dim StrPrefix
    Dim strFileName As String
    Dim strFolderName As String
    Dim strDefaultFolder As Variant

    bProcessFolder = (MsgBox("Process a single folder (Yes)," & vbNewLine & "or single file (No)", vbYesNo, "Application Scope: Folder or single File") = vbYes)
    bNewSheet = (MsgBox("Extract all data to a single sheet (Yes)", vbYesNo, "Output Format: Single sheet or sheet by sheet collection") = vbYes)
    If Not bProcessFolder Then
        If Not bNewSheet Then
            MsgBox "There isn't much point creating a exact replica of your source file "
            Exit Sub
        End If
    End If
    strDefaultFolder = "D:\Tracker"
    lrowSpace = 1
    If bProcessFolder Then
        strFolderName = BrowseForFolder(strDefaultFolder)
        strFileName = Dir(strFolderName & "\*.xls*")
        Else
        strFileName = Application _
        .GetOpenFilename("Select file to process (*.xls*), *.xls*")
    End If
    Set Wb1 = Workbooks.Add(1)
    Set ws1 = Wb1.Sheets(1)
    If Not bNewSheet Then ws1.Range("A1:B1") = Array("workbook name", "worksheet count")

    With Application
        .DisplayAlerts = False
        .EnableEvents = False
        .ScreenUpdating = False
        lngCalc = .Calculation
        .Calculation = xlCalculationManual
    End With
    StrPrefix = strFolderName & IIf(bProcessFolder, "\", vbNullString)
    Do While Len(strFileName) > 0
    Application.StatusBar = Left("Processing " & strFolderName & "\" & strFileName, 255)

    Set Wb2 = Workbooks.Open(StrPrefix & strFileName)
    If Not bNewSheet Then
        ws1.Cells(Rows.Count, "A").End(xlUp).Offset(1, 0) = Wb2.Name
        ws1.Cells(Rows.Count, "A").End(xlUp).Offset(0, 1) = Wb2.Sheets.Count
    End If
    For Each ws2 In Wb2.Sheets
    If bNewSheet Then
        Set rng2 = ws2.Cells.Find("*", ws2.[a1], xlValues, , xlByRows, xlPrevious)
        If Not rng2 Is Nothing Then
        Set rng1 = ws1.Cells.Find("*", ws1.[a1], xlValues, , xlByRows, xlPrevious)

    If Not rng1 Is Nothing Then
        Set rng3 = ws2.Range(ws2.UsedRange.Cells(1), ws2.Cells(rng2.Row, "A"))

    If rng3.Rows.Count + rng1.Row < Rows.Count Then

        ws2.UsedRange.Copy ws1.Cells(rng1.Row + 1 + lrowSpace, ws2.UsedRange.Cells(1).Column)
    Else
        MsgBox "Summary sheet size exceeded. Process stopped on " & vbNewLine & _
        "sheet: " & ws2.Name & vbNewLine & "of" & vbNewLine & "workbook: " & Wb2.Name
        Wb2.Close False
        Exit Do
    End If

    If lrowSpace <> 0 Then ws1.Rows(rng1.Row + 1).Interior.Color = vbGreen
    Else

        ws2.UsedRange.Copy ws1.Cells(1, ws2.UsedRange.Cells(1).Column)
    End If
    End If
    Else

        ws2.Copy after:=Wb1.Sheets(Wb1.Sheets.Count)

    With Wb1.Sheets(Wb1.Sheets.Count).Cells
        .Copy
        .PasteSpecial xlPasteValues
    End With
    On Error Resume Next
    Wb1.Sheets(Wb1.Sheets.Count).Name = ws2.Name

    If Err.Number <> 0 Then

        Do
        lSht = lSht + 1
        Set ws3 = Wb1.Sheets(ws2.Name & " " & lSht)
        Loop While Not ws3 Is Nothing
        lSht = 0
        End If
        On Error GoTo 0
    End If
    Next ws2

    Wb2.Close False

    If bProcessFolder = False Then Exit Do
    strFileName = Dir
Loop

    If bNewSheet Then
        With ws1.UsedRange
            .Copy
            .Cells(1).PasteSpecial xlPasteValues
            .Cells(1).Activate
        End With
        Else

        ws1.Activate
        ws1.Range("A1:B1").Font.Bold = True
        ws1.Columns.AutoFit
    End If
    With Application
        .CutCopyMode = False
        .DisplayAlerts = True
        .EnableEvents = True
        .ScreenUpdating = True
        .Calculation = lngCalc
        .StatusBar = vbNullString
    End With
End Sub

Function BrowseForFolder(Optional OpenAt As Variant) As Variant

    Dim ShellApp As Object

    Set ShellApp = CreateObject("Shell.Application"). _
    BrowseForFolder(0, "Please choose a folder", 0, OpenAt)

    On Error Resume Next
    BrowseForFolder = ShellApp.self.Path
    On Error GoTo 0

    Set ShellApp = Nothing

    Select Case Mid(BrowseForFolder, 2, 1)
    Case Is = ":"
        If Left(BrowseForFolder, 1) = ":" Then GoTo Invalid
    Case Is = "\"
        If Not Left(BrowseForFolder, 1) = "\" Then GoTo Invalid
    Case Else
        GoTo Invalid
    End Select
    Exit Function
Invalid:
    BrowseForFolder = False
End Function

0 个答案:

没有答案