循环不打开PDF ...所以复制/粘贴到Excel失败(我认为)

时间:2018-01-10 18:31:11

标签: excel-vba loops adobe acrobat vba

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

目标

  1. 循环浏览文件夹中的所有PDF
  2. 对于每个PDF:选择全部/复制/粘贴到Excel
  3. 调用单独的宏将粘贴的数据转换为某些内容 清晰可辨。
  4. 背景 下面的子[CopyPDFtoExcel()]昨天工作但现在在ActiveSheet.Paste行上失败了

      

    "运行时错误' 1004' Worksheet类的粘贴方法失败"。

    如果我继续(通过 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到最后的行如果......推测意味着它发现了一个 第一个循环期间的文件(虽然我没有看到PDF打开)。上 然后,SECOND(和所有后续循环)转到Else Debug.Assert False(但不显示错误对话框)。

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

    4. 重新启动计算机,同样的问题

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

    6. 主要代码

      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用于拉取文件路径

      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
      

2 个答案:

答案 0 :(得分:1)

我正在剪切/复制 - 最近粘贴麻烦(运行时错误1004) 使用最新的Excel,但也在使用#34;古代"应用。 对我来说,诀窍是如何使用原始的"给予"名称 (Sheet1,Sheet2等。一旦我添加/重命名相同的工作表,运行时错误就会恢复。

答案 1 :(得分:0)

如果您想确保在打开操作失败时生成错误,我会在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会等待一秒钟。