Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

pdf-Datei über Excel VBA öffnen

1,324 views
Skip to first unread message

Klaus Fierenz

unread,
Dec 19, 2005, 1:33:59 PM12/19/05
to
Hallo zusammen,

ich habe eine Excel Anwendung in der über ein Makro ein pdf Dokument
geöffnet werden soll.
Ich habe untenstehendes gebastelt, leider funktioniert es aber nicht so wie
es soll.
Wer kann mir einen Tipp geben, warum es nicht geht und mir weiterhelfen?
Eigentlich soll nur die Datei geöffnet werden und der Arobat Reader sollte
sich maximieren, so dass das Dokument sofort gelesen werden kann.

Hier der Code:
Sub Leitbild()
x = "Y:\Dateien\Alle\Leitbild\Test.pdf"
Call DateiOeffnen_PDF(x)
End Sub

Sub DateiOeffnen_PDF(x)
On Error Resume Next
If Dir(x, vbDirectory) = "" Then
MsgBox ("Sie haben keine Zugriffsrechte für diese Berichte.")
Else
ChDrive "y:\"
ChDir x
x = Application.GetOpenFilename
If Dir("C:\Programme\Adobe\Reader", vbDirectory) = "" Then
If Dir("C:\Programme\Adobe\Acrobat 6.0", vbDirectory) = "" Then
Shell "C:\Programme\Adobe\Acrobat 5.0\Reader\Acrord32.exe " & x
Else
Shell "C:\Programme\Adobe\Acrobat 6.0\Reader\Acrord32.exe " & x
End If
Else
Shell "C:\Programme\Adobe\Reader\Acrord32.exe " & x
Application.Dialogs(xlDialogOpen).Show x
End If
End If
End Sub

Danke für Eure Hilfe.

Viele Grüße, Klaus


Eike Bimczok

unread,
Dec 19, 2005, 3:04:22 PM12/19/05
to
Hallo Klaus,

der Aufruf mit der Shell funktioniert bei mir gut:

'____________________________________________
Sub test()
x = "C:\test.pdf"
dummy = Shell("C:\Programme\Adobe\Acrobat 5.0\Reader\Acrord32.exe " _
& x, vbMaximizedFocus)
End Sub
'____________________________________________

Was genau funktioniert denn nicht bei dir?

Für den Pfad der AcrobatReaders verwende diese Funktion:

'____________________________________________
Function getPath(basePath As String, myFileName As String) As String
'12-2005
'E.Bimczok

Set fs = Application.FileSearch

With fs
.LookIn = basePath
.fileName = myFileName
.SearchSubFolders = True
If .Execute > 0 Then
Set a = .FoundFiles
If a.Count > 0 Then
getPath = a.Item(1)
Else
getPath = ""
End If
End If
End With

End Function
'____________________________________________
Sub testfunc()
a = getPath("C:\Programme\Adobe", "Acrord32.exe")
End Sub
'____________________________________________


Gruß
Eike

Klaus Fierenz schrieb:

Klaus Fierenz

unread,
Dec 19, 2005, 4:14:13 PM12/19/05
to
Zunächst mal vielen Dank.
Ich kann es leider erst morgen im Geschäft richtig testen und mich morgen
Abend wieder melden.

Bisher hat sich die Datei nicht geöffnet, sondern es kam die Meldung, dass
ich keine Zugriffsrechte
auf die Datei hätte. Was ich aber habe.
Außerdem wurde der Acrobat Reader nie maximiert, sondern er blieb immer
klein in der Taskleiste
und mußte erst von dort maximiert werden.

Klaus


Michael Schwimmer

unread,
Dec 19, 2005, 7:25:17 PM12/19/05
to
Hallo Klaus,

"Klaus Fierenz" schrieb:


> ich habe eine Excel Anwendung in der über ein Makro ein pdf Dokument
> geöffnet werden soll.

du kannst die API ShellExecute verwenden. Damit wird eine Datei mit dem
verknüpften Programm gestartet. Das heißt, wenn Dateien mit der Endung
.pdf mit dem Acrobat-Reader verknüpft sind, werden diese mit dem
Programm geöffnet oder auch gedruckt, je nach dem, welche Möglichkeiten
als Verben in der Registry hinterlegt sind.

Private Declare Function ShellExecute Lib "shell32.dll" _
Alias "ShellExecuteA" (ByVal Fensterzugriffsnummer As Long, _
ByVal lpOperation_wie_Open_oder_Print As String, _
ByVal lpDateiname_incl_Pfad As String, _
ByVal lpZusätzliche_Startparameter As String, _
ByVal lpArbeitsverzeichnis As String, _
ByVal nGewünschte_Fenstergröße_der_Anwendung As Long) _
As Long

Private Const SW_HIDE = 0
Private Const SW_MAX = 10
Private Const SW_MAXIMIZE = 3
Private Const SW_MINIMIZE = 6
Private Const SW_NORMAL = 1
Private Const SW_SHOW = 5
Private Const SW_SHOWDEFAULT = 10
Private Const SW_SHOWMAXIMIZED = 3
Private Const SW_SHOWMINIMIZED = 2
Private Const SW_SHOWMINNOACTIVE = 7
Private Const SW_SHOWNORMAL = 1
Private Const SW_SHOWNOACTIVATE = 4

Sub Drucken()
ShellExecute 0&, "Print", "c:\Eigene Dateien\Asdf.doc", _
vbNullString, vbNullString, SW_SHOWMINNOACTIVE
End Sub

Sub Öffnen()
ShellExecute 0&, "Open", "Y:\Dateien\Alle\Leitbild\Test.pdf" , _
vbNullString, vbNullString, SW_SHOWNORMAL
End Sub

MfG
Michael


--
Michael Schwimmer http://michael-schwimmer.de
Excel VBA ISBN 3-8273-2183-2
Excel Programmierung - Das Handbuch ISBN 3-8606-3548-4

Klaus Fierenz

unread,
Dec 20, 2005, 12:27:29 PM12/20/05
to
Hallo zusammen,

danke für die Hilfe.
Also das Acrobat Fenster wird jetzt auf jeden Fall mal maximiert.
Aber was mir immer noch nicht gelingt ist, dass die Datei direkt geöffnet
wird.
Bei dem zweiten Vorschlag in der Gruppe geht es zwar, aber dort findet keine
Abfrage statt, dass immer die neueste Acrobat Reader Version geöffnet wird.

Habt ihr noch Ideen?

Danke.
Klaus


Michael Schwimmer

unread,
Dec 20, 2005, 2:54:40 PM12/20/05
to
Hallo Klaus,

"Klaus Fierenz" schrieb:


> Also das Acrobat Fenster wird jetzt auf jeden Fall mal maximiert.
> Aber was mir immer noch nicht gelingt ist, dass die Datei direkt
> geöffnet wird.

ich habe das eben bei mir probiert, die PDF-Datei wird sofort mit dem
Acrobat-Reader geöffnet. Wenn ein Doppelklick auf die Datei klappt,
sollte auch ShellExecute funzen.

Hast du vielleicht Leerzeichen im Pfad, dann setze den doch mal zwischen
zwei Anführungszeichen, obwohl das bei mir auch ohne funzt.

ShellExecute 0&,"Open","""C:\Pfad X\LM386.pdf""", _
vbNullString, vbNullString, SW_SHOWNORMAL

MfG

Michael Schwimmer

unread,
Dec 20, 2005, 3:57:56 PM12/20/05
to
Hallo Klaus

"Klaus Fierenz" schrieb:


> Also das Acrobat Fenster wird jetzt auf jeden Fall mal maximiert.
> Aber was mir immer noch nicht gelingt ist, dass die Datei direkt
> geöffnet wird.

du könntest mal nachschauen, was in der Registry unter
HKEY_CLASSES_ROOT\AcroExch.Document\shell\open\command
eingetragen ist.
Bei mir steht der Pfad und dahinter
"C:\Programme\Adobe\Acrobat 5.0\Reader\AcroRd32.exe" "%1"
Wichtig ist hier "%1"

Zu finden auch im Explorer unter Extras/Ordneroptionen/Dateitypen
"Bearbeiten" anklicken, "Open" markieren und "Bearbeiten".

> Bei dem zweiten Vorschlag in der Gruppe geht es zwar, aber dort
> findet keine Abfrage statt, dass immer die neueste Acrobat Reader
> Version geöffnet wird.

Da würde ich aber auch nicht immer das Dateisystem nach der Exe von
Acrobat durchsuchen.

Private Declare Function FindExecutable _
Lib "shell32.dll" Alias "FindExecutableA" ( _
ByVal lpFile As String, _
ByVal lpDirectory As String, _
ByVal lpResult As String _
) As Long
Private Const MAX_PATH = 260
Private Const ERROR_FILE_NOT_FOUND = 2&
Private Const ERROR_PATH_NOT_FOUND = 3&
Private Const ERROR_BAD_FORMAT = 11&

Public Function GetExe(strPath As String) As String
Dim strBuffer As String
strBuffer = String(MAX_PATH, 0)
Select Case FindExecutable(strPath, vbNullString, strBuffer)
Case 0
' MsgBox "The system is out of memory or resources)"
Case 31
' MsgBox "There is no association for the specified file type"
Case ERROR_FILE_NOT_FOUND
' MsgBox "The specified file was not found"
Case ERROR_PATH_NOT_FOUND
' MsgBox "The specified path was not found"
Case ERROR_BAD_FORMAT
' MsgBox "The .exe file is invalid"
Case Else
GetExe = Left(strBuffer, InStr(1, strBuffer, Chr(0)) - 1)
End Select
End Function

Wenn du die Fehlerbehandlung weglässt, wird die Funktion noch etwas
kürzer (aber nicht schneller)

Um die Nachfragen zu beseitigen, müsste man wissen, was für
Befehlszeilenparameter Acrobat akzeptiert und die entsprechenden bei
Shell und Shellexecute mitsenden.

0 new messages