Открытие PDF на конкретный номер страницы в VBA - PullRequest
2 голосов
/ 15 июня 2011

Я пытаюсь создать кнопку в форме доступа, которая позволяет пользователю просматривать соответствующую страницу, содержащую данные в форме (в этом случае номер формы отображается в форме, и я хочу, чтобыкнопка, чтобы открыть файл Part Standard для отображения чертежа / схемы указанной детали)

Я попытался использовать параметры страницы 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

Возможно ли это сделать таким образом?Я буду продолжать читать сообщения других пользователей в надежде найти решение, и я отмечу здесь, если найду его.

Спасибо!

Обновление

Я нашел способ сделать это, просто у меня есть 1 небольшое осложнение сейчас.Моя база данных будет доступна многим пользователям, возможно, с разными версиями 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 из определенного пути к файлу, если мои пользователи хранят его в другом месте или имеют другую версию, это не будет работать.У кого-нибудь есть предложения, как это обойти?

Еще раз спасибо!:)

Ответы [ 5 ]

3 голосов
/ 15 июня 2011

Правильный способ сделать это, вероятно, найти местоположение исполняемого файла программы 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 голос
/ 07 ноября 2013

Ключи реестра - лучший путь, в отличие от расположения файлов, у них есть согласованность между системами.

Ниже приведены три функции, две для поддержки одной, и макрос, который проверяет функции.

GetARE () (получить исполняемый файл Adobe Reader) возвращает правильный путь на основе поиска версии в предварительно определенном месте, переданном в качестве аргумента.Это устраняет необходимость печатать много разных ключевых местоположений для каждой версии и обеспечивает определенную степень покрытия, если будущие версии будут выпущены и установлены в системе пользователя.

Я установил предыдущие версии Reader, чтобы проверить, действительно лиесть последовательность в расположении ключа InstallPath, вплоть до весьма устаревших версий.На самом деле, у нас с mwolfe02 оба ключа находятся в одном месте, хотя я использую версию 11, а он на момент написания статьи использовал 10. Я смог протестировать это только в системе x64, но вы можете легкоизмените приведенный ниже код для поиска ключей x64 и x86.Я ожидаю, что крупная корпорация, такая как Adobe, будет придерживаться своих соглашений, поэтому, вероятно, это будет работать довольно долго без особых изменений, даже когда будут выпущены новые версии Reader.

Я написал это быстро, ожидая неэффективности и непоследовательности всоглашения об именах.

Действительно, лучший способ гарантировать, что путь почти всегда возвращается, - просто запустить поиск в реестре через VBA в цикле для номеров версий, используя "* / Acrobat Reader / XX.YY / InstallPath /" изатем включение исполняемого файла на основе проверки соответствующего кандидата в соответствующий каталог;однако это не совсем экономичное решение.Мои тесты показали, что между версиями существует определенная согласованность в отношении того, где можно найти путь установки и каково имя исполняемого файла, поэтому я выбрал что-то более эффективное, но менее продолжительное.

RegKeyRead () и RegKeyExists () были взяты из:

http://vba -угол.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
0 голосов
/ 10 июня 2015

Вот код, который вы, вероятно, можете использовать ..

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

Просто нужно выбрать правильный путь .. Надеюсь, это поможет вам

0 голосов
/ 05 февраля 2014

Просто чтобы добавить ответ mwolfe02, вот функция, которая пытается получить исполняемый файл для данного типа файла (она также использует команды реестра, на которые ссылается Леви):

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" файлом, который вы хотите открыть, и добавить любые необходимые параметры.

0 голосов
/ 16 июня 2011

Я помню, что в Acrobat Reader использовался объект ActiveX PDF Reader, доступный для дальнейшего использования в Microsoft Office. Другие компании разработали аналогичные продукты, некоторые из них (в их основной форме) даже доступны бесплатно.

Это может быть решением, не так ли? Затем вам нужно проверить, поддерживает ли ваш PDF-ридер activeX прямой доступ к страницам в своих методах, и распространять его вместе с приложениями или установить на компьютеры вашего пользователя. Это избавит вас от всех накладных расходов, связанных с отслеживанием версий ридеров Acrobat, особенно когда новые версии будут доступны на рынке, и вам придется обновить свой клиентский интерфейс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...