Discussion:
Makro für Datei-Speicherung
(zu alt für eine Antwort)
Lothar Geyer
2004-01-10 22:41:39 UTC
Permalink
Ich kann zwar Visual Basic, aber mit Word und VBA tue ich mir doch recht
hart.

Ich brauche ein Makro, das von einem VB-Programm aus angesprochen werden
kann. Das VB-Programm setzt nur eine Variable auf einen Dateinamen
(inklusive Pfad). Wenn die Variable gesetzt ist (default ist sie
vbNullString), soll das Makro folgendes machen:

bei jedem Speichern des Dokumentes soll eine zusätzliche Speicherung
unter dem angegebenen Dateinamen erfolgen.

Das Makro muß also die Variable getrennt für jedes geöffnete Dokument
halten.

Hintergrund (falls jemand einen besseren Vorschlag hat nehme ich den
gerne entgegen):
Von dem VB-Programm aus können Dokumente erstellt werden. Dabei werden
Vorlagen geöffnet, Texte eingefügt usw. usf. Das funktioniert auch
prächtig. Das fertige Dokument soll dann aufgehoben werden, wobei der
Name des Dokuments in einer Datenbank verewigt wird. Da der Anwender
auch nach der Bearbeitung durch das VB-Programm weitere Änderungen
durchführen kann, und auch das endgültige Dokument unter einem anderen
Verzeichnis speichern können soll, muß ich eine Kopie in einem
definierbaren Verzeichnis speichern.

Das Makro sollte außerdem als externe Datei erstellt werden, so daß es
jederzeit wieder deinstalliert werden kann. Ich weiß von anderen
Anwendungen, die solch ein Makro als .dot-Datei unter
MSOffice\Office\Startup abgelegt haben.

Für eine (ausführliche) Anleitung, wie das Makro zu programmieren ist
und wie man so eine .dot-Datei nur mit dem Makro erstellt bin ich sehr
dankbar.

Lothar Geyer
Andreas Preugschat
2004-01-11 10:14:16 UTC
Permalink
Post by Lothar Geyer
Ich brauche ein Makro, das von einem VB-Programm aus angesprochen werden
kann. Das VB-Programm setzt nur eine Variable auf einen Dateinamen
(inklusive Pfad). Wenn die Variable gesetzt ist (default ist sie
vbNullString), soll das Makro folgendes machen:.........
Hallo Lothar,
ich habe versucht, dein Problem nachzuvollziehen:
Wenn ich das richtig verstanden habe, erzeugt dein VB-Programm aus einer
Vorlage ein Worddokument, fügt Werte ein und speichert das Ganze unter einem
Dateinamen, der in einer Datenbank gespeichert wird. Zusätzlich soll jetzt
eine Kopie dieses Dokuments erzeugt werden, auf die der Anwedner Zugriff hat
und ggf. ändern kann.

Ich glaube nicht, dass es möglich ist, an Word-Makros
Kommandozeilenparameter externer Programme zu übergeben. Also musst du
deinen Dateinamen und den Pfad in deinem Programm festlegen. Ich habe mir
ein kleines Programm gebastelt, das die Funktionen deines Programms
nachbildet.

Test = Texte
Set appWord = CreateObject("Word.Application")
With appWord
ArbeitsGruppenVorlagen = .Options.DefaultFilePath(3)
.Documents.Add Template:=ArbeitsGruppenVorlagen + "\VBA-Test.dot",
NewTemplate:=False
.ActiveDocument.SaveAs FileName:="test.doc", fileformat:=1
For n = 1 To 2
If .ActiveDocument.Bookmarks.Exists("Ueberg0" & LTrim(Str(n))) Then
.ActiveDocument.Bookmarks("Ueberg0" & LTrim(Str(n))).Range.Text =
RTrim(Test(n - 1))
.ActiveDocument.Save
End If
Next n
End With
appWord.quit

Interessant wird also die Stelle, an der das Original und die Kopie des
Dokuments gespeichert werden sollen. Den Dokumentnamen hast du schon
festgelegt. Bei dieser Einstellung (ActiveDocument.SaveAs
FileName:="test.doc", fileformat:=1) werden die Dateien im
"%Userprofile%\Eigene Dateien" gespeichert.

Ich schlage vor, du liest aus den Benutzereinstellungen die Pfade aus und
kannst somit sicher sein, dass du deine Dateien immer ohne Fehler durch das
Programm speichern kannst:

Kopiepfad= .Options.DefaultFilePath(0) 'Die 0 entspricht dem Pfad zu den
Benutzerdokumenten
.ActiveDocument.SaveAs FileName:= Kopiepfad & "\" & DateiName, fileformat:=1

Hilft dir das weiter?

MfG
Andreas
Lothar Geyer
2004-01-11 12:02:36 UTC
Permalink
Hallo Andreas,
Post by Andreas Preugschat
...
Wenn ich das richtig verstanden habe,
leider nicht ganz ...
Post by Andreas Preugschat
erzeugt dein VB-Programm aus einer
Vorlage ein Worddokument, fügt Werte ein und speichert das Ganze unter einem
Dateinamen, der in einer Datenbank gespeichert wird.
soweit (fast) korrekt. Der Dateiname wird vom Programm vorgegeben. Den
Pfad kann der Anwender auswählen. Auf diese Kopie brauche keine Referenz
in der Datenbank.
Post by Andreas Preugschat
Zusätzlich soll jetzt
eine Kopie dieses Dokuments erzeugt werden, auf die der Anwedner Zugriff hat
und ggf. ändern kann.
das hast Du nicht ganz richtig verstanden.
Der Anwender bearbeitet das Dokument weiter, fügt zusätzliche Texte ein
o.a. Dann speichert er das Dokument ab. Und von diesem Endstand brauche
ich eine Kopie in einem von mir definierten Verzeichnis und mit einem
anderen Namen. Damit habe ich praktisch eine kleine Dokumenten-Verwaltung.


Hintergrund:
Mit dem VB-Programm kann Korrespondenz verwaltet werden. Das mündet in
eine Kontakt-Historie, in der z.B. steht "Am 1.1.04 um 16:30 Brief mit
Vorlage ABC.dot erstellt an Herrn Willy Müller". Und auf diesen Brief
soll zugegriffen werden. Nun kann ich zwar Word starten, Adresse
einfügen usw., aber den Benutzer nicht zwingen, das Dokument (nachdem er
Änderungen durchgeführt hat) unter dem von mir vorgegeben Pfad und Namen
zu speichern. Deshalb dachte ich mir, der einfachste Weg wäre über ein
Makro bei jedem Speichern eine Kopie zu erstellen, die immer dort steht,
wo ich es will. Natürlich möglichst ohne daß der Benutzer es merkt.

Aber Du bringst mich auf eine andere Idee: Wenn man den Menü-Eintrag
"Speichern unter..." deaktivieren könnte (und zwar nur für die
Dokumente, die mir meiner Anwendung gestartet wurden), sollte das auch
reichen.

Eine hundertprozentige Sicherheit, daß ich immer den tatsächlich an den
Empfänger versandten Stand eines Dokumentes habe, gibt es aber sicher
nicht. Er könnte z.B. das Dokument ausdrucken oder per Faxdrucker
versenden und dann nachträglich Änderungen durchführen.

Lothar Geyer
Andreas Preugschat
2004-01-11 12:29:51 UTC
Permalink
Post by Lothar Geyer
Eine hundertprozentige Sicherheit, daß ich immer den tatsächlich an den
Empfänger versandten Stand eines Dokumentes habe, gibt es aber sicher
nicht. Er könnte z.B. das Dokument ausdrucken oder per Faxdrucker
versenden und dann nachträglich Änderungen durchführen.
Hallo Lothar,
das ist dann sicherlich auch eine Frage der Revisionssicherheit. Wenn du mit
vorgegebenen Texten arbeitest, ist die Möglichkeit, dass der Anwender in den
Dokumenten rumpfuschen kann, immer ein Risiko. Unter diesen Umständen könnte
man erwägen, eine Dokumentvorlage zu entwickeln, die im Menü "Datei"
lediglich die Punkte "Drucken" und "Bennden" hat.
Die Übergabe des Dateinamens könntest du über SaveSetting / GetSetting als
Einstellung in der Registry übergeben. Von dort holt es sich ein
AutoOpen-Makro ab. Wird das Fenster geschlossen, sollte ein AutoClose-Makro
die Speicherung vornehmen.
Die Frage ist natürlich, ob der Anwender nach Beendigung des Programms nicht
mit Word die gespeicherten Dokumente trotzdem öffnen kann. Ich glaube, es
gibt von Windows keine Möglichkeit, dieses wirklich wirksam zu verhindern.
Eventuell wäre es ratsam, die Dokumente mit Dokumentschutz und einem
Zufallskennwort abzuspeichern, um ein Minimum an Sicherheit zu erzeugen.

Andreas
Lothar Geyer
2004-01-11 13:19:57 UTC
Permalink
Hallo Andreas,
Post by Andreas Preugschat
...
Post by Lothar Geyer
Eine hundertprozentige Sicherheit, daß ich immer den tatsächlich an den
Empfänger versandten Stand eines Dokumentes habe, gibt es aber sicher
nicht. Er könnte z.B. das Dokument ausdrucken oder per Faxdrucker
versenden und dann nachträglich Änderungen durchführen.
Hallo Lothar,
das ist dann sicherlich auch eine Frage der Revisionssicherheit. Wenn du mit
vorgegebenen Texten arbeitest, ist die Möglichkeit, dass der Anwender in den
Dokumenten rumpfuschen kann, immer ein Risiko. Unter diesen Umständen könnte
man erwägen, eine Dokumentvorlage zu entwickeln, die im Menü "Datei"
lediglich die Punkte "Drucken" und "Bennden" hat.
die Dokumenten-Vorlagen soll der Anwender selbst erstellen bzw. ändern
können. Dort kann ich das also schlecht unterbringen.

Besteht die Möglichkeit, vom VB-Programm aus das Datei-Menü für ein
Dokument zu ändern (also z.B. "Speichern unter" zu disablen)? Das wäre
ein erster Schritt. Falls ja, wie geht das?
Post by Andreas Preugschat
Die Übergabe des Dateinamens könntest du über SaveSetting / GetSetting als
Einstellung in der Registry übergeben. Von dort holt es sich ein
AutoOpen-Makro ab. Wird das Fenster geschlossen, sollte ein AutoClose-Makro
die Speicherung vornehmen.
Die Frage ist natürlich, ob der Anwender nach Beendigung des Programms nicht
mit Word die gespeicherten Dokumente trotzdem öffnen kann. Ich glaube, es
gibt von Windows keine Möglichkeit, dieses wirklich wirksam zu verhindern.
Eventuell wäre es ratsam, die Dokumente mit Dokumentschutz und einem
Zufallskennwort abzuspeichern, um ein Minimum an Sicherheit zu erzeugen.
Das mit dem Zufallskennwort ist eine gute Idee. Allerdings muß ich
dieses auch wieder entfernen können, wenn der Anwender einen Export aus
dem Dokumenten-Archiv durchführt. In diesem Falle kopiere ich die Datei
aus dem Archiv und stelle sie in einem definierbaren Verzeichnis zur
Verfügung.

Zur Praxis:
- Wie erstelle ich so eine .dot-Datei mit den Makros?
- Wie steuere ich die Aktivierung der Makros, daß sie nur bei Dokumenten
aktiv werden, die ich mit meiner Anwendung erstellt / geöffnet habe?
- Wie disable ich per Programm den "Speichern unter"-Eintrag?
- Wie setze ich ein Kennwort?
- Wie entferne ich ein Kennwort?

Vielen Dank schon mal für Deine Hilfe.

Lothar Geyer
Andreas Preugschat
2004-01-11 15:30:39 UTC
Permalink
Post by Lothar Geyer
Besteht die Möglichkeit, vom VB-Programm aus das Datei-Menü für ein
Dokument zu ändern (also z.B. "Speichern unter" zu disablen)? Das wäre
ein erster Schritt. Falls ja, wie geht das?
Dieses Makro erfüllt folgende Funktionen:

1. Es wird eine Dokumentvorlage als AddIn eingebunden. Damit fliegen alle
Menus bis auf "Datei" und "Hilfe" raus.
2. Ein Teil der Sybolleisten wird unsichtbar gemacht.

Die umgelehrte Reihenfolge sollte alles rückgängig machen.

Sub Makro2()
AddIns.Add FileName:="C:\Programme\Microsoft
Office\Vorlagen\Restrict.dot" , Install:=True
CommandBars("Standard").Visible = False
CommandBars("Formatting").Visible = False
With ActiveDocument
.UpdateStylesOnOpen = False
.AttachedTemplate = "Normal.dot"
End With
End Sub
wirklich zufälliges Kennwort :-)))
Post by Lothar Geyer
- Wie erstelle ich so eine .dot-Datei mit den Makros?
Ich habe hier ein Muster:
http://home.t-online.de/home/preugschat-berlin/VBA/
Post by Lothar Geyer
- Wie steuere ich die Aktivierung der Makros, daß sie nur bei Dokumenten
aktiv werden, die ich mit meiner Anwendung erstellt / geöffnet habe?
- Wie disable ich per Programm den "Speichern unter"-Eintrag?
- Wie setze ich ein Kennwort?
- Wie entferne ich ein Kennwort?
Ich stelle mir das so vor:

Sub UebergabeAnWord()
Dim Anw, Appl As Variant
Dim appWord
Dim docWord
Dim ArbeitsGruppenVorlagen As String
Dim Test As Variant
Dim n As Long
Test = Texte
Set appWord = CreateObject("Word.Application")
With appWord

ArbeitsGruppenVorlagen = .Options.DefaultFilePath(3)
.Documents.Add Template:=ArbeitsGruppenVorlagen + "\VBA-Test.dot",
NewTemplate:=False
'********'Hier wird das AddIn zum Restriktieren von Word
geladen:************************************
.AddIns.Add FileName:="C:\Programme\Microsoft
Office\Vorlagen\Restrict.dot" , Install:=True
.ActiveDocument.SaveAs FileName:="test.doc", fileformat:=1
.................

AutoClose-Makro in "Restrict.dot"

Sub main()
Speichern = GetSetting("LGeyer", "Dokumente", "Pfad")
ActiveDocument.Protect Password:="zufallskennwort", NoReset:=False,
Type:=2
ActiveDocument.SaveAs FileName:=Speichern, fileformat:=1
AddIns.Add FileName:="C:\Programme\Microsoft
Office\Vorlagen\Restrict.dot" _
, Install:=False
CommandBars("Standard").Visible = True
CommandBars("Formatting").Visible = True
End Sub


Kennwortgeschütztes Dokument öffnen:
If ActiveDocument.ProtectionType >= 0 Then ActiveDocument.Unprotect
"zufallskennwort"

Fragen beantwortet?

Andreas


.
Lothar Geyer
2004-01-11 17:51:20 UTC
Permalink
Hallo Andreas

mir dämmert, wie Du das angehen willst. Und das scheint auch das zu
ermöglichen, was ich brauche. Aber ich muß mir das noch in Ruhe
durchdenken (wahrscheinlich nicht mehr heute). Vorab noch ein/zwei Fragen:

- Wie erzeuge ich eine Restrict.dot selbst? Ich weiß zwar, wie ich eine
"normale" .dot als Briefvorlage erstelle. Aber wie ich dort auch das
Menü u.a. ändere, habe ich noch nie probiert.

- Da die Restrict.dot nur für jene Dokumente geladen wird, die auch mit
meiner App erstellt/geöffnet wurden: kann (falls ich die entsprechenden
Menüpunkte offen lasse) der Anwender auch weitere Dokumente manuell
öffnen, für die dann alle Menüpunkte (auch die in Restrict.dot
entfernten) verfügbar sind? D.h. die Anzahl der Menüpunkte ändert sich
beim Umschalten zwischen den Dokumenten?

Lothar Geyer
Andreas Preugschat
2004-01-11 19:51:03 UTC
Permalink
Post by Lothar Geyer
Hallo Andreas
- Wie erzeuge ich eine Restrict.dot selbst? Ich weiß zwar, wie ich eine
"normale" .dot als Briefvorlage erstelle. Aber wie ich dort auch das
Menü u.a. ändere, habe ich noch nie probiert.
Ich habe hier Word 97 und Word 2000: Die Bearbeitung der Menüs ist in beiden
Versionen gleich, sodass ich davon ausgehe, dass dies auch für höhere
Versionen gelten sollte:

Erstelle eine neue Vorlage über

Datei--> Neu "Leeres Dokument" Neu erstellen (Vorlage)

Ansicht-->Symbolleisten-->Anpassen Register: Befehle

Klappe nun das Menü "Datei" aufŽ, Klicke auf ein Item. Der Eintrag wird
umrahmt. Du kannst ihn nun aus dem Menü in das Dokument ziehen, dann
verschwindet die Zeile aus dem Menü. Das kannst duch auch mit ganzen Menüs
machen.

Abschließend speichern.

Dann mit Alt+F11 den Makroeditor öffnen und das AutoClose Makro eingeben.
Das ist auch eine Schwachstelle. Ich weiß im Augenblick auch nicht, wie man
diese Tastenkombination unterdrücken kann (für die Restrict.dot).
Post by Lothar Geyer
- Da die Restrict.dot nur für jene Dokumente geladen wird, die auch mit
meiner App erstellt/geöffnet wurden: kann (falls ich die entsprechenden
Menüpunkte offen lasse) der Anwender auch weitere Dokumente manuell
öffnen, für die dann alle Menüpunkte (auch die in Restrict.dot
entfernten) verfügbar sind? D.h. die Anzahl der Menüpunkte ändert sich
beim Umschalten zwischen den Dokumenten?
Unter Word 2000 läuft das einwandfrei. Das Dokument, das mit der Vorlage
geöffnet wurde, ist restriktiert. Startet man eine weitere Instanz von Word,
werden die normalen Einstellungen verwendet. Bei Word 97 geht es vielleicht
auch, wenn man Word nochmals in einem neuen Fenster startet.

Das Programm würde ich gerne Mal sehen.......
brauchst du einen Beta-Tester :-))

Andreas
Lothar Geyer
2004-01-12 16:57:38 UTC
Permalink
Hallo Andreas,

so nebenbei: gibt es eine Möglichkeit, einem Makro in Word von meiner
VB-Anwendung einen Parameter zu übergeben? Oder sonst irgendwie von VB
aus eine Variable zu belegen, die von einem Makro verwendet werden kann?
Post by Andreas Preugschat
...
Das Programm würde ich gerne Mal sehen.......
brauchst du einen Beta-Tester :-))
ich hoffe, Du hast meine offline-Mail erhalten.

Lothar Geyer
Martin Seelhofer
2004-01-12 17:08:48 UTC
Permalink
Salut Lothar

Das Ganze geht mit der Run-Methode des Application-Objekts:

Application.Run "MeinMakro", param1, param2, etc.

Oder aus VB mit z.B. einer Variable 'wd':

wd.Run "MeinMakro", param1, param2, ...

Zu Beachten ist, dass für MeinMakro der absolute "Pfad" benutzt
werden muss, damit das Makro gefunden werden kann. Liegt das
Makro z.B. in der Standardvorlage Normald.dot vor, so lautet
der vollständige Pfad für das Makro "ListenTest" im Modul "basListe"
beispielsweise wie folgt: "Normal.basListe.ListenTest".

Das Resultat kannšübrigens auch abgefangen werden:

res = wd.Run ( ... )


Gruss,
Martin
Post by Lothar Geyer
Hallo Andreas,
so nebenbei: gibt es eine Möglichkeit, einem Makro in Word von meiner
VB-Anwendung einen Parameter zu übergeben? Oder sonst irgendwie von VB
aus eine Variable zu belegen, die von einem Makro verwendet werden kann?
Post by Andreas Preugschat
...
Das Programm würde ich gerne Mal sehen.......
brauchst du einen Beta-Tester :-))
ich hoffe, Du hast meine offline-Mail erhalten.
Lothar Geyer
Lothar Geyer
2004-01-12 17:30:28 UTC
Permalink
Hallo Martin,
Post by Martin Seelhofer
Application.Run "MeinMakro", param1, param2, etc.
wd.Run "MeinMakro", param1, param2, ...
dadurch wird doch aber das Makro ausgeführt, oder?

Gibt es auch eine Möglichkeit, daß ein Makro, das z.B. bei Speichern
eines Dokumentes ausgeführt wird, eine Variable verwendet, die beim
Öffnen des Dokumentes von der VB-Anwendung belegt wurde?

Lothar Geyer
Martin Seelhofer
2004-01-12 18:23:30 UTC
Permalink
Salut Lothar
Post by Lothar Geyer
Gibt es auch eine Möglichkeit, daß ein Makro, das z.B. bei Speichern
eines Dokumentes ausgeführt wird, eine Variable verwendet, die beim
Öffnen des Dokumentes von der VB-Anwendung belegt wurde?
Dafür kannst Du die Variables-Collection des Document-Objekts
benutzen:

ActiveDocument.Variables("MeinPfad").Value = "C:\Dat\Backup"

Ist allerdings immer vom Typ String, was jedoch nicht *so* ein
grosses Problem ist, da Du ja String-Werte jederzeit auch in
andere Werte umwandeln kannst (z.B. CBool("True") oder
CLng("157") etc.).

Ein anderer Ansatz sind die CustomDocumentProperties. Im
Unterschied zu den Variables (unsichtbar für Benutzer), sind
diese dann jedoch über Datei | Eigenschaften | Anpassen
einseh- und änderbar...


Gruss,
Martin
Post by Lothar Geyer
Hallo Martin,
Post by Martin Seelhofer
Application.Run "MeinMakro", param1, param2, etc.
wd.Run "MeinMakro", param1, param2, ...
dadurch wird doch aber das Makro ausgeführt, oder?
Gibt es auch eine Möglichkeit, daß ein Makro, das z.B. bei Speichern
eines Dokumentes ausgeführt wird, eine Variable verwendet, die beim
Öffnen des Dokumentes von der VB-Anwendung belegt wurde?
Lothar Geyer
Andreas Preugschat
2004-01-13 05:23:25 UTC
Permalink
Post by Martin Seelhofer
Salut Lothar
Application.Run "MeinMakro", param1, param2, etc.
Hallo Martin,
da würde ich gerne doch noch einmal nachhaken wollen: Ich habe mir beim
Testen der Run-Methode mit Parameterübergabe gestern fürchterlich einen
abgebrochen. Es funktionierte nicht.

Und auch in der Hilfe zur Word 97 steht:

"Mit der Run-Methode können Sie keine Parameter einem Makro übergeben."

Mir ist auch so, als ob das auch für Word 2000 gelten sollte. Ist das bei
höheren Word-Versionen jetzt anders?

MfG
Andreas
Martin Seelhofer
2004-01-13 09:15:29 UTC
Permalink
Salut Andreas
Post by Andreas Preugschat
da würde ich gerne doch noch einmal nachhaken wollen: Ich habe mir beim
Testen der Run-Methode mit Parameterübergabe gestern fürchterlich einen
abgebrochen. Es funktionierte nicht.
Das ist jetzt vor allem Definitionssache. Unter dem Begriff "Makro"
verstehen
die meisten eine (öffentliche) Sub ohne Parameter. In diesem Sinne war meine
Erklärung zur Run-Methode etwas unglücklich, denn natürlich kann man einer
Sub, die keine Parameter verlangt, auch keine Parameter übergeben. Aber
ich nehme an, dass Dir das ja schon klar ist ;-)

Zudem kann die Run-Methode nicht mit Objekt-Referenzen arbeiten, sondern
nur mit Werten der Basistypen...

Ansonsten muss ich zugeben, dass Word 97 bzgl. Run-Methode noch nicht
so fortgeschritten war, wie seinerzeit beispielsweise Excel. In Excel 97
konnten
der Run-Methode nämlich bereits Parameter übergeben und auch das Resultat
abgefangen werden. In Word 97 - wie Du richtig bemerkt hast - jedoch noch
nicht.

Ab Word XP sollte das Ganze dann aber klappen. Falls nicht gibt es ab XP
auch noch die CallByName-Variante von VBA.

Für die Übergabe eines Wertes an ein Dokument, wobei dieser Wert später
von einem VBA-Makro ausgelesen werden soll, würde ich jedoch stattdessen
mit den Dokumentvariablen (Variables) oder den benutzerdefinierten Dokument-
Eigenschaften (CustomDocumentProperties) arbeiten. (Siehe auch das separate
Posting dazu).


Gruss,
Martin
Post by Andreas Preugschat
Post by Martin Seelhofer
Salut Lothar
Application.Run "MeinMakro", param1, param2, etc.
Hallo Martin,
da würde ich gerne doch noch einmal nachhaken wollen: Ich habe mir beim
Testen der Run-Methode mit Parameterübergabe gestern fürchterlich einen
abgebrochen. Es funktionierte nicht.
"Mit der Run-Methode können Sie keine Parameter einem Makro übergeben."
Mir ist auch so, als ob das auch für Word 2000 gelten sollte. Ist das bei
höheren Word-Versionen jetzt anders?
MfG
Andreas
Thomas Gahler
2004-01-12 20:47:58 UTC
Permalink
Hallo Lothar
Aber sie gilt immer für alle in der Word-Instanz
.AddIns.Add myVorlage, True
Ist logisch, von der Hierarchie her. Ein Addin ist für das ganze Word da.
Könnte
.AttachedTemplate = myVorlage
etwas bringen?
Ja, ist ein muss und neue Dokumente gleich auf dieser Vorlage basierend
erzeugen.
Beispiel "Normal.dot" eingetragen ist.
Programmierer, welche etwas in die Normal.Dot eintragen gehören... (egal
was, kannst du selber ausfüllen). Die Normal.Dot gehört dem Anwender. Es
gibt genügend Möglichkeiten um etwas zu erreichen, die Normal.Dot braucht es
*nie*.


--
Thomas Gahler
MVP für WordVBA

- Windows XP, Office XP (SP2)
Lothar Geyer
2004-01-12 21:10:29 UTC
Permalink
Hallo Thomas
Post by Thomas Gahler
...
Beispiel "Normal.dot" eingetragen ist.
Programmierer, welche etwas in die Normal.Dot eintragen gehören... (egal
was, kannst du selber ausfüllen). Die Normal.Dot gehört dem Anwender. Es
gibt genügend Möglichkeiten um etwas zu erreichen, die Normal.Dot braucht es
*nie*.
deswegen meine Vorsicht.

D.h. wenn ich

.AttachedTemplate = myVorlage

verwende, wird die Normal.dot trotzdem geladen, und meine .dot dazu.
Oder ist das falsch.

Lothar Geyer
Thomas Gahler
2004-01-13 06:39:11 UTC
Permalink
Hallo Lothar
Post by Lothar Geyer
verwende, wird die Normal.dot trotzdem geladen, und meine .dot dazu.
Oder ist das falsch.
Die Normal.Dot ist immer geladen und stellt die enthaltenen Autotexte,
Makros usw. zur Verfügung. Also ein verhalten wie ein Addin. Die Normal.Dot
ist normalerweise auch mit dem Dokument verbunden (wenn nur der Knopf
'LeeresBlatt' gedrückt wird). Mit '.AttachedTemplate' wird deine spezielle
Vorlage mit dem Dokument verbunden und stellt zusätzlich dir darin
enthaltenen Autotexte, Makros Symbolleisten usw. zur Verfügung.
Bei Namenskonflikten (z.B. ein makro mit gleichen Namen in Vorlage und
Normal.Dot) zieht diese Reihenfolge
- Dokument
- AttachedTemplate
- Normal.Dot
- Addin (zuerst Startup, dann in externe; immer in alfabethischer
Reihenfolge)
- Word

[Auflistung: Angaben ohne Gewähr]




--
Thomas Gahler
MVP für WordVBA

- Windows XP, Office XP (SP2)
Lothar Geyer
2004-01-13 07:37:44 UTC
Permalink
Hallo Thomas,

ich habe mir das nun zusammengebaut, meine Routinen in meiner VB-App
sehen wie folgt aus:

Public Sub startTextverarbeitung(interactiv As Boolean, useOld As Boolean)
Dim tmpErr As Integer

On Error Resume Next
Set MSWord = GetObject(, "word.application")
tmpErr = Err.Number
On Error GoTo ErrorHandler
If tmpErr <> 0 And tmpErr <> 429 Then Err.Raise Number:=tmpErr
If tmpErr = 0 Then Exit Sub
Set MSWord = CreateObject("word.application")

dialog = interactiv
If dialog Then
If MSWord.Application.WindowState = wdWindowStateMinimize Then
MSWord.Application.WindowState = wdWindowStateNormal
MSWord.Application.Visible = True
End If
Exit Sub

ErrorHandler:
Select Case Err.Number
Case 440
Err.Raise Number:=vbObjectError + 28765, Description:="Word
konnte nicht gestartet werden."
Case Else
Err.Raise Number:=Err.Number
End Select
End Sub

Public Sub ReadDocument(inputDoc As String)
Dim myVorlage As String

myVorlage = App.Path & "\" & "tmWord.dot"
If Not FileExists(myVorlage) Then myVorlage = ""

On Error GoTo ErrorHandler

With MSWord
.Documents.Open (inputDoc)
If dialog Then
If .Application.WindowState = wdWindowStateMinimize Then
.Application.WindowState = wdWindowStateNormal
.Application.Visible = True
If myVorlage <> "" Then
.ActiveDocument.AttachedTemplate = myVorlage
End If
End If
End With

Exit Sub

ErrorHandler:
Select Case Err.Number
Case 440
Err.Raise Number:=vbObjectError + 28765, Description:="Word
konnte nicht gestartet werden."
Case Else
Err.Raise Number:=Err.Number
End Select
End Sub


Das funktioniert genauso, wie ich das (in der einfachen Variante) haben
wollte. Durch die tmWord.dot wird der Menüpunkt "Sichern als" im Menü
Datei entfernt, und zwar nur für das von meiner VB-App geöffnete
Dokument. Werden andere Dokumente in er gleichen Word-Instanz manuell
geöffnet, gilt diese Restriktion nicht.

Nun eine letzte Frage:
Ist mit dieser Vorgehensweise sichergestellt, daß es zwischen einem
manuell geöffneten Dokument und einem mit meiner App geöffneten nur den
einen Unterschied im Menü gibt? Oder gibt es noch andere (vor allem
bezüglich von Vorlagen, die ja AFAIK hierarchisch aufgebaut sein können)?

Lothar Geyer
Thomas Gahler
2004-01-13 08:38:07 UTC
Permalink
Hallo Lothar
Post by Lothar Geyer
Ist mit dieser Vorgehensweise sichergestellt, daß es zwischen einem
manuell geöffneten Dokument und einem mit meiner App geöffneten nur den
einen Unterschied im Menü gibt?
Jein, soweit ein Dokuemnt auf der normal.Dot basiert würde ich mal behaupten
JA, wenn hingegen ein Dokument auf einer anderen Vorlage basiert (Brief.Dot
oder was auch immer) dann wäre ja möglich, dass das Menü in dieser Vorlage
auch angepasst wurde und dann wären also Unterschiede vorhanden.
Post by Lothar Geyer
Oder gibt es noch andere (vor allem
bezüglich von Vorlagen, die ja AFAIK hierarchisch aufgebaut sein können)?
Vorlagen sind nicht Hierarchisch aufgebaut. Die stehen alle für sich da und
haben keine Abhängigkeit untereinander.




--
Thomas Gahler
MVP für WordVBA

- Windows XP, Office XP (SP2)
Lothar Geyer
2004-01-13 09:54:55 UTC
Permalink
Hallo Thomas,
Post by Thomas Gahler
...
Post by Lothar Geyer
Ist mit dieser Vorgehensweise sichergestellt, daß es zwischen einem
manuell geöffneten Dokument und einem mit meiner App geöffneten nur den
einen Unterschied im Menü gibt?
Jein, soweit ein Dokuemnt auf der normal.Dot basiert würde ich mal behaupten
JA, wenn hingegen ein Dokument auf einer anderen Vorlage basiert (Brief.Dot
oder was auch immer) dann wäre ja möglich, dass das Menü in dieser Vorlage
auch angepasst wurde und dann wären also Unterschiede vorhanden.
Das ist mir klar. Entspricht aber dem, was ich will.
Nur der Vollständigkeit halber: Kann eine andere Vorlage die in meiner
Vorlage getroffene Vereinbarung ("Speichern unter" wird nicht angezeigt)
wieder aufheben?
Post by Thomas Gahler
Post by Lothar Geyer
Oder gibt es noch andere (vor allem
bezüglich von Vorlagen, die ja AFAIK hierarchisch aufgebaut sein können)?
Vorlagen sind nicht Hierarchisch aufgebaut. Die stehen alle für sich da und
haben keine Abhängigkeit untereinander.
Ich dachte immer, ich kann z.B. eine Vorlage MeinBriefPapier.dot
erstellen, die auf Normal.dot basiert. Dann kann ich eine Vorlage
MeinBrief.dot erstellen, die auf MeinBriefPapier.dot basiert. Und dann
eine Vorlage NeueProduktVersion.dot, die auf MeinBrief.dot aufbaut. Und
wenn ich dann in Normal.dot eine Format-Vorlage ändere, wirkt sich das
automatisch auf alle "abhängigen" Vorlagen aus, und eine Änderung in
MeinBrief nur auf NeueProduktVersion.dot.

Lothar Geyer
Martin Seelhofer
2004-01-13 10:11:30 UTC
Permalink
Salut Lothar
Post by Lothar Geyer
Ich dachte immer, ich kann z.B. eine Vorlage MeinBriefPapier.dot
erstellen, die auf Normal.dot basiert. Dann kann ich eine Vorlage
MeinBrief.dot erstellen, die auf MeinBriefPapier.dot basiert. Und dann
eine Vorlage NeueProduktVersion.dot, die auf MeinBrief.dot aufbaut. Und
wenn ich dann in Normal.dot eine Format-Vorlage ändere, wirkt sich das
automatisch auf alle "abhängigen" Vorlagen aus, und eine Änderung in
MeinBrief nur auf NeueProduktVersion.dot.
Nein, sobald Du ein auf der Normal.dot basierendes leeres Dokument
als Vorlage speicherst, ist die Verbindung mit der Normal.dot weg. Alle
Formatvorlagen sind dann in der Vorlage gespeichert und Änderungen
an den Normal.dot-Formatvorlagen wirken sich darauf nicht aus...

Wäre es anders, müssten erhebliche Performance-Verluste in Kauf
genommen werden, da die Formatvorlagen einer Dokument-Vorlage
im schlimmsten Fall bei jedem Öffnen über die aus dutzenden Vorlagen
bestehende Hierarchie hinweg (womöglich sogar noch auf einem Server)
geprüft werden müssten. Nicht gerade ein wünschenswertes Szenario ;-)


Gruss,
Martin
Post by Lothar Geyer
Hallo Thomas,
Post by Thomas Gahler
...
Post by Lothar Geyer
Ist mit dieser Vorgehensweise sichergestellt, daß es zwischen einem
manuell geöffneten Dokument und einem mit meiner App geöffneten nur den
einen Unterschied im Menü gibt?
Jein, soweit ein Dokuemnt auf der normal.Dot basiert würde ich mal behaupten
JA, wenn hingegen ein Dokument auf einer anderen Vorlage basiert (Brief.Dot
oder was auch immer) dann wäre ja möglich, dass das Menü in dieser Vorlage
auch angepasst wurde und dann wären also Unterschiede vorhanden.
Das ist mir klar. Entspricht aber dem, was ich will.
Nur der Vollständigkeit halber: Kann eine andere Vorlage die in meiner
Vorlage getroffene Vereinbarung ("Speichern unter" wird nicht angezeigt)
wieder aufheben?
Post by Thomas Gahler
Post by Lothar Geyer
Oder gibt es noch andere (vor allem
bezüglich von Vorlagen, die ja AFAIK hierarchisch aufgebaut sein können)?
Vorlagen sind nicht Hierarchisch aufgebaut. Die stehen alle für sich da und
haben keine Abhängigkeit untereinander.
Ich dachte immer, ich kann z.B. eine Vorlage MeinBriefPapier.dot
erstellen, die auf Normal.dot basiert. Dann kann ich eine Vorlage
MeinBrief.dot erstellen, die auf MeinBriefPapier.dot basiert. Und dann
eine Vorlage NeueProduktVersion.dot, die auf MeinBrief.dot aufbaut. Und
wenn ich dann in Normal.dot eine Format-Vorlage ändere, wirkt sich das
automatisch auf alle "abhängigen" Vorlagen aus, und eine Änderung in
MeinBrief nur auf NeueProduktVersion.dot.
Lothar Geyer
Lothar Geyer
2004-01-13 11:21:59 UTC
Permalink
Hallo Martin,
Post by Martin Seelhofer
...
Nein, sobald Du ein auf der Normal.dot basierendes leeres Dokument
als Vorlage speicherst, ist die Verbindung mit der Normal.dot weg. Alle
Formatvorlagen sind dann in der Vorlage gespeichert und Änderungen
an den Normal.dot-Formatvorlagen wirken sich darauf nicht aus...
Wäre es anders, müssten erhebliche Performance-Verluste in Kauf
genommen werden, da die Formatvorlagen einer Dokument-Vorlage
im schlimmsten Fall bei jedem Öffnen über die aus dutzenden Vorlagen
bestehende Hierarchie hinweg (womöglich sogar noch auf einem Server)
geprüft werden müssten. Nicht gerade ein wünschenswertes Szenario ;-)
wir sind jetzt zwar vom eigentlichen Thema dieses Threads weg, aber
trotzdem die Frage:
Gibt es eine andere Möglichkeit, so eine Hierarchie zu realisieren?

Es wäre doch fein, wenn ich in 1.dot meine "Corporate Identity"
hinterlegen könnte. Also z.B. Schriftarten usw. Unter 2.dot konstruiere
ich dann mein Briefpapier, wobei die Einstellungen von 1.dot
berücksichtigt werden. Dann erstelle ich eine Vorlage 3.dot, z.B. ein
Rechnungsformular, das als Grundlage das Briefpapier 2.dot hat. Und dann
mache ich ein Angebotsformular, das ebenfalls auf 2.dot zurückgreift.
Und dann wünsche ich mir natürlich, wenn ich z.B. eine Schriftart in
1.dot ändere, daß sich das sowohl auf das Rechnungs- wie auch auf das
Angebots-Formular auswirkt.

Lothar Geyer
Martin Seelhofer
2004-01-13 13:36:00 UTC
Permalink
Salut Lothar
Post by Lothar Geyer
Gibt es eine andere Möglichkeit, so eine Hierarchie zu realisieren?
Na ja, nicht ganz so einfach, jedoch immerhin auch ziemlich zügig
kriegst Du das Ganze mit den Organisieren-Funktionen von Word
hin. Damit kannst du ja beliebige Formatvorlagen kopieren/löschen.
Und da sich das Ganze auch per Makro steuern lässt, könntest Du
das Ganze (mit etwas Aufwand) mithilfe eines VBA-Verwaltungstools
realisieren...


Viel Spass ;-)
Martin
Post by Lothar Geyer
Hallo Martin,
Post by Martin Seelhofer
...
Nein, sobald Du ein auf der Normal.dot basierendes leeres Dokument
als Vorlage speicherst, ist die Verbindung mit der Normal.dot weg. Alle
Formatvorlagen sind dann in der Vorlage gespeichert und Änderungen
an den Normal.dot-Formatvorlagen wirken sich darauf nicht aus...
Wäre es anders, müssten erhebliche Performance-Verluste in Kauf
genommen werden, da die Formatvorlagen einer Dokument-Vorlage
im schlimmsten Fall bei jedem Öffnen über die aus dutzenden Vorlagen
bestehende Hierarchie hinweg (womöglich sogar noch auf einem Server)
geprüft werden müssten. Nicht gerade ein wünschenswertes Szenario ;-)
wir sind jetzt zwar vom eigentlichen Thema dieses Threads weg, aber
Gibt es eine andere Möglichkeit, so eine Hierarchie zu realisieren?
Es wäre doch fein, wenn ich in 1.dot meine "Corporate Identity"
hinterlegen könnte. Also z.B. Schriftarten usw. Unter 2.dot konstruiere
ich dann mein Briefpapier, wobei die Einstellungen von 1.dot
berücksichtigt werden. Dann erstelle ich eine Vorlage 3.dot, z.B. ein
Rechnungsformular, das als Grundlage das Briefpapier 2.dot hat. Und dann
mache ich ein Angebotsformular, das ebenfalls auf 2.dot zurückgreift.
Und dann wünsche ich mir natürlich, wenn ich z.B. eine Schriftart in
1.dot ändere, daß sich das sowohl auf das Rechnungs- wie auch auf das
Angebots-Formular auswirkt.
Lothar Geyer
Lothar Geyer
2004-01-12 20:35:19 UTC
Permalink
Hallo Andreas, Martin,

ich habe mich entschlossen, in der ersten Stufe nur eine "einfache"
Lösung zu realisieren (wegen des Termindrucks). Die schaut so aus, daß
ich das Word-Dokument mit meiner Anwendung öffne, und zwar direkt in
meinem Dokumenten-Speicher. Und daß ich die Menü-Zeile "Speichern unter
..." über eine .dot-Datei ausblende.

Nun habe ich die .dot Datei fertig - und sie funktioniert auch :-) (dank
Eurer Hilfe). Aber sie gilt immer für alle in der Word-Instanz
geöffneten Dokumente. Mein Kode:

myVorlage = App.Path & "\" & "tmWord.dot"
If Not FileExists(myVorlage) Then myVorlage = ""

On Error GoTo ErrorHandler

With MSWord
.Documents.Open (inputDoc)
If dialog Then
If .Application.WindowState = wdWindowStateMinimize Then
.Application.WindowState = wdWindowStateNormal
.Application.Visible = True
If myVorlage <> "" Then
.AddIns.Add myVorlage, True
End If
End If
End With

Ich habe das auch mit

.ActiveDocument.Application.AddIns.Add myVorlage, True

versucht, aber der Effekt war der gleiche. Könnte

.AttachedTemplate = myVorlage

etwas bringen? Ich habe mich nicht getraut, das auszutesten, da in Eurem
Beispiel "Normal.dot" eingetragen ist. Und da ich die Side-Effects nicht
kenne...

Lothar Geyer
Loading...