【问题标题】:VBA, Array range error, subscript out of rangeVBA,数组范围错误,下标超出范围
【发布时间】:2018-08-14 23:01:13
【问题描述】:

您好,我正在尝试使我的数组更加动态,以将所有文件路径包含在 G 列中。但是我很难做到这一点,因为每当我尝试类似 arrayFilePaths = Range("G4:G5") 或此处的任何解决方案时,我都会收到 subscript out of range,@ 987654321@

我在OK = primaryDoc.Open(arrayFilePaths(0)) 行收到type mismatchsubscript out of range

我的代码:

Sub main()

        Dim arrayFilePaths() As Variant
        Set app = CreateObject("Acroexch.app")

        arrayFilePaths = Array(Range("G4"), Range("G5"))

        Set primaryDoc = CreateObject("AcroExch.PDDoc")
        OK = primaryDoc.Open(arrayFilePaths(0))
        Debug.Print "PRIMARY DOC OPENED & PDDOC SET: " & OK

        For arrayIndex = 1 To UBound(arrayFilePaths)
            numPages = primaryDoc.GetNumPages() - 1

            Set sourceDoc = CreateObject("AcroExch.PDDoc")
            OK = sourceDoc.Open(arrayFilePaths(arrayIndex))
            Debug.Print "SOURCE DOC OPENED & PDDOC SET: " & OK

            numberOfPagesToInsert = sourceDoc.GetNumPages

            OK = primaryDoc.InsertPages(numPages, sourceDoc, 0, numberOfPagesToInsert, False)
            Debug.Print "PAGES INSERTED SUCCESSFULLY: " & OK

            OK = primaryDoc.Save(PDSaveFull, arrayFilePaths(0))
            Debug.Print "PRIMARYDOC SAVED PROPERLY: " & OK

            Set sourceDoc = Nothing
        Next arrayIndex

        Set primaryDoc = Nothing
        app.Exit
        Set app = Nothing
        MsgBox "DONE"
    End Sub

【问题讨论】:

  • 添加 .Value 这样 vba 不会尝试放入范围本身,而是放入数组中的值。
  • @ScottCraner ,仍然出现同样的错误,这是我的新行 arrayFilePaths = Range("G4:G5").Value
  • @ScottCraner 没有 Set 关键字,如果没有指定成员,它始终是类的默认属性:)
  • arrayFilePaths = Range("G4:G5").Value设置数组的第一个位置可能是1而不是0
  • @ScottCraner 但是arrayFilePaths = Range("G4:G5").Value 生成一个二维数组,所以第一个元素实际上是arrayFilePaths(1, 1) 或者你需要转置它。

标签: vba excel


【解决方案1】:

我现在使用集合来简化操作,而不是使用数组。此外,我将保存文件移到循环之外,这样我们就不会在每次插入时都保存文件。

您的主文档的路径,也就是您将插入的路径,已设置为索引 1。for each cell in range 循环将为您要插入该主文档的文件添加路径索引 2。

我还稍微修改了错误消息(告诉你它失败的索引)

Sub main()

    Set app = CreateObject("Acroexch.app")

    Dim FilePaths As Collection
    Set FilePaths = New Collection

    FilePaths.Add "PRIMARY DOC PATHWAY HERE"

    Dim cell As Range
    For Each cell In Range("G4:G5")
        FilePaths.Add cell.Value
    Next cell

    Set primaryDoc = CreateObject("AcroExch.PDDoc")
    OK = primaryDoc.Open(FilePaths(1))
    Debug.Print "PRIMARY DOC OPENED & PDDOC SET: " & OK

    For colIndex = 2 To FilePaths.Count
        numPages = primaryDoc.GetNumPages() - 1

        Set sourceDoc = CreateObject("AcroExch.PDDoc")
        OK = sourceDoc.Open(FilePaths(colIndex))
        Debug.Print "(" & colIndex & ") SOURCE DOC OPENED & PDDOC SET: " & OK

        numberOfPagesToInsert = sourceDoc.GetNumPages

        OK = primaryDoc.InsertPages(numPages, sourceDoc, 0, numberOfPagesToInsert, False)
        Debug.Print "(" & colIndex & ") PAGES INSERTED SUCCESSFULLY: " & OK

        Set sourceDoc = Nothing
    Next colIndex

    OK = primaryDoc.Save(PDSaveFull, FilePaths(1))
    Debug.Print "PRIMARYDOC SAVED PROPERLY: " & OK

    Set primaryDoc = Nothing
    app.Exit
    Set app = Nothing
    MsgBox "DONE"
End Sub

【讨论】:

  • 谢谢 1) 但是我现在该如何保存呢?由于它没有打开,也许saveas 会起作用吗? 2)我可以只将路径添加到 G 列,它会选择它们吗?当然,我必须手动扩展 G4:GX 。
  • 脚本仍在循环外保存,请查看代码底部。您可以进行 lastRow 搜索以创建动态范围。
  • 是的,但 pdf 不再保存,它只是在进行合并但看不到结果。
  • 它对我有用。确保将 FilePaths.Add "PRIMARY DOC PATHWAY HERE" 替换为您的实际主文档文件路径。或者将它放在添加到 filePaths 集合的范围内并删除该行
  • 很好用。关于它的好处我也许可以在 'PRIMARY DOC PATHWAY HERE' 中放一个新的 /blank pdf,这样原始 pdf 就不会被覆盖。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 2015-08-07
  • 2017-06-16
  • 2014-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多