为什么这个VBA代码不会循环通过?

时间:2017-03-07 20:29:40

标签: excel vba pdf merge

我试图让它从C2中的文件夹打印文件,然后继续重复C3。它第一次运行时工作正常,但是当它尝试C3时,它输出错误序列,它无法插入页面,然后无法保存,也没有输出文件。我对VBA的基本理解让我觉得其中一个整数或数组不是'重置'。

你怎么看?我该如何修复,以便循环浏览几个不同的文件夹进行输出。

    Sub MergePDFs()

    Dim a() As String, i As Long, n As Long, ni As Long, p As String, f As String
    Dim AcroApp As New Acrobat.AcroApp, PartDocs() As Acrobat.CAcroPDDoc
    Dim DestFile As String '<-- change to suit
    Dim t As Integer
    Dim MyPath As String, MyFiles As String

     ' Choose the folder or just replace that part by: MyPath = Range("E3")
         '.InitialFileName = "C:\Temp\"
    For t = 0 To 1
    MyPath = Cells(t + 2, 3).Value
     DestFile = Cells(t + 2, 1).Value & ".pdf"

     ' Populate the array a() by PDF file names
    If Right(MyPath, 1) <> "\" Then MyPath = MyPath & "\"
    ReDim a(1 To 2 ^ 14)
    f = Dir(MyPath & "*.pdf")
    While Len(f)
        If StrComp(f, DestFile, vbTextCompare) Then
            i = i + 1
            a(i) = f
        End If
        f = Dir()
    Wend

     ' Merge PDFs
    If i Then
        ReDim Preserve a(1 To i)
        MyFiles = Join(a, ",")
        Application.StatusBar = "Merging, please wait ..."
        Application.StatusBar = False


    If Right(MyPath, 1) = "\" Then p = MyPath Else p = MyPath & "\"
    a = Split(MyFiles, ",")
    ReDim PartDocs(0 To UBound(a))

    On Error GoTo exit_
    If Len(Dir(p & DestFile)) Then Kill p & DestFile
    For i = 0 To UBound(a)
         ' Check PDF file presence
        If Dir(p & Trim(a(i))) = "" Then
            MsgBox "File not found" & vbLf & p & a(i), vbExclamation, "Canceled"
            Exit For
        End If
         ' Open PDF document
        Set PartDocs(i) = CreateObject("AcroExch.PDDoc")
        PartDocs(i).Open p & Trim(a(i))
        If i Then
             ' Merge PDF to PartDocs(0) document
            ni = PartDocs(i).GetNumPages()
            If Not PartDocs(0).InsertPages(n - 1, PartDocs(i), 0, ni, True) Then
                MsgBox "Cannot insert pages of" & vbLf & p & a(i), vbExclamation, "Canceled"
            End If
             ' Calc the number of pages in the merged document
            n = n + ni
             ' Release the memory
            PartDocs(i).Close
            Set PartDocs(i) = Nothing
        Else
             ' Calc the number of pages in PartDocs(0) document
            n = PartDocs(0).GetNumPages()
        End If
    Next

    If i > UBound(a) Then
         ' Save the merged document to DestFile
        If Not PartDocs(0).Save(PDSaveFull, p & DestFile) Then
            MsgBox "Cannot save the resulting document" & vbLf & p & DestFile, vbExclamation, "Canceled"
        End If
    End If

exit_:

     ' Inform about error/success
    If Err Then
        MsgBox Err.Description, vbCritical, "Error #" & Err.Number
    ElseIf i > UBound(a) Then
        MsgBox "The resulting file is created:" & vbLf & p & DestFile, vbInformation, "Done"
    End If

     ' Release the memory
    If Not PartDocs(0) Is Nothing Then PartDocs(0).Close
    Set PartDocs(0) = Nothing

     ' Quit Acrobat application
    AcroApp.Exit
    Set AcroApp = Nothing
    Else
        MsgBox "No PDF files found in" & vbLf & MyPath, vbExclamation, "Canceled"
    End If
    Next t
End Sub

1 个答案:

答案 0 :(得分:2)

For t循环开始后,重置i

的值
For t = 0 To 1
    i = 0

如果您当前在第一个目录中有5个文件,则第二个目录中的文件将放置在阵列的6+位置,前五个位置设置为空白。毫无疑问,当你试图访问那些&#34;空白&#34;文件名。

通过重置计数器,新文件名将放置在阵列的1+位置。