VBA宏调用Adobe Acrobat Pro打开PDF报错:文件无法找到
解决VBA调用Acrobat打开PDF时报错“文件无法找到”的问题
核心报错原因
你的代码直接拼接Acrobat路径与PDF路径,当PDF路径包含空格(比如D:\PDF Files\sample.pdf)时,命令行工具会将空格后的内容识别为独立参数,导致Acrobat无法读取完整的PDF路径,从而抛出“文件无法找到”的错误。
快速修复方案
给PDF路径包裹双引号,确保命令行将整个路径视为一个完整参数,修改Shell调用的代码行即可:
Shell READERPath & """" & PDFPath & """", vbNormalFocus: DoEvents
修改后的完整代码
Sub Get_Pdf() Dim XLName As String, PDFPath As String, READERPath As String Dim sh As Worksheet XLName = ThisWorkbook.Name Set sh = ThisWorkbook.Sheets(1) PDFPath = Application.GetOpenFilename(filefilter:="PDF file (*.pdf), *.pdf") If UCase(PDFPath) = "FALSE" Then Exit Sub ' 根据你的Acrobat版本调整路径 READERPath = "C:\Program Files\Adobe\Acrobat DC\Acrobat\Acrobat.exe" ' 给PDF路径添加双引号,处理含空格的路径 Shell READERPath & """" & PDFPath & """", vbNormalFocus: DoEvents Application.Wait Now + TimeValue("00:00:2") SendKeys "^a", True Application.Wait Now + TimeValue("00:00:2") SendKeys "^c" Application.Wait Now + TimeValue("00:00:2") Windows(XLName).Activate sh.Paste sh.Range("A1") SendKeys "%{F4}", True End Sub
更稳定的替代方案(避免SendKeys)
SendKeys和Application.Wait依赖系统延迟,稳定性差。建议直接通过Acrobat的COM对象操作PDF,无需手动打开窗口:
Sub GetPdfViaAcrobatCOM() Dim acroApp As Object Dim acroAVDoc As Object Dim acroPDDoc As Object Dim PDFPath As String Dim sh As Worksheet Set sh = ThisWorkbook.Sheets(1) PDFPath = Application.GetOpenFilename(filefilter:="PDF file (*.pdf), *.pdf") If UCase(PDFPath) = "FALSE" Then Exit Sub ' 创建Acrobat应用对象 Set acroApp = CreateObject("AcroExch.App") Set acroAVDoc = CreateObject("AcroExch.AVDoc") ' 打开PDF文档 If acroAVDoc.Open(PDFPath, "") Then Set acroPDDoc = acroAVDoc.GetPDDoc() ' 获取PDF文本内容 Dim pageNum As Integer Dim textContent As String For pageNum = 0 To acroPDDoc.GetNumPages() - 1 Dim acroPage As Object Set acroPage = acroPDDoc.AcquirePage(pageNum) Dim acroTextSelect As Object Set acroTextSelect = acroPage.CreateTextSelect(0, acroPage.GetNumChars() - 1) textContent = textContent & acroTextSelect.GetText() & vbCrLf Next pageNum ' 将文本粘贴到工作表 sh.Range("A1").Value = textContent ' 关闭文档和应用 acroAVDoc.Close True acroApp.Exit End If ' 释放对象 Set acroTextSelect = Nothing Set acroPage = Nothing Set acroPDDoc = Nothing Set acroAVDoc = Nothing Set acroApp = Nothing End Sub
注意事项
- 使用COM对象需要确保Acrobat Pro已安装,且在VBA编辑器中勾选了Adobe Acrobat xx.x Type Library(路径:工具→引用)
- 若找不到该引用,用
CreateObject的方式(如上代码)也可正常运行
内容的提问来源于stack exchange,提问作者Siraj
相关产品推荐
相关产品推荐

