【问题标题】:Loop not opening PDFs...so copy/Paste to Excel fails (I think)循环不打开 PDF ......所以复制/粘贴到 Excel 失败(我认为)
【发布时间】:2018-01-10 18:31:10
【问题描述】:

提前为这篇文章的篇幅道歉,但我想详细描述我的问题,希望你们中的一位 VBA 大师可以提供帮助

目标

  1. 循环浏览文件夹中的所有 PDF
  2. 对于每个 PDF:全选/复制/粘贴到 Excel 中
  3. 调用单独的宏将粘贴的数据转换成东西 清晰易读。

背景 下面的子 [CopyPDFtoExcel()] 昨天工作,但现在在 ActiveSheet.Paste 行上失败了

“工作表类的运行时错误'1004'粘贴方法失败”。

如果我跳过(通过 F8),它似乎实际上并未打开 PDF,因此无法选择全部/复制/粘贴,从而产生运行时错误。但是,我没有收到错误对话框,如果找不到文件,我想我会收到(来自Debug.Assert False)。

我的 fName 通过名为 path2008 的命名范围定义为变量。这些文件路径是通过运行PullFilePathsforPDFs() 导出的,它会为我的文件夹中的每个 PDF 输出完整的文件路径。然后,我选择了这些文件路径并为其命名,在本例中为 path2008,用于 13 个不同的 PDF。 注意:这个文件夹中实际上有 250 多个 PDF,但我选择了一个子集进行测试,因此有 13 个与 path2008 相关联。

到目前为止我做了什么

  1. 测试了 path2008 范围内每个 PDF 的文件路径 (繁琐的非循环)ActiveWorkbook.FollowHyperlink 方法, 成功打开所有PDF。所以,我非常有信心 文件路径正确。

    'ActiveWorkbook.FollowHyperlink "file path here" 
    
  2. 去掉全选/复制/粘贴 VBA 代码,只留下 循环 [参见子 TroubleshootingOpeningPDFLoop()]。当我踏 通过第一次黄线从 Set oPDDoc = oAVDoc.GetPDDoc 行到 End If.... 可能意味着它找到了一个 在第一个循环期间文件(尽管我没有看到 PDF 打开)。在 第二个(以及所有后续循环)然后转到 Else Debug.Assert False(但不出现错误对话框)。

  3. 重新启动 Excel 和 Acrobat,同样的问题

  4. 重启电脑,同样的问题

  5. 重新创建了一个新工作簿,同样的问题

主要代码

Sub CopyPDFtoExcel()
Dim fName       As Variant
Dim wbPayroll As Excel.Workbook
Dim wsConvert       As Excel.Worksheet
Dim oPDFApp     As AcroApp
Dim oAVDoc      As AcroAVDoc
Dim oPDDoc      As AcroPDDoc

Set wbPayroll = Workbooks("Payroll.xlsm")
Set wsConvert= wbPayroll.Sheets("Convert")

Set oPDFApp = CreateObject("AcroExch.App")
Set oAVDoc = CreateObject("AcroExch.AVDoc")
Set oPDDoc = CreateObject("AcroExch.PDDoc")

'Open the PDF file. The AcroAVDoc.Open function returns a true/false 
For Each fName In Range("path2008")
If oAVDoc.Open(fName.Text, "") = True Then
    Set oPDDoc = oAVDoc.GetPDDoc
Else
    Debug.Assert False
End If

'Copy all using Acrobat menu
oPDFApp.MenuItemExecute ("SelectAll")
oPDFApp.MenuItemExecute ("Copy")

'Paste into Convert sheet
wbPayroll.Activate
wsConvert.Cells(1, 1).Select
ActiveSheet.Paste 'It worked yesterday, but now error on this line with below error
'Runtime error '1004' Paste method of Worksheet class failed

oAVDoc.Close (1)    '(1)=Do not save changes
'oPDDoc.Close
Call ConversionMacro
Next

'Clean up
Set wbTransfer = Nothing
Set wsNew = Nothing
Set oPDFApp = Nothing
Set oAVDoc = Nothing
Set oPDDoc = Nothing
End Sub

我努力隔离 PDF 打开失败问题

Sub TroubleshootingOpeningPDFLoop()
Dim fName       As Variant
Dim wbPayroll As Excel.Workbook
Dim wsConvert       As Excel.Worksheet
Dim oPDFApp     As AcroApp
Dim oAVDoc      As AcroAVDoc
Dim oPDDoc      As AcroPDDoc

'Define your spreadsheet
Set wbPayroll = Workbooks("Payroll.xlsm")
Set wsConvert= wbPayroll.Sheets("Convert")

'Instantiate Acrobat Objects
Set oPDFApp = CreateObject("AcroExch.App")
Set oAVDoc = CreateObject("AcroExch.AVDoc")
Set oPDDoc = CreateObject("AcroExch.PDDoc")

'Open the PDF file. The AcroAVDoc.Open function returns a true/false 
For Each fName In Range("path2008")
If oAVDoc.Open(fName.Text, "") = True Then
    Set oPDDoc = oAVDoc.GetPDDoc
Else
    Debug.Assert False
End If
Next
End Sub

用于拉取文件路径的子

Sub PullFilePathsforPDFs()
Dim objFSO As Object
Dim objFolder As Object
Dim objFile As Object
Dim i As Long
Set objFSO = CreateObject("Scripting.FileSystemObject")
'Get the folder object
Set objFolder = objFSO.GetFolder("D:\Stuff\MoreStuff") 'all PDFs I need are stored here
i = 1
For Each objFile In objFolder.Files
Cells(i + 1, 1) = objFile.Name
Cells(i + 1, 2) = objFile.Path
i = i + 1
Next objFile
End Sub

【问题讨论】:

    标签: excel loops adobe acrobat vba


    【解决方案1】:

    我最近遇到剪切/复制粘贴问题(运行时错误 1004) 使用最新的 Excel,但也使用“古老”的应用程序。 对我来说,诀窍是使用原始的“给定”名称 (Sheet1、Sheet2 等。我添加/重命名相同的工作表后,运行时错误又回来了。

    【讨论】:

      【解决方案2】:

      如果要确保在打开操作不成功时产生错误,我会在 TroubleshootingOpeningPDFLoop 的末尾添加以下内容:

      If oPDDoc is nothing then
          Debug.Assert False
      End If
      

      如果这没有返回错误,则表示该文件已在应用程序中打开,但不可见。这可能是因为您使用的是 PDDoc 而不是 AVDoc。因此,切换 2 可能会让您在调试时看到它。

      就您的主要问题而言,这可能是由于 Acrobat 处理命令的速度不够快,您需要在代码中包含一些等待时间,以让 Acrobat 有足够的时间来处理命令。例如,您可以:

      'Copy all using Acrobat menu
      oPDFApp.MenuItemExecute ("SelectAll")
      Application.Wait TimeSerial(Hour(Now()), Minute(Now()), Second(Now()) + 1)
      oPDFApp.MenuItemExecute ("Copy")
      

      这将使 VBA 在运行下一个命令之前等待一秒钟。

      【讨论】:

      • 当我在 SelectAll 和 Copy 之间添加 Application.Wait 命令时,它最终将 Application.Wait 命令粘贴到我的工作表的 A1 中,而不是 PDF 的内容...我哪里出错了在这里?
      • 这可能是因为你刚刚从这个问题中复制了它,它仍然在你的剪贴板中。这可能意味着oPDFApp.MenuItemExecute ("Copy") 没有正确注册或类似的东西。通过代码进行调试(使用 F8)时,您是否看到 Acrobat 应用程序出现在屏幕上?
      猜你喜欢
      • 1970-01-01
      • 2015-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-20
      • 1970-01-01
      相关资源
      最近更新 更多