VBA Word 2k/XP - Makro Autostart ohne AutoExec()

Hallo,

      • Beschreibung: - - -
        Ich habe ein Formular, dass beim Öffnen eines leeren Dokument’s (Dokument1, Dokument2, etc.) erscheinen soll. Dafür steht mir der Befehl AutoNew() zur Verfügung. Der Befehl AutoNew() wird leider nicht angewendet, wenn Word (über die winword.exe-Verknüpfung, also normales Symbol) gestartet wird.

Mit der AutoExec() oder der AutoOpen() gehts nicht. Da die AutoExec() sich nur auf die Dokumentvorlage normal.dot bezieht und somit vor dem Öffnen des leeren oder beschriebenen Dokuments aktiviert wird. (Keine Abfrage möglich, ob ActiveDocument.Name Like „Dokument*“ ist.) Und bei der AutoOpen() gehts nicht, da ich den Pfad nicht weiss, wo Word das leere Dokument „versteckt“ hält.

      • Problem, für die ich eine Lösung suche: - - -
        Ich müsste nun Abfragen können, ob ein leeres Dokument beim Starten von Word geöffnet wird. Wenn ja, dann soll das Formular ausgeführt werden.

Hab hier im Forum in einem anderen Thread schon gelesen, dass es noch andere Möglichkeiten gibt, wie ein Makro beim Programmstart aktiviert wird.

Bitte um Hilfe,
Besten Dank,
Christoph

guten morgen,

lange rede kurzer sinn, wenn dir die ganzen autoopen-geschichten nicht schmecken, würde ich eine dokumentenvariable in die „normal.dot“ vorlage setzen und dieser einen wert zuweisen

bei jedem aufruf prüfst du diese variable ab und lässt entweder das formular aufgehen oder nicht…

gruß

rasta

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

VBA Word 2k/XP - Dokumentenvariable
Hmm… das ist ein wenig zu kompliziert für mich.

Hab mich im Forum bisschen umgeschaut und Code’s zu Dokumentenvariablen gesucht. Leider weiss ich nicht, wie ich die in mein Beispiel übernehmen kann.

Es geht vor allem darum, dass beim Starten von Word abgefragt werden muss, ob ein leeres Dokument geöffnet oder bereits beschriebenes, abgespeichertes Dokument geöffnet wird. Wenn ein leeres Dokument geöffnet wird, soll ein Formular aufgerufen werden. Bei einem bereits beschriebenen Dokument soll nur das Dokument geöffnet werden.

Bitte daher um Code,
Besten Dank

guten morgen,

lange rede kurzer sinn, wenn dir die ganzen
autoopen-geschichten nicht schmecken, würde ich eine
dokumentenvariable in die „normal.dot“ vorlage setzen und
dieser einen wert zuweisen

bei jedem aufruf prüfst du diese variable ab und lässt
entweder das formular aufgehen oder nicht…

gruß

rasta

hallo christoph,

eine dokumentenvariable fügst du deinem dokument über

„einfügen“, „feld“, „dokumentautomation“ -docvariable

hinzu.
dazu schreibst du natürlich einen namen zur dok-variable–… wie start

mit alt+f9 kannst du im dokument zwischen den code- und normal-ansicht switchen.

die dok-variable kannst du folgendermaßen zurücksetzen(musst du eh 1mal machen, da die variable keinen wert hat und dementsprechend ne „fehlermeldung“ wirft):

activedocument.variables(„start“) = „0“

Dim feld As Range

For Each feld In ActiveDocument.StoryRanges 'alle felder updaten
feld.Fields.Update
While Not (feld.NextStoryRange Is Nothing)
Set feld = feld.NextStoryRange
feld.Fields.Update
Wend
Next


Private Sub Document_New()

On Error Resume Next

If ActiveDocument.Variables(„start“) = „1“ Then

Exit Sub
End If

UserForm1.Show
End Sub

Private Sub Document_Open()

On Error Resume Next

If ActiveDocument.Variables(„start“) = „1“ Then
Exit Sub
End If

userform1.show
End Sub


sollte dein formular ausgeführt worden sein, schreibst du am ende vom code natürlich noch

'damit dokument beim wiederhotlen start nicht mit code losläuft
ActiveDocument.Variables(„start“) = 1

so, ich hoffe dir geholfen zu haben

viele grüße

rasta

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

VBA Word 2k/XP - Dokumentenvariable
Danke zuerst einmal für die ausführliche Antwort.

Die Dokumentenvariable habe ich soweit begriffen und auch ausprobiert.
Ich sehe aber leider nicht, wie ich den Code so anpassen kann, dass es mein Problem löst.

Es geht ja darum, dass ich beim Aufstarten von Word eine Abfrage (Nach einem Unterschied zwischen einem leeren und einem bereits bearbeiteten Dokument) auf das aktuelle Dokument automatisch machen kann.

Den Code, den du geschrieben hast, habe ich mit dem folgenden Code gelöst:
Sub AutoNew()
frmDokuvorlage.Show
End Sub

Das genügt für meine Anwendung völlig aus.

Das Problem liegt beim Aufstarten von Word.
Wenn Word über das Icon (winword.exe) gestartet wird, dann erscheint ein leeres Dokument. Leider nimmt es keinen Bezug auf den Document_New (AutoNew) Befehl. Ich will/muss daher eine Möglichkeit finden, wie ich beim Aufstarten von Word feststellen kann, ob das Dokument leer ist oder ob der User ein Dokument ausgewählt und geöffnet hat, das er bereits bearbeitet hat.

Ich schweife da mal bisschen ab:
Word kann eigentlich über zwei Arten geöffnet werden.
1. Möglichkeit:
In dem das Icon (Die Verknüpfung oder direkt das Winword.exe Symbol angewählt wird) oder in dem der Befehl „winword“ in „Start - Ausführen…“ eingegeben wird.

2. Möglichkeit:
In dem der User auf ein, für den Computer zugängliches, bereits vorhandenes Dokument klickt und somit öffnet.

Word bezieht sich bei einem Dokument immer auf eine Dokumentenvorlage. Normalerweise ist es die „Normal.dot“ - Vorlage, welche aber nicht geöffnet wird.

Mit einer Dokumentenvariable kann ich daher nicht in normal.dot die Abfrage machen, weil es nicht geöffnet ist und ich den Befehl ActiveDocument oder ThisDocument nicht verwenden kann, da noch kein Dokument offen ist. Ausser ich würde das Makro manuell starten, was ich aber wiederum nicht anwenden will.

Mit AutoExec() habe ich das selbe Problem. Mit diesem Befehl führt Word den Code bereits vor dem Öffnen des Dokuments aus. Somit kann eine Abfrage mit Hilfe von ActiveDocument oder sonst einem Befehl, der sich direkt aufs Dokument bezieht, vergessen werden.

Es müsste entweder eine Möglichkeit geben, wie das AutoExec() nach dem Öffnen des Dokuments gestartet/aufgerufen werden kann. (mit Hilfe von vielleicht einer Verzögerung) Also AutoExec() Now + TimeValue „00:00:05“ oder so ähnlich.
Oder es gäbe eine andere Variante zum automatischen Aufruf eines Makros beim Starten von Word (z.B. die Dokumentvariable)

Wenn ich wüsste wo, oder wie Word ein leeres Dokument erstellt, dann könnte man Abfragen ob das zu öffnende Dokument im Pfad X ist. Wenn ja, dann soll er das Formular öffnen, ansonsten nicht.

Besten Dank nochmals Rasta, hat mir leider nicht weitergeholfen oder ich habe bei deinem Code etwas noch nicht ganz verstanden.

Hoffe auf weitere Ideen,
Viele Grüsse,
Christoph

hallo christoph,

eine dokumentenvariable fügst du deinem dokument über

„einfügen“, „feld“, „dokumentautomation“ -docvariable

hinzu.
dazu schreibst du natürlich einen namen zur dok-variable–…
wie start

mit alt+f9 kannst du im dokument zwischen den code- und
normal-ansicht switchen.

die dok-variable kannst du folgendermaßen zurücksetzen(musst
du eh 1mal machen, da die variable keinen wert hat und
dementsprechend ne „fehlermeldung“ wirft):

activedocument.variables(„start“) = „0“

Dim feld As Range

For Each feld In ActiveDocument.StoryRanges 'alle felder
updaten
feld.Fields.Update
While Not (feld.NextStoryRange Is Nothing)
Set feld = feld.NextStoryRange
feld.Fields.Update
Wend
Next


Private Sub Document_New()

On Error Resume Next

If ActiveDocument.Variables(„start“) = „1“ Then

Exit Sub
End If

UserForm1.Show
End Sub

Private Sub Document_Open()

On Error Resume Next

If ActiveDocument.Variables(„start“) = „1“ Then
Exit Sub
End If

userform1.show
End Sub


sollte dein formular ausgeführt worden sein, schreibst du am
ende vom code natürlich noch

'damit dokument beim wiederhotlen start nicht mit code
losläuft
ActiveDocument.Variables(„start“) = 1

so, ich hoffe dir geholfen zu haben

viele grüße

rasta

guten morgen christoph,

zu so früher stunde bin ich schon etwas verwirrt- von wegen autoopen und autonew usw :smile:

also, generell schreibe ich die dok-variable in den header(dann fliegt sie nicht irgendwo im dokument rum)- falls du nicht weisst, wo du sie hinschreiben sollst

wieso schreibst du das gezeter mit der dok-variable nicht in die normal.dot?

aölle zukünftigen erstellten dokumente werden nach dem gewünschten muster funtkionieren.

das die bereits vorhandenen nicht funzen, bzw. nachgearbeitet werden müssen, ist klar,

wenn beim starten von winword ein leeres dokument geöffnet wird, ist auf jeden fall eine „dot“ (vorlage, in der regel „normal.dot“) am werk.

schade, das es dir nicht weiterhilft, ich bin mir aber sicher das es eine lösung gibt – muss mich leider mal ans werk machen-

viele grüße

rasta

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

VBA Word 2k/XP - Dokumentenvariable
So, hab mir mal paar Tage Bedenkzeit gegönnt :smile:

Auch wenn ich die DocVariable in der Normal.dot Datei habe, nützt mir das nichts. Denn das Problem liegt woanders.

Lassen wir mal einfachshalber den Code weg, wie ich eine DocVariable einfüge und wie ich die dann auch updaten kann.

Frage:
Ich habe zwei Dokumente.
Ein Dokument besitzt eine DocVariable „1“,
das andere Dokument eine DocVariable „2“.

Ich kann nun sehr wohl abfragen, ob die DocVariable „1“ oder „2“ ist. Das geht aber nur (und hier ist der springende Punkt), wenn ich ein Dokument öffne (Befehl: „Datei - Öffnen…“) oder wenn ich ein Dokument erstelle (Befehl: „Datei - Neu…“)

Es geht aber nicht , wenn ich das Dokument aus einem Ordner heraus öffnen will und die Wordapplikation noch nicht geöffnet ist.

Denn genau dann geht das Abfragen mit Hilfe von ActiveDocument nicht.
Ich werde weiterhin mit den DocVariablen herumtüffteln. Wenn ichs herausfinde, gibts nen *proll-Post*

hallo christoph,

Lassen wir mal einfachshalber den Code weg, wie ich eine
DocVariable einfüge und wie ich die dann auch updaten kann.

Frage:
Ich habe zwei Dokumente.
Ein Dokument besitzt eine DocVariable „1“,
das andere Dokument eine DocVariable „2“.

entschuldige wenn ich blöd frage, wir sprechen von einer docvariable mit dem wert „1“ bzw. „2“ ?

Ich kann nun sehr wohl abfragen, ob die DocVariable „1“ oder
„2“ ist. Das geht aber nur (und hier ist der springende
Punkt), wenn ich ein Dokument öffne (Befehl: „Datei -
Öffnen…“) oder wenn ich ein Dokument erstelle (Befehl: "Datei

  • Neu…")

Es geht aber nicht , wenn ich das Dokument aus einem
Ordner heraus öffnen will und die Wordapplikation noch
nicht geöffnet
ist.

??? was meinst du damit? aus einem ordner heraus öffnen?
meinst du, die doc -datei im verzeichnis doppelklicken?(müsste aber auch ein „open“-ereignis absetzen)

oder meinst du über activeX?(z.b. von excel aus?)

Denn genau dann geht das Abfragen mit Hilfe von ActiveDocument
nicht.

wenn zudem zeitpunkt activedocument nicht funzt-- probiere doch mal das „document“ direkt anzusprechen.

in excel sage ich z.b. „activesheet…“, zum expliziten ansprechen schreibe ich „sheet(0)…“

Ich werde weiterhin mit den DocVariablen herumtüffteln. Wenn
ichs herausfinde, gibts nen *proll-Post*

Proll-Post
Hi Rasta,
Habe noch bisschen mit den Docvariablen herumprobiert und da kam mir der Gedanke, dass ich nicht abfragen kann, ob ein leeres oder ein bereits beschriebenes Dokument geöffnet wird. Nämlich dann, wenn Word auch gestartet werden muss.

Ich bin mit den DocVariablen immer inetwa auf die selben Lösungen gekommen, wie mit AutoOpen(), AutoNew()…

So habe ich mich entschieden, einen anderen Weg einzuschlagen. Die Lösung beinhaltet nun eine Abfrage, die bei jedem wechseln des aktiven Dokuments abfragt, ob es ein leeres Dokument ist.

Hier mal der Code, um es ein bisschen verständlicher darzustellen:
(Das hier ist eine vereinfachtere, abgekürzte Darstellung)

' Klassenmodul
Option Explicit
¶
Public WithEvents wdAppl As Word.Application
¶
Private Sub wdAppl\_DocumentChange()
 Call MsgDocChange
End Sub
¶
¶
' Modul
' Deklaration
Private Declare Function SearchPath Lib "kernel32" \_
 Alias "SearchPathA" ( \_
 ByVal lpPath As String, \_
 ByVal lpFileName As String, \_
 ByVal lpExtension As String, \_
 ByVal nBufferLength As Long, \_
 ByVal lpBuffer As String, \_
 ByVal lpFilePart As String) As Long
¶
Dim X As New EventDocWindowChange
¶
Sub EventDocWindowChange\_Handler()
 Set X.wdAppl = Word.Application
End Sub
¶
'AutoExec wird automatisch aufgerufen, beim Starten von Word
' oder beim Laden einer globalen Vorlage.
Sub AutoExec()
 Call EventDocWindowChange\_Handler
End Sub
¶
' Abfrage, ob actives Dokument "Dokument\*.doc" entspricht.
' Also ein leeres Dokument ist.
Sub MsgDocChange()
 If Not Documents.Count = 0 Then
 If ActiveDocument.Name Like "Dokument\*" Then
 frmDokuvorlage.Show
 End If
 End If
End Sub
¶
Sub Doku1()
 Call Dokusearch
 Call F\_Doku1
End Sub
¶
Sub Doku2()
 Call Dokusearch
 Call F\_Doku2
End Sub
¶
Sub Doku3()
 Call Dokusearch
 Call F\_Doku3
End Sub
¶
' Suche nach dem richtigen Pfad. Da dieses Makro unter Win2k/XP
' & Win98/ME funktionieren muss.
Function Dokusearch()
¶
Dim sFile As String
Dim nResult As String
Dim sBuffer As String
¶
' Datei, nach der gesucht werden soll
 sFile = "normal.dot"
¶
' Buffer für die Rückgabe des Verzeichnisses
 Const MAX\_PATH = 260
 sBuffer = Space$(MAX\_PATH)
¶
' Suchvorgang starten...
 nResult = SearchPath(vbNullString, sFile, "", Len(sBuffer), \_
 sBuffer, vbNullString)
¶
 If nResult \> 0 Then
 ' Datei gefunden
 sBuffer = Left(sBuffer, InStr(sBuffer, "\" & sFile))
 Else
 MsgBox "Datei nicht gefunden!"
 End If
 ChangeFileOpenDirectory \_
 sBuffer
End Function
¶
' Da es eine Dokumentenvorlage (.dot) Datei ist, sollte diese nicht
' bearbeitet und abgespeichert werden dürfen. Mit Hilfe von
' ReadOnly:=True öffne ich die Datei Schreibgeschützt.
Function F\_Doku1()
 Documents.Open FileName:="""Doku1.dot""", \_
 ReadOnly:=True
End Function
¶
Function F\_Doku2()
 Documents.Open FileName:="""Doku2.dot""", \_
 ReadOnly:=True
End Function
¶
Function F\_Doku3()
 Documents.Open FileName:="""Doku3.dot""", \_
 ReadOnly:=True
End Function

Das entspricht inetwa dem Code, welchen ich gesucht habe.
Gibt zwar noch ganz wenig kleinere Fehler, die aber ein „normaler“ User nicht finden würde. :smile:

Falls du den ganzen Code ansehen willst, würde ich dir den gerne zuschicken.

Besten Dank nochmals für die Hilfe, Rasta.
Mit freundlichen Grüssen,
Christoph