Ms access 在VBA中打开特定页码上的PDF

Ms access 在VBA中打开特定页码上的PDF,ms-access,vba,Ms Access,Vba,我试图在我的访问表单上创建一个按钮,允许用户查看表单中数据对应的页面(在这种情况下,表单上会显示零件号,我希望该按钮打开零件标准文件以显示所述零件的蓝图/图表) 我曾尝试在文件路径的末尾使用Adobe的页面参数#page=pagenum,但这样做不起作用 这是我的代码(基本的,我知道),但我正试图找出在这里去哪里。出于显而易见的原因,我简化了我的文件路径——注意:这不是一个URL,而是一个文件路径 Private Sub Command80_Click() Dim loc As Str

我试图在我的访问表单上创建一个按钮,允许用户查看表单中数据对应的页面(在这种情况下,表单上会显示零件号,我希望该按钮打开零件标准文件以显示所述零件的蓝图/图表)

我曾尝试在文件路径的末尾使用Adobe的页面参数#page=pagenum,但这样做不起作用

这是我的代码(基本的,我知道),但我正试图找出在这里去哪里。出于显而易见的原因,我简化了我的文件路径——注意:这不是一个URL,而是一个文件路径

Private Sub Command80_Click()

    Dim loc As String 'location of file

    'loc = Me.FileLoc
    loc = "G:\*\FileName.pdf#page=1"

    Debug.Print loc
    'Debug.Print Me.FileLoc
    'Debug.Print Me.FileName

    Application.FollowHyperlink loc

End Sub
这样做可能吗?我将继续阅读其他用户的帖子,希望找到一个解决方案,如果我真的找到了,我会在这里记下

谢谢

更新

我已经找到了一个方法,只是我现在有一个小的并发症。我的数据库将被许多用户访问,可能使用不同版本的Acrobat或不同的位置。这是我的工作代码:

现在,我关心的是。此代码从特定文件路径打开AcroRd32.exe,如果我的用户将此文件存储在其他位置或具有不同的版本,则此代码将不起作用。有没有人对如何绕过这一点提出建议

再次感谢!:)

正确的方法可能是在系统注册表中查找acrobat reader可执行文件的位置。我发现这通常比它的价值更麻烦,特别是如果我可以控制我的程序将要安装的所有位置(例如,在一个内部网中)。通常我会使用我写的这个函数:

'---------------------------------------------------------------------------------------
' Procedure : FirstValidPath
' Author    : Mike
' Date      : 5/23/2008
' Purpose   : Returns the first valid path found in a list of potential paths.
' Usage     : Useful for locating files or folders that may be in different locations
'               on different users' computers.
' Notes     - Directories must be passed with a trailing "\" otherwise the function
'               will assume it is looking for a file with no extension.
'           - Returns Null if no valid path is found.
' 5/6/11    : Accept Null parameters.  If all parameters are Null, Null is returned.
'---------------------------------------------------------------------------------------
'
Function FirstValidPath(ParamArray Paths() As Variant) As Variant
Dim i As Integer

    FirstValidPath = Null
    If UBound(Paths) - LBound(Paths) >= 0 Then
        For i = LBound(Paths) To UBound(Paths)
            If Not IsNull(Paths(i)) Then
                If Len(Dir(Paths(i))) > 0 Then
                    FirstValidPath = Paths(i)
                    Exit For
                End If
            End If
        Next i
    End If

End Function
该函数采用一个参数数组,因此您可以根据需要传递任意多条或任意少条路径:

PathToUse = FirstValidPath("C:\Program Files\Adobe\Reader 9.0\Reader\AcroRd32.exe", _
                           "C:\Program Files\Acrobat\Reader.exe", _
                           "C:\Program Files (x86)\Acrobat\Reader.exe", _
                           "C:\Program Files\Acrobat\12\Reader.exe")
pat1 = """" & PathToUse & """"

我记得Acrobat reader曾经包含一些ActiveX PDF reader对象,可供Microsoft Office进一步使用。其他公司也开发了类似的产品,其中一些(基本形式)甚至可以免费获得


这可能是个解决办法,不是吗?然后,您必须检查activeX PDF阅读器在其方法中是否支持直接页面访问,并将其与应用程序一起分发,或者将其安装在用户的计算机上。它将避免与acrobat readers版本后续相关的所有开销,特别是当市场上有新版本时,您需要更新客户端界面

注册表项是更好的方法,与文件位置不同,它们在系统之间具有一致性

下面是三个函数,两个支持一个,以及一个测试函数的宏

GetARE()(获取Adobe Reader可执行文件)根据作为参数传递的预定义位置中的版本搜索返回正确的路径。这样就省去了为每个版本键入许多不同关键位置的麻烦,并且在将来的版本发布并安装到用户系统上时提供了一定的覆盖范围

我已经安装了以前版本的Reader,以测试InstallPath密钥位置是否一致,直到非常过时的版本为止。事实上,Mwolfe2和我的钥匙都在同一个位置,尽管我使用的是版本11,而他在撰写本文时使用的是版本10。我只能在x64系统上测试这一点,但您可以轻松修改下面的代码来搜索x64和x86密钥。我希望像Adobe这样的大公司能够坚持他们的惯例,所以即使在新版本的Reader发布时,这种做法也可能会在相当长的一段时间内不做太多修改

我写得很快,希望在命名约定方面效率低下和不一致

确实,确保几乎总是返回路径的最佳方法是使用“*/Acrobat Reader/XX.YY/InstallPath/”在循环中通过VBA运行注册表搜索,以查找版本号,然后在适当的目录中检查适当的候选文件,包括可执行文件;然而,这并不是一个非常划算的解决方案。我的测试表明,在安装路径的位置以及可执行文件的名称方面,版本之间有相当大的一致性,因此我选择了更高效但不持久的方法

RegKeyRead()RegKeyExists()取自:

我没有修改他们的代码。考虑到感谢那篇文章的作者,代码并不复杂,但它确实帮我省去了自己编写代码的麻烦

Function RegKeyRead(i_RegKey As String) As String
Dim myWS As Object

  On Error Resume Next
  'access Windows scripting
  Set myWS = CreateObject("WScript.Shell")
  'read key from registry
  RegKeyRead = myWS.RegRead(i_RegKey)
End Function
Function RegKeyExists(i_RegKey As String) As Boolean
Dim myWS As Object

  On Error GoTo ErrorHandler
  'access Windows scripting
  Set myWS = CreateObject("WScript.Shell")
  'try to read the registry key
  myWS.RegRead i_RegKey
  'key was found
  RegKeyExists = True
  Exit Function

ErrorHandler:
  'key was not found
  RegKeyExists = False
End Function
Function GetARE(i_RegKey As String) As String
    Dim InPath As String
    Dim InKey As String
    Dim Ind As Integer
    Dim PriVer As String
    Dim SubVer As String
    Dim Exists As Boolean

    Exists = False

    PriVer = 1
    SubVer = 0

    For Ind = 1 To 1000
        If SubVer > 9 Then
            PriVer = PriVer + 1
            SubVer = 0
        End If

        Exists = RegKeyExists(i_RegKey + "\" + PriVer + "." + SubVer + "\InstallPath\")
        SubVer = SubVer + 1

        If Exists = True Then
            SubVer = SubVer - 1
            InKey = i_RegKey + "\" + PriVer + "." + SubVer + "\InstallPath\"
            InPath = RegKeyRead(InKey)
            GetARE = InPath + "\AcroRd32.exe"
            Exit For
        End If
    Next     
End Function


Sub test()
    Dim rando As String

    rando = GetARIP("HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Adobe\Acrobat Reader")

    MsgBox (rando)
End Sub

为了补充mwolfe02的答案,这里有一个函数尝试检索给定文件类型的可执行文件(它还使用注册表命令):

产出:

"C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe" "%1"

您只需将“%1”替换为要打开的文件,并添加所需的任何参数。

以下是您可能使用的代码

Private Sub CommandButton3_Click()

  Dim strFile As String

  R = 0

  If TextBox7 = "CL" Then
    R = 2
    ' Path and filename of PDF file
    strFile = "E:\Users\Test\Cupertino Current system.pdf"
    ActiveWorkbook.FollowHyperlink strFile
  End If

  if R = 0 Then
    MsgBox "Wrong Code"
    ComboBox1 = ""
    TextBox1 = Empty
    'ComboBox1.SetFocus
  End If

End Sub

只需要走正确的路。。希望这能帮助你

哇,这真是太棒了Mwolfe2-但这难道不需要我知道他们可能在那里安装了Adobe Reader的所有路径吗?如果是这样的话,这对我来说并不是一个好方法——因为我的办公室大概平均有300或400名员工,而且知道他们安装的每一条路径也可能是不可能的。这是一个非常酷的功能,尽管如此!正如我在回答中提到的,这将取决于您对设置的控制程度。如果是公司设置,那么这300-400名员工可能只在5或6个独特的位置安装了Acrobat reader。另一种方法是通过注册表查找可执行文件的位置。例如,在我的计算机上,注册表项是:HKEY\U LOCAL\U MACHINE\SOFTWARE\Wow6432Node\Adobe\Acrobat Reader\10.0\InstallPath。acrobat reader的问题是您必须考虑不同的版本。以及x64/x86的差异。您可能会检查与中相同数量的注册表项
Debug.Print GetShellFileEx("PDF")
"C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe" "%1"
Private Sub CommandButton3_Click()

  Dim strFile As String

  R = 0

  If TextBox7 = "CL" Then
    R = 2
    ' Path and filename of PDF file
    strFile = "E:\Users\Test\Cupertino Current system.pdf"
    ActiveWorkbook.FollowHyperlink strFile
  End If

  if R = 0 Then
    MsgBox "Wrong Code"
    ComboBox1 = ""
    TextBox1 = Empty
    'ComboBox1.SetFocus
  End If

End Sub