title image


Smiley Re: Interaktion Word 97
Hallo MartinDeine Anfrage tangiert auch eine halbe MS-Word Problematik.Spontan ist mir eingefallen, dass TextBoxen auf einer UserForm und Text in einem Word-Dokument nur sehr bedingt kompatibel sind.Während das letztere aufwendige Formatiereung enthalten kann, ist das beim ersteren schon mal nicht der Fall. Schon das Abbilden eines Tabulators dürfte bei einer UserForm Kopfzerbrechen bereiten.Vorlagen und AutoText-Bausteine wären dazu eigentlich besser geeignet.Trotzdem habe auch ich schon kleine Projekte erstelle, welche es erlauben, Grunddaten für die Gestaltung eines Word-Dokumentes über UserForms entgegen zu nehmen. Allerdings stand dabei nicht eine aufwendige Formatierung sondern die Substanz im Vordergrund. Es ging konkret um Projektbeschreibungen, wo es vital ist, dass gewisse immer wiederkehrende Elemente auch ganz bestimmt im Dokument enthalten sind; ansonsten das Projektvorschlag schon aus rein formalen Gründen retouniert würde.VBA-technisch ist das Ganze eigentlich klar. Hier einige Splitter: (Actung: Korrektheit der Syntax ist nicht in allen Fällen getestet)1. Markierter Text wird in eine TextBox gestellt (v.v.):---------------------------------------------------------TextBox1.MultiLine = TrueTextBox1.Text = Selection.TextSelection.Text = TextBox1.Text2. Text von TextBox nach Fusszeile und v.v.------------------------------------------------Set oFz = ActiveDocument.Sections(1).Footers(1).RangeoFz.Text = TextBox1.TextSet oFz = ActiveDocument.Sections(1).Footers(1).RangeTextBox1.Text = oFz.Text3. Überschriftsreferenz in Kopfzeile--------------------------------------------if OptionButton1.Value = True thenSet oKz = ActiveDocument.Sections(1).Headers(1).RangeSelection.Fields.Add Range:=oKz, Type:=wdFieldEmpty, Text:="FVREF ""Überschrift 1"""End if4. Komplexere Sachen in Kopf oder Fusszeile--------------------------------------------------Gelingt mir nur, wenn ich die enstprechende "Story" öffne und emuliere was ich auch händisch tun würde.If Optionbutton2.Value = True thenActivedocument.Sections(1).Footers(1).Range.SelectWith Selection.InsertAfter "Seite ".EndKey.Fields.Add Range:=Selection.Range, Type:=wdFieldPage.InsertAfter "von ".EndKey.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, Text:="ANZSEITEN ".ParagraphFormat.Alignment = wdAlignParagraphRightEnd WithActiveWindow.ActivePane.CloseEnd if5. DokumentenEigenschaften nach TextBox und v.v.---------------------------------------------------TextBox1.Text = ActiveDocument.BuiltInProperties("Author").ValueActiveDocument.BuiltInProperties("Author").Value = TextBox1.Value6. Dateiname allokieren (Beim Speichern wird der entsprechende Wert statt Dok1 genommen)----------------------------------------------------With Dialogs(wdDialogFileSummaryInfo).Title = TextBox1.Text.ExecuteEnd WithActiveWindow.Caption = TextBox1.Text7. AutoText nach Textbox und v.v.-------------------------------------------------TextBox1.Text = Templates(ActiveDocument.AttachedTemplate.Name).AutoTextEntries("Firma-Slogan").Valuegeht auch umgekehrtIm übrigens bist Du mit Word grossartig positioniert, wenn es darum geht, Werte über einen Neustrat von Word bzw. Windows zu erhalten. Die Win 3.x Variante mit INI-Dateien kannste glatt beerdigen. Es gibt die Möglichkeit:- AutoText-Elemente (fromatiert mit Grafik) - Dokumenten-Variablen (auch Bezug auf AttachedTemplate möglich)- Custom Dokument Properties (als Erweiterung der BuiltInDocumentProperties - auf Bezug auf Att.... möglich)- Registry auslesen/setzen (PrivateProfileString)Ich verweise hier jeweils auf mein Skript: (siehe unten) (Wahrscheinlich geht jetz die Ganze Formatierung flöte, Zora guckt schon ganz besorgt)GrussSilviaAntrag auf mehr LohnVier Möglichkeiten, wie Sie Informationen in der Word-Anwendung auch über einen Windows-Neustart sichern könnenDokumenten-VariablenSpeicherort: Im Dokument oder in der DokumentenvorlageErstellung: Möglich über Word-Dialog (Einfügen – Feld – DoKVariable) oder innerhalb eines Makros (Add-Methode)Sichtbarkeit: Solange das entsprechende Dokument oder die Vorlage geöffnet istPortabilität: Problemlos möglich, sie wandern mit dem Dokument oder der Vorlage mitSyntax: (Dialog) DOKVARIABLE "Wohnort"Syntax (VBA):ThisDocument.Variables.Add Name:="Wohnort", Value:="Basel"(Variable generieren und gleichzeitig einen Wert zuweisen)ThisDocument.Variables("Wohnort").Value = "Paris"ThisDocument.Fields.Update(Wert neu zuweisen, ändern und sicherstellen, dass die Variable im Dokument neu angezeigt wird.)If ThisDocument.Variables("Wohnort").Value = "Paris" Then _ Sprache = "Französisch"(Abfrage)ThisDocument.Variables("Wohnort").Delete(Die Variable mit dem Namen "Wohnort" wird gelöscht) ACHTUNG: Wegen eines ganz bösen Bugs in Word, sind Dokumenten-Variablen in der Kopf- und Fusszeile nicht möglich. Falls Sie es doch versuchen, werden Sie erleben, wie sich Word formlos von Ihnen verabschiedet. Weichen Sie in diesem Falle auf Dokumenten-Eigenschaften aus. (Siehe nächstes Kapitel) Ein grosser Vorteil der Dokumentenvariablen ist es, dass die in der normalen Word-Umgebung eingefügt werden können und mittels VBA-Code gefüllt werden können beziehungsweise veränderbar sind. Um sicher zu gehen, dass der neue Wert im Dokument auch übernommen wird, sollten Sie im Code sicherstellen, dass die Felder aktualisiert werden. Das können Sie mit dem Code ActiveDocument.Fields.Update bewerkstelligen. Um Dokumenten-Variablen in Ihrem Dokument oder in Ihrer Dokumentenvorlage einzufügen, gehen Sie wie folgt vor: Öffnen Sie das Dokument oder die Vorlage. Falls es sich um eine Vorlage handelt, führen Sie keinen Doppelklick aus, das würde die Vorlage nicht öffnen sondern es würde ein neues Dokument auf der Basis dieser Vorlage erstellt.Setzen Sie im Dokument oder in der Vorlage den Zeiger an eine geeignete Stelle (eine Stelle Ihrer Wahl).Vom Word Hauptmenü wählen Sie "Einfügen – Feld"Wählen Sie in der Liste "Kategorie" den Eintrag "(Alle)"In der Kategorie "Feldname" wählen sie den Eintrag "DokVariable"Wechseln Sie immer noch im gleichen Dialog in das Eingabefeld und vergeben Sie der Variablen einen aussagekräftigen Namen unter dem sie die Variable ansprechen möchten. Vergessen Sie dabei nicht, diesen Variablennamen in Gänsefüsschen zu setzten. Das Eingabefeld sollte also z. B. so aussehen:DOKVARIABLE "RechnungsNr" Falls Sie auf Grund der Konstellation nicht sicher sein können, ob eine Variable mit einem bestimmten Name bereits existiert, sollten Sie sich zuerst vergewissern. Leider lässt sich das Vorhandensein einer Variablen nicht direkt abfragen. Sie müssen sich mit einer Schleife behelfen, wie das im nachstehenden Beispiel demonstriert wird. Versuchen Sie eine bereits existierende Variable nochmals zu definieren, führt dies zu einem Fehler, das Programm wird abgebrochen, solange Sie nicht mit dem Code "On Error Resume Next" arbeiten.Sie können auch auf DokVaribale in einer mit dem Dokument verbundenen Formatvorlage zugreifen. Das geht dann wie folgt:Set oVorlage = ActiveDocument.AttachedTemplate.OpenAsDocumentWith oVorlage Flag = False For each Var in oVorlage.Variables If Var.Name = "AuftragsNr" Then Flag = True Exit For End If Next If Flag = True Then AuftragsNr = .Variables("AuftragsNr").Value + 1 .Variables("AuftragsNr").Value = AuftragsNr Else AuftragsNr = 1 .Variables.Add Name:="AuftragsNr", Value:="1" End if .Close SaveChanges:=wdSaveChangesEnd WithDummy = MsgBox("Die Auftragsnummer lautet wie folgt: " + CStr(AuftragsNr), vbOKOnly)Beim oben aufgeführten Beispiel wird die Auftragsnummer immer um eins nach oben gezählt, abhängig von der Dokumentenvorlage auf der das Word-Dokument basiert.  Dokumenten-EigenschaftenSpeicherort: Im Dokument oder in der DokumentenvorlageErstellung: Es gibt Dokumenten-Eigenschaften, welche bereits im Word-Objekt-Model vorhanden sind; weitere können entweder über den Word-Dialog "Einfügen - Feld..." oder mittels VBA-Code hinzugefügt werden. Genau wie eine Dokumenten-Variablen, können Sie ein Dokumenten-Eigenschaften als Feld in einem Word-Dokument oder einer Dokumentenvorlage verwenden.Sichtbarkeit: Solange das entsprechende Dokument oder die Vorlage geöffnet ist.Portabilität: Problemlos möglich, sie wandern mit dem Dokument oder der Vorlage mit.Syntax: (Dialog) DOKEIEGNSCHAFT "ZuletztGedruckt" Bei diesem Beispiel handelt es sich um eine Word-integrierte Eigenschaft, welche auch ohne VBA-Code von Word gefüllt wird)Syntax (VBA):ThisDocument.CustomDocumentProperties.Add _ Name:="Ort", LinkToContent:=False, _ Type:=msoPropertyTypeString, Value:="Basel"(generieren und gleichzeitig zuweisen)ThisDocument.CustomDocumentProperties("Ort").Value = "Paris"ThisDocument.Fields.Update(Wert neu zuweisen, ändern und sicherstellen, dass der Feldwert im Dokument auch aktualisiert wird.)If ThisDocument.CustomDocumentProperties("Ort").Value = _ "Paris" Then Sprache = "Französisch"(Abfrage)If ThisDocument.BuiltInDocumentProperties("Manager").Value = _ "Geizkragen" Then _ ThisDocument.BuiltInDocumentProperties("Title").Value = _ "Antrag auf mehr Lohn" '(Abfrage und Zuweisung einer BuiltInProperty)ThisDocument.CustomDocumentProperties("Ort").Delete(Löschen einer Dokumenten-Eigenschaft)Sie können selbstverständlich nur benutzerdefinierte (Custom Document Properties) Dokumenten-Eigenschaften löschen. Im übrige gilt das Gleiche, was schon unter dem Kapitel Dokumentenvariablen erwähnt wurde. Um eine Dokumenteneigenschaft mittels Word-Dialog einzufügen, wählen Sie den Feldnamen "DokEigenschaft" anstelle von "DokVariable".Weniger heikel gebärden sich Dokumenten-Eigenschaften beim Löschen. Das Löschen einer nicht vorhandenen Dokumenten-Eigenschaft löst keinen Fehler aus.Eigens definierte Eigenschaften werden als "CustomDocumentProperties" angesprochen, während in Word integrierte Eigenschaften mit "BuiltinDocumentProperties" angesprochen werden. Die deutschen Namen der Word-integrierten Dokumenten-Eigenschaften, sehen Sie folgenden Word-Dialog aufrufen:Einfügen – Feld – (Alle) – DokEigenschaft – OptionenIn VBA sollten Sie die englischen Ausdrücke verwenden, oder alternativ die Nummer (ID), welche jeder Dokumenten-Eigenschaften eindeutig zugewiesen ist.Nachfolgende Tabelle zeigt die Gegenüberstellung von ID, englischer Begriff und deutscher Begriff: Dokumenten-Eigenschaften (Tabelle)IDEnglische BezeichnungDeutsche BezeichnungIDEnglische BezeichnungDeutsche Bezeichnung1TitleTitel16Number of CharactersZeichen2SubjectThema17SecuritySchutz3AuthorAutor18CategoryKategorie4KeywordsStichwörter19Format 5CommentsKommentar20ManagerManager6TemplateDokVorlage21CompanyFirma7Last AuthorGespeichertVon22Number of BytesBytes8Revision NumberÜberarbeitungsnummer23Number of LinesZeilen9Application NameAnwendungsname24Number of ParagraphsAbsätze10Last Print DateZuletztGedruckt25Slides 11Creation DateErstellDatum26Number of NotesKommentar12Last Save TimeZuletztGespeichertZeit27Hidden Slides 13  28Number of Multimedia Clips 14Number of PagesSeiten29Hyperlink BaseHyperLinkBasis15Number of WordsWörter30Number of Characters with spacesZeichen mit Leerzeichen  Speicher in einer "INI-Datei" wie zu den guten alten Zeiten von Windows 3.xSpeicherort: In einer einfach aufgebauten DateiErstellung: Mittels VBA-Code (Makro). Die Datei kann auch im Notepad eingesehen und manipuliert werden.Sichtbarkeit: Grundsätzlich können alle Anwendungen darauf zugreifenPortabilität: Neben der Vorlage, sollte auch die INI-Datei gezügelt werden. Wird die nicht gemacht, dann wird am neuen Ort zwar eine neue Datei erstellt, die aktuellen Werte gehen aber dabei verloren.Syntax (VBA):DateiPfad = NormalTemplate.Path + "\VBAMakro.ini"System.PrivateProfileString(FileName:=DateiPfad, _ Section:="Rechnung", Key:="DokNr") = 1Hier wird folgender Parameter in die INI-Datei geschrieben:[Rechnung]DokNr=1 Sollte die Datei noch nicht bestehen, wird sie neu erstellt, besteht die Datei schon, wird der Parameter hinten angehängt oder der Parameter wird geändert, sollte dieser schon existieren. Achten Sie darauf, dass das Verzeichnis, in dem die INI-Datei erstellt werden soll. bereits bestehen muss. Im oben aufgeführten Beispiel, ist diese Bedingung gegeben, da der Pfad der Office-Vorlagen benutzt wird. Sie können aber auch ein eigenes Verzeichnis schaffen. Auch der Name der INI-Datei ist frei wählbar. Sie sollten sowohl den Pfadnamen wie auch der Name der Datei in Ihrem VBA-Code korrekt setzten. Also z. B.:DateiPfad = "Mein Verzeichnis" + "\" + "SteuerDatei.ini"num = System.PrivateProfileString(FileName:=DateiPfad, _ Section:="Rechnung", Key:="DokNr")(Der Parameter wird aus der Datei gelesen)Nächste = _ CDbl(System.PrivateProfileString(FileName:=DateiPfad, _ Section:="Rechnung", Key:="DokNr")) + 1(Hier wird die nächst höhere Nummer bestimmt. Wir müssen sicherstellen, dass der Wert welcher von der Datei zurückgegeben wird numerisch ist, damit die Addition glückt. Das erreichen wir mit der VB(A)-Funktion "CDbl") Sie können beliebig viele Parameters in ein und der selben Datei versorgen. Das Format ist immer dasselbe: (Absatz, Parametername, und Wert). Das sieht dann in etwa wie folgt aus:[Installation]Datum="15/12/98"Admin="Peter Muster"[Rechnung]DokNr=1 Speicher in einer "Registry" wie zu den noch besseren Zeiten vonWindows 9xSpeicherort: In einem privaten String der "Registry" (Registrierdatenbank)Erstellung: Mittels VBA-Code (Makro). Die Daten können auch mit dem Programm "regedit" in der Registrierdatenbank eingesehen und verändert werdenSichtbarkeit: Grundsätzlich können alle Anwendungen darauf zugreifen.Portabilität: Die Daten müssen in die Registrierdatenbank des Zielrechners eingebracht werden. Wird das nicht gemacht, beginnt die Geschichte beim Zielrechner bei null.Anmerkungen: Um einen Parameter in die Registry einzubringen verwendet man die"PrivatePropertyString-Methode". Die Syntax verlangt zwingend drei Argumente, namentlich: "FileName", "Section" und "Key". Wenn Sie einen Registry-Eintrag erstellen möchten, müssen Sie dem Parameter"FileName" zwingend einen leeren Wert zuweisen. Es wird dringend empfohlen, die Konvention einzuhalten und den Wert der "Section" mit folgendem Wert zu beginnen:aSec = "HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Word"Sie können mit der beschriebenen Funktion beliebige Werte in der Registry abändern, also auch Werte, welche nicht von Ihnen eingebracht wurden.  V O R S I C H T: BEVOR SIE MIT DER REGISTRY EXPERIMENTIEREN, SOLLTEN SIE DIESE ZUVOR SICHERN !!! Syntax (VBA):aSec ="HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Word"aSec = aSec + "\Rechnung"System.PrivateProfileString(FileName:="", Section:=aSec, _ Key:="DokNum") = 1Hier wird der Parameter "DokNum" unter dem Schlüssel "HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Word\Rechnung" in die Registry geschrieben. Gleichzeitig wird der Wert dieses Parameters auf "1" gesetzt. Sollte dieser Schlüssel oder Parameter noch nicht existieren, wird dieser nun erstellt.aSec ="HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Word"aSec = aSec + "\Rechnung"Num = System.PrivateProfileString(FileName:="", _ Section:=aSec, Key:="DokNum")(Hier wird die Nummer in eine Variable eingelesen)Nächste = CDbl(System.PrivateProfileString(FileName:="", _ Section:=aSec, Key:="DokNum")) + 1 (Hier wird die Nummer in eine Variable eingelesen und zusätzlich die nächst höhere Nummer bestimmt. Wir müssen sicherstellen, dass der Wert welcher von der Registrierdatenbank zurückgegeben wird numerisch ist, damit die Addition glückt. Das erreichen wir mit der VB(A)-Funktion "CDbl"). Beispiel aus der PraxisDen nachfolgenden Beispiel geht folgendes Szenario voraus:SzenarioEs gibt eine Dokumentvorlage, welche dazu bestimmt ist, Rechnungen zu erstellen.Es soll sicher gestellt werden, dass die Name unter dem die Rechnungen gesichert werden, einem gewissen Muster folgen und aufsteigend nummeriert sind.Jede Rechnung hat eine eindeutige Rechnungsnummer, welche den gleichen Grundsätzen gehorchen soll, wie der Name unter dem die Rechnung gespeichert wird. Diese Nummer soll automatisch in jede Rechnung eingefügt werden.Diese Nummer beginnt mit 001-061- anschliessend folgt einer dreistellige Nummer (Korrelator). Die erste Rechnung soll also 001-061-001 heissen, die zweite 001-061-002, u.s.w.LösungswegWir fügen an geeigneter Stelle in der Dokumentenvorlage eine Dokumenten-Variable ein. Diese Felddefinition wird beim erstellen einer neuen Rechnung auf das Dokument vererbt. Als Name für die Variable wählen wir "RechNr".Den aktuellen Wert der Rechnungsnummer halten wir in der Registrierdatenbank fest und führen ihn auch dort nach. Der Schlüssel unter dem dir Rechnungsnummer nach geführt wird setzen wir wie folgt fest:HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\VBA-Projekte\.........\RechNrDie Punkte stehen für den Namen der Vorlage (ohne Dateierweiterung). Der Name der Vorlage soll Rechnung.dot lauten.Um die ganze Sache zu automatisieren erstellen wir den Code in einer Ereignissprozedur. Diese Prozedur wird Document_New heissen. Sie wird jedesmal wenn auf Grund der Vorlage Rechnung.dot ein neues Dokument generiert wird, ablaufen.Um uns das richtige Umfeld zu schaffen öffnen wir also unsere Dokumentenvorlage (Rechtsklick während der Zeiger auf die Vorlage verweilt und über das Kontextmenü den Eintrag "Öffnen" wählen). Als nächstes wechseln wir in die VBA-Umgebung. Dazu drücken wir die Tastenkombination [Alt + F11].Nun brauchen wir den Projekt-Manager. Je nach Situation wird dieser schon angezeigt. Um sicher zu gehen, dass er bestimmt angezeigt wird, drücken wie die Tastenkombination [Strg + R]. Im Projekt-Manager führen wir nun einen Doppelklick auf den Eintrag "ThisDocument" aus. Durch diese Aktion wird ein vorerst (fast) leeres Fenster geöffnet. In der linken "Drop-down"-Liste schalten wir von "Allgemein" auf "Document" um. Mit dieser Aktion erscheint in der rechten "Drop-down"-Liste der Begriff "new". Damit liegen wir goldrichtig. Im weiteren wurden zwei Zeilen Code generiert, nämlich: "Sub Document_New" und "End Sub". Dieses Gerüst können wir in dieser Form sehr gut gebrauchen.

geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: