Per VBA von Excel geöffnete Word-Datei AKTIVIEREN

Moin, moin,
danke das Du meine Fragestellung aufgerufen hast!

Ich möchte per VBA aus einer Excel-Datei eine geöffnete Word-Datei aktivieren.
Hört sich einfach an aber ich breche mir schon lange Zeit die Finger dabei ab.
Folgendes funktioniert bereits…
In Excel abfragen ob die Word-Datei bereits geöffnet ist.
Wenn nicht dann öffnen mittels:
Shell „winword.exe „““ & „C:\Dateiname.doc“ & „“"", 1
Mir fehlt also „nur“ noch der Code zum Aktivieren.

Hast Du eine Idee mit welchem Code das gehen könnte?
Danke im voraus und viele Grüße!
Frank

Ich möchte per VBA aus einer Excel-Datei eine geöffnete
Word-Datei aktivieren.

Hallo Frank,

Sub tt()
’ Verweis auf Microsoft Word X.0 Object Library setzen.
Dim appWord As Word.Application
On Error Resume Next
Set appWord = GetObject(, „Word.Application“)
If Err 0 Then Set appWord = CreateObject(„Word.Application“)
On Error GoTo 0
appWord.Visible = True
End Sub

Gruß
Reinhard

Hallo Reinhard ,

Vielen Dank für Deine super schnelle Antwort!
Ich baue Deinen Code (auf den ich niemals alleine gekommen wäre) ein und berichte über das Ergebnis.

Bis später
Frank

Hallo Reinhard,

habe Deine Code-Zeilen getestet, läuft gut durch bis auf eine Ausnahme, in der ersten Zeile „Dim appWord As Word.Application“ bekomme ich den Fehler „Benutzerdefinierter Typ nicht definiert“ angesagt.
Ich füge hier mal meine komplette Prozedur ein wie folgt.
'*********************************************************
Private Function DateiGeoeffnet(DerPfad As String) As Boolean
On Error Resume Next
Open DerPfad For Binary Access Read Lock Read As #1
Close #1
If Err.Number 0 Then
DateiGeoeffnet = True
Err.Clear
End If
End Function
'---------------------------------------------------------
Private Sub Datei_öffnen_oder_aktivieren()
Application.ScreenUpdating = False
Dim sFile As String, Pfad As String
sFile = „C:\Test.doc“
If DateiGeoeffnet(sFile) = True Then
'Ist geöffnet also nur aktivieren
Stop
Else
'Nicht geöffnet also öffnen
If Dir(sFile) „“ Then
Shell „winword.exe „““ & sFile & „“"", 1
Else
MsgBox „Datei nicht gefunden!“
Exit Sub
End If
End If
Application.ScreenUpdating = True
End Sub
'*********************************************************
Vielleicht schaust Du mal darüber. Wo jetzt der Stop gemacht wird müsste „nur“ zur „Test.doc“ aktiviert werden, weil „Test.doc“ bereits geöffnet ist.

Kannst Du da etwas mit anfangen und vielleicht sogar mitteilen, wo mit welchem Code ich Deine Idee einbauen kann?

Viele Grüße
Frank

habe Deine Code-Zeilen getestet, läuft gut durch bis auf eine
Ausnahme, in der ersten Zeile „Dim appWord As
Word.Application“ bekomme ich den Fehler „Benutzerdefinierter
Typ nicht definiert“ angesagt.

Hallo Frank,

ich glaube du hast den Verweis nicht gesetzt.

Nach deinem Code schau ich gleich.

Grundsätzlich könntest du um zu schauen wie man so was codiert in Suchmaschinen diese Suchwortkombination eingeben
getobject createobject word.application

Gruß
Reinhard

Prüfen ob Zugriff auf Datei möglich
Hallo Frank,

zu deiner Funktion DateiGeoeffnet, du prüfst damit nicht (nur) ab ob diese Datei grad von Word geöffnet ist sondern ob man überhaupt darauf zugreifen kann.
Sie kann ja gar nicht vorhanden sein, grad von einem anderen Programm geöffnet oder sonstwas grad im System vorliegen.

Du benutzt #1 als Dateinummer. Das geht. Das geht auch mit mehreren gleichzeitig geöffneten Dateinen, da nimmt man halt #1, #2,#3, usw.
Ich hatte persönlich damit auch noch nie Probleme.
Aber ich schaue genau was die Profis so codieren, sicherheitshalber geben sie diese Nummern nie fest vor, sie benutzen FreeFile.
Das sehe dann so aus:

Private Function DateiGeoeffnet(DerPfad As String) As Boolean
Dim FF As Long
On Error Resume Next
FF = FreeFile
Open DerPfad For Binary Access Read Lock Read As #FF
Close #FF
If Err.Number 0 Then
 DateiGeoeffnet = True
 Err.Clear
End If
End Function

Gruß
Reinhard

Kannst Du da etwas mit anfangen und vielleicht sogar
mitteilen, wo mit welchem Code ich Deine Idee einbauen kann?

Hallo Frank,

nachstehend ungetesteter Code, teste ihn mal.
Nochmal zum Verweis auf Word. Wird wahrscheinlich auch ohne gehen mit Änderung beim Dim, aber mit gesetztem Verweis hast du die hilfreiche IntelliSense zur Verfügung.

Gruß
Reinhard

Private Sub Datei\_öffnen\_oder\_aktivieren()
Application.ScreenUpdating = False
Dim appWord As Word.Application, Doc As Document, Offen As Boolean
Const sPathFile As String = "C:\Test.doc"
On Error Resume Next
Set appWord = GetObject(, "Word.Application")
If Err 0 Then Set appWord = CreateObject("Word.Application")
On Error GoTo 0
appWord.Visible = True
With appWord
 For Each Doc In .Documents
 If Doc.Name = Mid(sPathFile, InStrRev(sPathFile, "\") + 1) Then
 Offen = True
 Exit For
 End If
 Next Doc
 If Not Offen Then .Documents.Open sPathFile
End With
Application.ScreenUpdating = True
End With

Hallo Reinhard,

nachstehend ungetesteter Code, teste ihn mal.

Habe ich gemacht, Dim appWord As Word.Application und Dim Doc As Document mag mein Excel nicht, vielleicht weil ich Version 2000 verwende!? Ich habe zwar auch die höheren Versionen bis 2007, möchte aber das es ab 2000 klappt. Womit arbeitest Du z.Zt.?

Nochmal zum Verweis auf Word. Wird wahrscheinlich auch ohne
gehen mit Änderung beim Dim, aber mit gesetztem Verweis hast
du die hilfreiche IntelliSense zur Verfügung.

Auf die IntelliSense zu verzichten nehme ich gerne in Kauf, ohne den beiden Dimensionierungen läuft der Code vollständig durch aber leider wird die geöffnet Test.doc nicht aktiviert.
Da scheint eine ganz harte Nuss zu sein, auch Tante Google hält sich da sehr bedeckt! Tut mir Leid das ich Dir keinen Erfolg melden kann, wo Du Dich doch so sehr bemühst und ich Dir nur dafür danken kann.
Ich bemühe jetzt mal bei mir die Partition mit 2003/2007, melde mich dann wieder.

Bis dann
Frank

Hallo Reinhard,

Grundsätzlich könntest du um zu schauen wie man so was codiert
in Suchmaschinen diese Suchwortkombination eingeben
getobject createobject word.application

Danke, werde ich machen!

Bis dann Frank

Hallo Frank,

nachstehend ungetesteter Code, teste ihn mal.

Habe ich gemacht, Dim appWord As Word.Application und Dim Doc
As Document mag mein Excel nicht, vielleicht weil ich Version
2000 verwende!? Ich habe zwar auch die höheren Versionen bis
2007, möchte aber das es ab 2000 klappt. Womit arbeitest Du
z.Zt.?

auch 2000, allerdings habe ich gleichzeitig drei Officeversionen installiert, darunter auch 2007 was zur Folge hat daß mir auch wenn ich in 2000 im Editor bin mir bei Verweisen nicht
Microsoft Word 9.0 Object Library
sondern
Microsoft Word 12.0 Object Library
zur Auswahl angeboten wird.

Von daher kann theoretisch 2000er Code der bei mir läuft auf PCs die reinrassiges 2000 haben nicht laufen.

Auf die IntelliSense zu verzichten nehme ich gerne in Kauf,
ohne den beiden Dimensionierungen läuft der Code vollständig
durch aber leider wird die geöffnet Test.doc nicht aktiviert.

Nachstehend ist der Code der bei mir in XL 2000 funktioniert.

Gruß
Reinhard

Private Sub Datei\_öffnen\_oder\_aktivieren()
Application.ScreenUpdating = False
Dim appWord As Object, Doc As Document, Offen As Boolean
Const sPathFile As String = "k:\tabellenverbinden.doc" '"C:\Test.doc"
On Error Resume Next
Set appWord = GetObject(, "Word.Application")
If Err 0 Then Set appWord = CreateObject("Word.Application")
On Error GoTo 0
appWord.Visible = True
With appWord
 For Each Doc In .Documents
 If Doc.Name = Mid(sPathFile, InStrRev(sPathFile, "\") + 1) Then
 Offen = True
 Exit For
 End If
 Next Doc
 If Not Offen Then .Documents.Open sPathFile
End With
Application.ScreenUpdating = True
End Sub

Moin Reinhard!

nachstehend ungetesteter Code, teste ihn mal.
Nochmal zum Verweis auf Word. Wird wahrscheinlich auch ohne
gehen mit Änderung beim Dim, aber mit gesetztem Verweis hast
du die hilfreiche IntelliSense zur Verfügung.

Habe mit 2003/2007 getestet, die mögen
Dim appWord As Word.Application, Doc As Document
auch nicht. Läuft aber auch dort des weiteren bis zum Ende durch.
Mir fällt jetzt auch auf, das Du einiges schön schlanker hin bekommen hast und ohne Function, das gefällt mir.

Das…
If Not Offen Then .Documents.Open sPathFile
… verstehe ich und funktioniert aber an welcher Stelle wird die Test.doc nur aktiviert weil sie schon geöffnet ist?
Könnte man das
If Not Offen Then .Documents.Open sPathFile
Else
'Code für „nur aktivieren“
End if
…so einbauen?

Bis dann
Frank

Hier nochmals Deine Prozedur wie sie bei mir ohne Genörgel seitens Excel läuft.

Private Sub Reinhard\_Datei\_öffnen\_oder\_aktivieren()
 Application.ScreenUpdating = False
 'Dim appWord As Word.Application
 'Dim Doc As Document
 Dim Offen As Boolean
 Const sPathFile As String = "C:\Test.doc"
 On Error Resume Next
 Set appWord = GetObject(, "Word.Application")
 If Err 0 Then Set appWord = CreateObject("Word.Application")
 On Error GoTo 0
 appWord.Visible = True
 With appWord
 For Each Doc In .Documents
 If Doc.Name = Mid(sPathFile, InStrRev(sPathFile, "\") + 1) Then
 Offen = True
 Exit For
 End If
 Next Doc
 If Not Offen Then .Documents.Open sPathFile
 End With
 Application.ScreenUpdating = True
End Sub

Hallo Frank,

Habe mit 2003/2007 getestet, die mögen
Dim appWord As Word.Application, Doc As Document
auch nicht.

Doc As Document müßte okay sein bei gesetzem Verweis.
Word.Applcation anscheinend nicht, weiß grad nicht warum.

Das…
If Not Offen Then .Documents.Open sPathFile
… verstehe ich und funktioniert aber an welcher Stelle wird
die Test.doc nur aktiviert weil sie schon geöffnet ist?

probier mal den allerneuesten Code, an sich hab ich nur Activate eingefügt und es würde reichen dir das so zu sagen aber aus meinen Erfahrungen hier und aus anderen Foren weiß ich es ist vieeeeeeel sicherer, man postet sich jeweils den kompletten relevanten Code.

Gruß
Reinhard

Option Explicit

Sub Datei\_öffnen\_oder\_aktivieren()
Application.ScreenUpdating = False
Dim appWord As Object, Doc As Document, Offen As Boolean
Const sPathFile As String = "k:\tabellenverbinden.doc" '"C:\Test.doc"
On Error Resume Next
Set appWord = GetObject(, "Word.Application")
If Err 0 Then Set appWord = CreateObject("Word.Application")
On Error GoTo 0
appWord.Visible = True
With appWord
 For Each Doc In .Documents
 If Doc.Name = Mid(sPathFile, InStrRev(sPathFile, "\") + 1) Then
 Offen = True
 Exit For
 End If
 Next Doc
 If Not Offen Then .Documents.Open sPathFile
 .Activate
End With
Application.ScreenUpdating = True
End Sub

Hallo Reinhard,

Womit arbeitest Du z.Zt.?

auch 2000, allerdings habe ich gleichzeitig drei
Officeversionen installiert, …
Von daher kann theoretisch 2000er Code der bei mir läuft auf
PCs die reinrassiges 2000 haben nicht laufen.

Wie ich schon schrieb (hat sich ein bisschen überschnitten) war ich auch auf einer Partition mit XL2003 und XL2007 und da wurde auch die geöffnete Word-Datei nicht aktiviert.

Nachstehend ist der Code der bei mir in XL 2000 funktioniert.

Vielleicht sollte ich noch besser zum Ausdruck bringen, was ich mit „aktiviert“ meine.
Die Excel-Datei wird angezeigt, die Word-Datei ist geöffnet wird aber natürlich noch nicht angezeigt.
Nachdem die Prozedur in Excel durchlaufen wurde soll anstelle der Excel-Datei die Word-Datei angezeigt werden.
War das bei Dir wirklich so?
Wenn ja, kapituliere ich und gebe ich mein Vorhaben mit Tränen in den Augen auf.

Viele Grüße
Frank
Ps: Was macht eigentlich ein Handwerker am PC :smile: noch am werkeln? Handwerker arbeiten doch so spät nicht mehr!

Hallo Reinhard,

probier mal den allerneuesten Code,…

Nix mehr machen, es läuft!!!

Gleich ausführlicher
Frank

Hallo lieber :smile: Reinhard!

…an sich hab ich nur Activate eingefügt…

„Nur“ ist gut, das war der Kasus knaxus!!!

…und es würde reichen dir das so zu sagen
aber aus meinen Erfahrungen hier und aus anderen Foren weiß
ich es ist vieeeeeeel sicherer, man postet sich jeweils den
kompletten relevanten Code.

Wie wahr, wie wahr, die Klahrheit ist dann unübertrefflich.

Doc As Document müßte okay sein bei gesetzem Verweis.

Jetzt ahne ich erst was Du mit „gesetztem Verweis“ meinst, das kann man nur manuell machen in Excel oder Excel-VBA, oder?
Wenn ja, ginge es in meinem Fall sowieso nicht denn die Datei ist für mehrere andere Anwender/innen gedacht und die sind noch ahnungsloser als ich ohnehin schon bin.

Word.Applcation anscheinend nicht, weiß grad nicht warum.

Das enttäuscht mich nun aber :smile: :smile:
Weißt Du was, darauf kann ich gerne verzichten, es läuft doch ohne!
Übrigens, in „Applcation“ ist ein Tippfehler, es fehlt ein i und vielleicht verwendetest Du es im Code auch so.
Irgendwo schriebst Du mir „…schaue mir bei den Profis genau an…“
Junger Freund, mit dieser Lösung für mich hast Du Dich geoutet, Du bist der Profi!
(Ich weiß wovon ich rede, habe das Thema mehrmals rauf, runter und zurück gegoogelt, nix gefunden, nur Mörder riesige Codezeile, die das erreichen sollten aber nicht taten.

 **Du hast mir mal wieder sehr geholfen.  
 dafür nochmals meinen herzlichen Dank!**  
 Frank 

Hallo Frank,

…an sich hab ich nur Activate eingefügt…

„Nur“ ist gut, das war der Kasus knaxus!!!

das dachte ich mir schon und das „nur“ bezog sich darauf daß ich
trotz der rel. Winzigkeit der Änderung nochmals den gesamten Code zeigte.

…und es würde reichen dir das so zu sagen
aber aus meinen Erfahrungen hier und aus anderen Foren weiß
ich es ist vieeeeeeel sicherer, man postet sich jeweils den
kompletten relevanten Code.

Wie wahr, wie wahr, die Klahrheit ist dann unübertrefflich.

Genau, denn dann können alle beteiligten für sich testen ob Code klappt oder nicht aber haben EXAKT den gleichen Code.
Ist eh schon schwierig genug wenn man jetzt nicht nebeneiander am gleichen PC sitzt sondern entfernt herauszufinden warum ein Code bei einem klappt, bei dem anderen nicht oder auch umgekehrt.
Ungleiche Testcodes verschlimmern das enorm.

Doc As Document müßte okay sein bei gesetzem Verweis.

Jetzt ahne ich erst was Du mit „gesetztem Verweis“ meinst,

Sorry, du klangst so als ob du mit „Verweis“ was anfangen kannst.
Ja, ich meinte im Editor Extras—Verweise…

das
kann man nur manuell machen in Excel oder Excel-VBA, oder?

Nein, das geht auch mit Vba. Rein prinzipiell auch einfach.

Wenn ja, ginge es in meinem Fall sowieso nicht denn die Datei
ist für mehrere andere Anwender/innen gedacht und die sind
noch ahnungsloser als ich ohnehin schon bin.

? Die anderen User sollen doch das Makro nur starten, warum müssen die denn Ahnung von Vba haben?

Andrerseits hast du Recht. „ginge…nicht“ ist unkorrekt, es ginge in jedem Fall.
Ich wählte das Wort „prinzipiell“ beim Verweissetzen durch Vba.
Problem ist, je nach Excelversion ist ggfs. der Verweis ein anderer.
Was bedingt daß man vor dem Verweis setzen/überprüfen überprüft welche XL-Version vorliegt.

Von daher ist es korrekt in deinem Fall auf Verweise zu verzichten um es „einfacher“ zu machen.

Word.Applcation anscheinend nicht, weiß grad nicht warum.

Das enttäuscht mich nun aber :smile: :smile:

-) Ich habe da vielleicht andere Ansprüche was ich über Vba wissen möchte. Denn mit gesetztem Verweis klappt dieser Code problemlos:

Sub tt()
Dim xyz As Word.Application
MsgBox „huhu“
End Sub

Ergo ist Vba „Word.Application“ schon bekannt sonst würde der Debugger meckern.
In „unserem“ code meckert der Debugger dann „Word.Application“ an.
Da möchte ich schon gerne für die Zukunft wissen warum die Träne das macht.

Übrigens, in „Applcation“ ist ein Tippfehler, es fehlt ein i

Es war ein Tippfehler.

Junger Freund,

*grins*

mit dieser Lösung für mich hast Du Dich
geoutet, Du bist der Profi!

*aargs* Jetzt weiß das ja wohl jeder :frowning: Was werden meine nachbarn sagen, meine familie, meine Freunde wenn sie erfahren daß ich „so“ bin,
*schwitz* :smile:))

Ich bin Realist. Ich spiele in der dritten Bundesliga, von mir aus im oberen Drittel, Aufstieg zur zweiten nicht sehr sicher, zur ersten never.

(Ich weiß wovon ich rede, habe das Thema mehrmals rauf, runter
und zurück gegoogelt, nix gefunden, nur Mörder riesige
Codezeile, die das erreichen sollten aber nicht taten.

Hallo Frank,

Wie ich schon schrieb (hat sich ein bisschen überschnitten)

ja, ist leider so bei langen Beitragsfolgen, zumindest mein Überblick geht so allmählich flöten.
Meine idee ist, wenn da irgendwas an der problematik noch besteht, dann schreib das als beitrag direkt als Antwort auf deine Ausgangsanfrage.
Damit wir beide wieder Überblick kriegen :smile:

war ich auch auf einer Partition mit XL2003 und XL2007 und da
wurde auch die geöffnete Word-Datei nicht aktiviert.

Müßte durch Einfügung der Codezeile
.Activate
jetzt klappen.

Vielleicht sollte ich noch besser zum Ausdruck bringen, was
ich mit „aktiviert“ meine.
Die Excel-Datei wird angezeigt, die Word-Datei ist geöffnet
wird aber natürlich noch nicht angezeigt.

Mein Fehler. Ich hatte den Code im Editor getestet mit F5.
Da krieg ich ja nicht direkt mit was grad aktiviert wurde im aktuellen Fenster.
Dann habe ich es halt getestet durch Schaltfläche im Excelblatt…

Wenn ja, kapituliere ich und gebe ich mein Vorhaben mit Tränen
in den Augen auf.

Wieso aufgeben? In/mit Excel-Vba geht ALLES.
Wie sagte schon dieser weise Chinese, nein nicht Konfuzius,
sondern Um lei tung, irschendwie kommt man zum Ziel *gg*

Gruß
Reinhard

Problem dank Reinhard gelöst!
Moin,
Da ich in diesem feinen Forum meinen eigenen Beitrag nicht ändern kann muss ich mir selber antworten um an übersichtlicher Stelle zu berichten das das Problem gelöst ist, Reinhard sei Dank!
Um aus einer Excel-Anwendung ein Worddokument zu öffnen oder wenn bereits geöffnet zu aktivieren, funktioniert das mit folgender Prozedur von Reinhard. (Prozedur in ein Excel Standardmodul eingefügt)

Sub Reinhard\_Datei\_öffnen\_oder\_aktivieren() Application.ScreenUpdating = False
 Dim Offen As Boolean
 Const sPathFile As String = "C:\Test.doc" ' 0 Then Set appWord = CreateObject("Word.Application")
 On Error GoTo 0
 appWord.Visible = True
 With appWord
 For Each Doc In .Documents
 If Doc.Name = Mid(sPathFile, InStrRev(sPathFile, "\") + 1) Then
 Offen = True
 Exit For
 End If
 Next Doc
 If Not Offen Then .Documents.Open sPathFile
 .Activate
 End With
 Application.ScreenUpdating = True
End Sub

Für den Weg zurück vom Worddokument zur Excel-Anwendung hatte ich bereits eine Lösung gefunden und stelle die Prozedur für Interessierte Mitleser ebenfalls hier ein. Gestartet wird die Prozedur bei mir mittels Tastenkombination. (Prozedur in ein Standard-Modul einfügen)

Sub Navigator\_aufrufen()
' Tastenkombination: Strg+d
'Abfragen ob Datei vorhanden
 Pfad = ThisDocument.Path
 If Dir(Pfad & "\zFaktura Navigator.xls") = "" Then
 MsgBox "Datei Faktura Navigator konnte nicht gefunden werden!"
 GoTo Ausstieg
 Else
 'Vorhanden
 GoTo Aktivieren
 End If
Aktivieren:
 Dim ExcelAnw As Object
 Dim DateiName As String
 On Error Resume Next
 Set ExcelAnw = GetObject(, "Excel.Application")
 If ExcelAnw Is Nothing Then
 GoTo Ausstieg 'Wenn Excel-Datei NICHT geöffnet werden soll
 Set ExcelAnw = CreateObject("Excel.Sheet")
 End If
 DateiName = Pfad & "\zFaktura Navigator.xls"
 Set ExcelAnw = GetObject(DateiName)
 ExcelAnw.Application.Visible = True
 ExcelAnw.Parent.Windows(Excel.Parent.Windows.Count).Activate
 'Abschuß
 Set ExcelAnw = Nothing
Exit Sub
Öffnen:
 Application.ScreenUpdating = False
 sFile = Pfad & "\zFaktura Navigator.xls"
 If Dir(sFile) "" Then
 Shell "excel.exe """ & sFile & """", 1
 Else
 MsgBox "Datei nicht gefunden!"
 Exit Sub
 End If
 Application.ScreenUpdating = True
Ausstieg:
End Sub

Die meisten Zeilen habe ich legal geklaut :smile: im Internet.
Den Ansprüchen von Profis wird der Code bestimmt nicht gerecht, ich sehe schon wie sich Reinhard`s Nackenhaare sträuben :smile:.
Aber für mich reicht das, wenn etwas einwandfrei funktioniert, feile ich da nicht mehr dran.

Tschüs und viele Grüße!
Frank