【问题标题】:VBA PDF TO EXCEL "Can't find project or Library"VBA PDF TO EXCEL“找不到项目或库”
【发布时间】:2016-11-22 15:35:51
【问题描述】:

我不确定将 PDF 放在计算机上的哪个位置,我需要将文件放在某个路径中,但我不确定如何执行此操作或更改我在网上找到的这段代码。

它在最小点给了我一个错误,但我不确定在代码中的哪个位置可以实际更改路径,或者我不确定路径在哪里甚至可以放置 pdf 文件

Option Explicit

'Constants used in API functions.
Public Const WM_SETTEXT = &HC
Public Const VK_RETURN = &HD
Public Const WM_KEYDOWN = &H100

Private Sub OpenPDF(strPDFPath As String, strPageNumber As String, strZoomValue As String)

    'Opens a PDF file to a specific page and with a specific zoom
    'using Adobe Reader Or Adobe Professional.
    'API functions are used to specify the necessary windows
    'and send the page and zoom info to the Adobe window.

    'By Christos Samaras
    'http://www.myengineeringworld.net

    Dim strPDFName                  As String
    Dim lParent                     As Long
    Dim lFirstChildWindow           As Long
    Dim lSecondChildFirstWindow     As Long
    Dim lSecondChildSecondWindow    As Long
    Dim dtStartTime               As Date

    'Check if the PDF path is correct.
    If FileExists(strPDFPath) = False Then
        MsgBox "The PDF path is incorect!", vbCritical, "Wrong path"
        Exit Sub
    End If

    'Get the PDF file name from the full path.
    On Error Resume Next
    strPDFName = Mid(strPDFPath, InStrRev(strPDFPath, "\") + 1, Len(strPDFPath))
    On Error GoTo 0

    'The following line depends on the apllication you are using.
    'For Word:
    'ThisDocument.FollowHyperlink strPDFPath, NewWindow:=True
    'For Power Point:
    'ActivePresentation.FollowHyperlink strPDFPath, NewWindow:=True
    'Note that both Word & Power Point pop up a security window asking
    'for access to the specified PDf file.
    'For Access:
    'Application.FollowHyperlink strPDFPath, NewWindow:=True
    'For Excel:
    ThisWorkbook.FollowHyperlink strPDFPath, NewWindow:=True
    'Find the handle of the main/parent window.
    dtStartTime = Now()
    Do Until Now() > dtStartTime + TimeValue("00:00:05")
        lParent = 0
        DoEvents
        'For Adobe Reader.
        lParent = FindWindow("AcrobatSDIWindow", strPDFName & " - Adobe Reader")
        'For Adobe Professional.
        'lParent = FindWindow("AcrobatSDIWindow", strPDFName & " - Adobe Acrobat Pro")
        If lParent <> 0 Then Exit Do
    Loop

    If lParent <> 0 Then

        'Bring parent window to the foreground (above other windows).
        SetForegroundWindow (lParent)

        'Find the handle of the first child window.
        dtStartTime = Now()
        Do Until Now() > dtStartTime + TimeValue("00:00:05")
            lFirstChildWindow = 0
            DoEvents
            lFirstChildWindow = FindWindowEx(lParent, ByVal 0&, vbNullString, "AVUICommandWidget")
            If lFirstChildWindow <> 0 Then Exit Do
        Loop

        'Find the handles of the two subsequent windows.
        If lFirstChildWindow <> 0 Then
            dtStartTime = Now()
            Do Until Now() > dtStartTime + TimeValue("00:00:05")
                lSecondChildFirstWindow = 0
                DoEvents
                lSecondChildFirstWindow = FindWindowEx(lFirstChildWindow, ByVal 0&, "Edit", vbNullString)
                If lSecondChildFirstWindow <> 0 Then Exit Do
            Loop

            If lSecondChildFirstWindow <> 0 Then

                'Send the zoom value to the corresponding window.
                SendMessage lSecondChildFirstWindow, WM_SETTEXT, 0&, ByVal strZoomValue
                PostMessage lSecondChildFirstWindow, WM_KEYDOWN, VK_RETURN, 0

                dtStartTime = Now()
                Do Until Now() > dtStartTime + TimeValue("00:00:05")
                    lSecondChildSecondWindow = 0
                    DoEvents
                    'Notice the difference in syntax between lSecondChildSecondWindow and lSecondChildFirstWindow.
                    'lSecondChildSecondWindow is the handle of the next child window after lSecondChildFirstWindow,
                    'while both windows have as parent window the lFirstChildWindow.
                    lSecondChildSecondWindow = FindWindowEx(lFirstChildWindow, lSecondChildFirstWindow, "Edit", vbNullString)
                    If lSecondChildSecondWindow <> 0 Then Exit Do
                Loop
                If lSecondChildSecondWindow <> 0 Then

                    'Send the page number to the corresponding window.
                    SendMessage lSecondChildSecondWindow, WM_SETTEXT, 0&, ByVal strPageNumber
                    PostMessage lSecondChildSecondWindow, WM_KEYDOWN, VK_RETURN, 0

                End If

            End If

        End If

    End If

End Sub

Function FileExists(strFilePath As String) As Boolean

    'Checks if a file exists.

    'By Christos Samaras
    'http://www.myengineeringworld.net

    On Error Resume Next
    If Not Dir(strFilePath, vbDirectory) = vbNullString Then FileExists = True
    On Error GoTo 0

End Function

Sub TestPDF()

    OpenPDF ThisWorkbook.Path & "\" & "Sample File.pdf", 6, 143

End Sub

【问题讨论】:

  • 最小点错误 - 最小点是什么?您还需要将FileName 传递给路径...OpenPDF ("C:\MyPDF.pdf","2","100")
  • 您在哪里声明了 API?
  • 我没有包括它们,但它们就在它们之上:
  • 'API 函数中使用的常量。公共常量 WM_SETTEXT = &HC 公共常量 VK_RETURN = &HD 公共常量 WM_KEYDOWN = &H100
  • 你复制代码的地方:myengineeringworld.net/2013/04/open-pdf-file-with-vba.html 有完美的代码。只需从 Option Explicit 开始复制到 End sub。不过只有一个建议,如果您不知道这里发生了什么,那么复制和粘贴代码有多明智?

标签: excel vba


【解决方案1】:

在目录 C:\Temp 中保存一个名为 abc.pdf 的 PDF 文件

向下滚动到代码底部,您会发现一个名为 `Test' 的子代码

确保代码看起来像这样

Sub TestPDF()

    OpenPDF "C:\Temp" & "\" & "abc.pdf", 1, 100

End Sub

【讨论】:

  • 我就是这样做的,它说编译错误:找不到项目或库
  • 在 MID 前面添加 VBA,VBA.Mid(strPDFPath, InStrRev(strPDFPath, "\") + 1, Len(strPDFPath)) 并检查是否缺少参考 undet Tools --> References。
  • 在 C:\Temp 中放置一个名为 abc.pdf 的 pdf 文件,从我的答案中复制代码并将其放入 TestPDF 并运行。
  • 我得到了同样的东西
猜你喜欢
  • 1970-01-01
  • 2021-03-26
  • 2019-06-30
  • 2017-02-09
  • 2010-10-05
  • 1970-01-01
  • 2017-06-26
  • 1970-01-01
相关资源
最近更新 更多