我正在尝试在我的访问表单上创建一个按钮,允许用户查看与表单中的数据一致的相应页面(在这种情况下,表单上显示了部件号,我想要按钮打开零件标准文件以显示所述零件的蓝图/图表
我尝试在文件路径末尾使用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或不同的位置。这是我的工作代码:
Private Sub Command2_Click()
pat1 = """C:\Program Files\Adobe\Reader 9.0\Reader\AcroRd32.exe"""
pat2 = "/A ""page=20"""
pat3 = """G:\*\FileName.pdf"""
Shell pat1 & " " & pat2 & " " & pat3, vbNormalFocus
End Sub
现在,这是我的担忧。此代码从特定文件路径打开AcroRd32.exe,如果我的用户将其存储在其他地方或具有不同的版本,则无法使用。有没有人建议如何解决这个问题?
再次感谢! :)
答案 0 :(得分:3)
正确的方法可能是在系统注册表中查找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 & """"
答案 1 :(得分:1)
注册表项是更好的方法,与文件位置不同,它们在系统之间具有一致性。
下面是三个函数,两个支持一个函数,以及一个测试函数的宏。
GetARE() (Get Adobe Reader Executable)根据作为参数传递的预定义位置中的版本搜索返回正确的路径。这消除了为每个版本键入许多不同密钥位置的麻烦,并且如果将来的版本发布并安装在用户的系统上,则会提供一定的覆盖范围。
我已经安装了以前版本的Reader来测试InstallPath密钥位置是否存在一致性,直到相当过时的版本为止。事实上,mwolfe02和我都将我们的密钥放在同一个位置,虽然我使用的是版本11,但在撰写本文时,他使用的是10.我只能在x64系统上测试它,但你可以轻松地修改下面的代码以搜索x64和x86密钥。我希望像Adobe这样的大公司能够坚持他们的惯例,所以即使新版本的Reader发布,这项工作也可能会有一段时间没有太多修改。
我写得很快,期望命名约定效率低下和不一致。
确保路径几乎总是返回的最佳方法是使用“* / Acrobat Reader / XX.YY / InstallPath /”在版本号的循环中通过VBA简单地运行注册表搜索,然后包括基于在适当目录中检查适当候选者的可执行文件;然而,这不是一个非常具有成本效益的解决方案。我的测试表明,版本之间存在很大的一致性,可以找到安装路径的位置,以及可执行文件的名称,所以我选择了更有效的东西,如果不那么持久。
RegKeyRead() 和 RegKeyExists() 取自:
http://vba-corner.livejournal.com/3054.html
我没有修改他们的代码。考虑到感谢该帖子的作者,代码并不复杂,但它确实让我省去了自己编写代码的麻烦。
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
答案 2 :(得分:0)
我记得Acrobat reader曾经包含一些ActiveX PDF阅读器对象,可以与Microsoft Office一起使用。其他公司开发了类似的产品,其中一些(基本形式)甚至免费提供。
那可能是一个解决方案,不是吗?然后,您必须检查您的activeX PDF阅读器是否支持其方法中的直接页面访问,并将其与您的应用程序一起分发,或者将其安装在用户的计算机上。它将避免与acrobat reader版本后续相关的所有开销,特别是当市场上有新版本并且您必须更新客户端界面时。
答案 3 :(得分:0)
只是为了添加到mwolfe02的答案,这里有一个函数试图检索给定文件类型的可执行文件(它还使用注释引用的Levy命令):
Function GetShellFileCommand(FileType As String, Optional Command As String)
Const KEY_ROOT As String = "HKEY_CLASSES_ROOT\"
Dim sKey As String, sProgramClass As String
' All File Extensions should start with a "."
If Left(FileType, 1) <> "." Then FileType = "." & FileType
' Check if the File Extension Key exists and Read the default string value
sKey = KEY_ROOT & FileType & "\"
If RegKeyExists(sKey) Then
sProgramClass = RegKeyRead(sKey)
sKey = KEY_ROOT & sProgramClass & "\shell\"
If RegKeyExists(sKey) Then
' If no command was passed, check the "shell" default string value, for a default command
If Command = vbNullString Then Command = RegKeyRead(sKey)
' If no Default command was found, default to "Open"
If Command = vbNullString Then Command = "Open"
' Check for the command
If RegKeyExists(sKey & Command & "\command\") Then GetShellFileCommand = RegKeyRead(sKey & Command & "\command\")
End If
End If
End Function
所以,
Debug.Print GetShellFileEx("PDF")
输出:
"C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe" "%1"
,您只需将“%1”替换为您要打开的文件,然后添加所需的任何参数。
答案 4 :(得分:0)
以下是您可以使用的代码..
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
只需要正确的道路..希望这可以帮助你