为这篇文章的篇幅提前道歉,但我想详细描述我的问题,希望你们中的一位VBA大师可以提供帮助
目标
背景 下面的子[CopyPDFtoExcel()]昨天工作但现在在ActiveSheet.Paste行上失败了
"运行时错误' 1004' Worksheet类的粘贴方法失败"。
如果我继续(通过 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到最后的行如果......推测意味着它发现了一个 第一个循环期间的文件(虽然我没有看到PDF打开)。上 然后,SECOND(和所有后续循环)转到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用于拉取文件路径
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
答案 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会等待一秒钟。