Discussion:
Wie externes Prog. schliessen mit VBA
(zu alt für eine Antwort)
Michael Steingruber
2006-01-05 10:07:02 UTC
Permalink
Hallo zusammen

In einem exelfile öffne ich mittels einem makro ein eingebettetes pdf über
adobe reader . solange das pdf offen ist, kann die excel-datei nicht
gespeichert werden. wie kann ich im auto_close zuerst das pdf schliessen
damit die excel_datei gespeichert und geschlossen werden kann?

danke und gruss
michael steingruber
stefan onken
2006-01-05 10:38:35 UTC
Permalink
Hallo Michael,

man kann ein Makro solange warten lassen, bis die gestartete Anwendung
geschlossen wird, zB so:

Sub test()
CreateObject("WScript.Shell").Run "d:\test.pdf", 1, True
MsgBox "jetzt geht´s weiter"
End Sub

Ansonsten könnte man auch alle Fensterhandles bzw Tasks nach dem Namen
der pdf-Datei durchsuchen, als Anregung:
www.activevb.de/tipps/vb6tipps/tipp0123.html
(funktioniert auch mit Excel).

Gruß
stefan
Post by Michael Steingruber
Hallo zusammen
In einem exelfile öffne ich mittels einem makro ein eingebettetes pdf über
adobe reader . solange das pdf offen ist, kann die excel-datei nicht
gespeichert werden. wie kann ich im auto_close zuerst das pdf schliessen
damit die excel_datei gespeichert und geschlossen werden kann?
danke und gruss
michael steingruber
stefan onken
2006-01-05 11:28:46 UTC
Permalink
Post by stefan onken
Ansonsten könnte man auch alle Fensterhandles bzw Tasks nach dem Namen
www.activevb.de/tipps/vb6tipps/tipp0123.html
(funktioniert auch mit Excel).
ich habe überlesen, dass du den Reader mittels Makro startest. Machst
du das mit Shell?
In dem Fall wird eine Task-ID erzeugt, die du überprüfen kannst.
taskID = Shell("Pfad\acrobat.exe test.pdf")

Ein Codebsp, wie man mit der taskID an den Task kommt und diesen ggfls
schliesst, findest du hier: http://tinyurl.com/d8wdy

Gruß
stefan
Michael Steingruber
2006-01-05 12:10:05 UTC
Permalink
hallo stefan

danke für deine tipps. du must verstehen, bin ein vba neuling. ich hab
keinen plan was shell ist. ich öffne ein eingebettetes pdf in der excel
datei, da diese verschickt wird und auf anderen computern laufen muss, somit
kann ich keinen dateipfad im sinne eines links angeben, damit das pdf
geöffnet wird. der befehl ist folgender:

Sub öffnen_Kurzanleitung_DE()

Sheets("anleitung").Select
ActiveSheet.Shapes("Object 12").Select
Selection.Verb Verb:=xlPrimary

Sheets("leere seite").Select
Range("a1").Select
End Sub

jetzt muss es nur wieder geschlossen werden können mit einem in einer
userform integrierten funktion. ein makro für ein button der das excel
speichert und schliesst. ist eingebaut, funktioniert jedoch nur, wenn das pdf
nicht geöffnet ist....

gruss

michael
Post by stefan onken
Post by stefan onken
Ansonsten könnte man auch alle Fensterhandles bzw Tasks nach dem Namen
www.activevb.de/tipps/vb6tipps/tipp0123.html
(funktioniert auch mit Excel).
ich habe überlesen, dass du den Reader mittels Makro startest. Machst
du das mit Shell?
In dem Fall wird eine Task-ID erzeugt, die du überprüfen kannst.
taskID = Shell("Pfad\acrobat.exe test.pdf")
Ein Codebsp, wie man mit der taskID an den Task kommt und diesen ggfls
schliesst, findest du hier: http://tinyurl.com/d8wdy
Gruß
stefan
stefan onken
2006-01-05 15:19:13 UTC
Permalink
Hallo Michael,
mit der Shell-Funktion (mehr Info dazu, wenn du imVBA-Editor das Wort
in ein Codemodul eintippst, den Cursor in das Wort stellst und F1
drückst) startet man eine externe Anwendung. Das bedeutet, die
pdf-Datei müsste als externe Datei vorhanden sein.
Dadurch liesse sich das Speichern-Problem umgehen, aber dafür können
natürlich andere auftreten.


Wenn man mit deinem Code ein eingebettete pdf öffnet, hat die
Anwendung einen Fenstertitel, etwa Acrobat Reader - [Acrobat-Dokument
in Mappe1.xls]
Nach diesem Fenstertitel kann man suchen und, falls gefunden, eine
Meldung ausgeben und das speichern solange sperren, bis Acrobat bzw die
pdf-Datei geschlossen wurde.
Ins Codemodul DieseArbeitsmappe

Private Declare Function FindWindow Lib _
"user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal _
lpWindowName As String) As Long
Private Sub Workbook_BeforeSave _
(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim hwnd As Long
hwnd = FindWindow(vbNullString, _
"Acrobat Reader - [Acrobat-Dokument in " _
& ThisWorkbook.Name & "]")
If hwnd <> 0 Then
MsgBox "Acrobat schließen!"
Cancel = True
End If
End Sub

Anstatt MsgBox "Acrobat schließen" kann man den Prozess dann auch
abschießen, aber auch dieser Code ist nicht wenig umfangreich, Codebsp

http://michael-schwimmer.de/xlMain.htm Nr 78

Es gibt nun mehrere Programme, eine pdf anzeigen zu lassen, und damit
variiert auch der Fenstertitel. Um für alle Eventualitäten gerüstet
zu sein, landet man doch wieder bei derm Code aus meinem ersten link.

Andere Möglichkeit: die pdf-Datei als Bild-Datei abspeichern, dieses
Bild der Picture-Eigenschaft eines UserForm zuordnen. Das Bild wird in
der Exceldatei gespeichert und muss nicht als externe Datei vorhanden
sein. Zum anzeigen dann schlicht UserForm.Show

Gruß
stefan
Post by Michael Steingruber
hallo stefan
danke für deine tipps. du must verstehen, bin ein vba neuling. ich hab
keinen plan was shell ist. ich öffne ein eingebettetes pdf in der excel
datei, da diese verschickt wird und auf anderen computern laufen muss, somit
kann ich keinen dateipfad im sinne eines links angeben, damit das pdf
Sub öffnen_Kurzanleitung_DE()
Sheets("anleitung").Select
ActiveSheet.Shapes("Object 12").Select
Selection.Verb Verb:=xlPrimary
Sheets("leere seite").Select
Range("a1").Select
End Sub
jetzt muss es nur wieder geschlossen werden können mit einem in einer
userform integrierten funktion. ein makro für ein button der das excel
speichert und schliesst. ist eingebaut, funktioniert jedoch nur, wenn das pdf
nicht geöffnet ist....
gruss
michael
Post by stefan onken
Post by stefan onken
Ansonsten könnte man auch alle Fensterhandles bzw Tasks nach dem Namen
www.activevb.de/tipps/vb6tipps/tipp0123.html
(funktioniert auch mit Excel).
ich habe überlesen, dass du den Reader mittels Makro startest. Machst
du das mit Shell?
In dem Fall wird eine Task-ID erzeugt, die du überprüfen kannst.
taskID = Shell("Pfad\acrobat.exe test.pdf")
Ein Codebsp, wie man mit der taskID an den Task kommt und diesen ggfls
schliesst, findest du hier: http://tinyurl.com/d8wdy
Gruß
stefan
Michael Steingruber
2006-01-06 10:39:02 UTC
Permalink
hallo stefan

vielen dank für deine tipps. ich habe nun dein code übernommen und es dient
meinen zwecken. dies nachdem ich den hammercode bezüglich .exe-abschiessen
ausprobiert habe und den computer neu starten musste... war wohl zuviel...

gruss

michael
Post by stefan onken
Hallo Michael,
mit der Shell-Funktion (mehr Info dazu, wenn du imVBA-Editor das Wort
in ein Codemodul eintippst, den Cursor in das Wort stellst und F1
drückst) startet man eine externe Anwendung. Das bedeutet, die
pdf-Datei müsste als externe Datei vorhanden sein.
Dadurch liesse sich das Speichern-Problem umgehen, aber dafür können
natürlich andere auftreten.
Wenn man mit deinem Code ein eingebettete pdf öffnet, hat die
Anwendung einen Fenstertitel, etwa Acrobat Reader - [Acrobat-Dokument
in Mappe1.xls]
Nach diesem Fenstertitel kann man suchen und, falls gefunden, eine
Meldung ausgeben und das speichern solange sperren, bis Acrobat bzw die
pdf-Datei geschlossen wurde.
Ins Codemodul DieseArbeitsmappe
Private Declare Function FindWindow Lib _
"user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal _
lpWindowName As String) As Long
Private Sub Workbook_BeforeSave _
(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim hwnd As Long
hwnd = FindWindow(vbNullString, _
"Acrobat Reader - [Acrobat-Dokument in " _
& ThisWorkbook.Name & "]")
If hwnd <> 0 Then
MsgBox "Acrobat schließen!"
Cancel = True
End If
End Sub
Anstatt MsgBox "Acrobat schließen" kann man den Prozess dann auch
abschießen, aber auch dieser Code ist nicht wenig umfangreich, Codebsp
http://michael-schwimmer.de/xlMain.htm Nr 78
Es gibt nun mehrere Programme, eine pdf anzeigen zu lassen, und damit
variiert auch der Fenstertitel. Um für alle Eventualitäten gerüstet
zu sein, landet man doch wieder bei derm Code aus meinem ersten link.
Andere Möglichkeit: die pdf-Datei als Bild-Datei abspeichern, dieses
Bild der Picture-Eigenschaft eines UserForm zuordnen. Das Bild wird in
der Exceldatei gespeichert und muss nicht als externe Datei vorhanden
sein. Zum anzeigen dann schlicht UserForm.Show
Gruß
stefan
Post by Michael Steingruber
hallo stefan
danke für deine tipps. du must verstehen, bin ein vba neuling. ich hab
keinen plan was shell ist. ich öffne ein eingebettetes pdf in der excel
datei, da diese verschickt wird und auf anderen computern laufen muss, somit
kann ich keinen dateipfad im sinne eines links angeben, damit das pdf
Sub öffnen_Kurzanleitung_DE()
Sheets("anleitung").Select
ActiveSheet.Shapes("Object 12").Select
Selection.Verb Verb:=xlPrimary
Sheets("leere seite").Select
Range("a1").Select
End Sub
jetzt muss es nur wieder geschlossen werden können mit einem in einer
userform integrierten funktion. ein makro für ein button der das excel
speichert und schliesst. ist eingebaut, funktioniert jedoch nur, wenn das pdf
nicht geöffnet ist....
gruss
michael
Post by stefan onken
Post by stefan onken
Ansonsten könnte man auch alle Fensterhandles bzw Tasks nach dem Namen
www.activevb.de/tipps/vb6tipps/tipp0123.html
(funktioniert auch mit Excel).
ich habe überlesen, dass du den Reader mittels Makro startest. Machst
du das mit Shell?
In dem Fall wird eine Task-ID erzeugt, die du überprüfen kannst.
taskID = Shell("Pfad\acrobat.exe test.pdf")
Ein Codebsp, wie man mit der taskID an den Task kommt und diesen ggfls
schliesst, findest du hier: http://tinyurl.com/d8wdy
Gruß
stefan
Loading...