【发布时间】:2018-01-10 18:31:10
【问题描述】:
提前为这篇文章的篇幅道歉,但我想详细描述我的问题,希望你们中的一位 VBA 大师可以提供帮助
目标
- 循环浏览文件夹中的所有 PDF
- 对于每个 PDF:全选/复制/粘贴到 Excel 中
- 调用单独的宏将粘贴的数据转换成东西 清晰易读。
背景 下面的子 [CopyPDFtoExcel()] 昨天工作,但现在在 ActiveSheet.Paste 行上失败了
“工作表类的运行时错误'1004'粘贴方法失败”。
如果我跳过(通过 F8),它似乎实际上并未打开 PDF,因此无法选择全部/复制/粘贴,从而产生运行时错误。但是,我没有收到错误对话框,如果找不到文件,我想我会收到(来自Debug.Assert False)。
我的 fName 通过名为 path2008 的命名范围定义为变量。这些文件路径是通过运行PullFilePathsforPDFs() 导出的,它会为我的文件夹中的每个 PDF 输出完整的文件路径。然后,我选择了这些文件路径并为其命名,在本例中为 path2008,用于 13 个不同的 PDF。 注意:这个文件夹中实际上有 250 多个 PDF,但我选择了一个子集进行测试,因此有 13 个与 path2008 相关联。
到目前为止我做了什么
-
测试了 path2008 范围内每个 PDF 的文件路径 (繁琐的非循环)ActiveWorkbook.FollowHyperlink 方法, 成功打开所有PDF。所以,我非常有信心 文件路径正确。
'ActiveWorkbook.FollowHyperlink "file path here" 去掉全选/复制/粘贴 VBA 代码,只留下 循环 [参见子 TroubleshootingOpeningPDFLoop()]。当我踏 通过第一次黄线从 Set oPDDoc = oAVDoc.GetPDDoc 行到 End If.... 可能意味着它找到了一个 在第一个循环期间文件(尽管我没有看到 PDF 打开)。在 第二个(以及所有后续循环)然后转到 Else Debug.Assert False(但不出现错误对话框)。
重新启动 Excel 和 Acrobat,同样的问题
重启电脑,同样的问题
重新创建了一个新工作簿,同样的问题
主要代码
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