Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Textmarken mit UserForm auffüllen und aktualisieren

714 views
Skip to first unread message

Andre Gobet

unread,
Jan 17, 2010, 12:26:29 PM1/17/10
to
Hallo zusammen

Eventuell ist meine Frage schon zig mal beantwortet worden jedoch bin
ich durch die Suche nicht so ganz schlau geworden. Eventuell kann mir
jemand hier helfen.

Ich habe eine UserForm mit sagen wir Adressfeldern, der User kann in
diese Felder eintragen und anschliessend durch einen Klick auf den
Knopf wird ein Dokument geöffnet und die bestehenden Textmarken mit
diesen Werten ergänzt. Das sieht bei mir so aus:

Me.Hide
ChangeFileOpenDirectory "C:\Schafer_Office_V3\"
Documents.Open FileName:="Dok2.doc", ConfirmConversions:=False,
ReadOnly _
:=False, AddToRecentFiles:=False, PasswordDocument:="",
PasswordTemplate:= _
"", Revert:=False, WritePasswordDocument:="",
WritePasswordTemplate:="", _
Format:=wdOpenFormatAuto, XMLTransform:=""

ActiveDocument.Bookmarks("Text1").Range.Text = Me.TextBox1

So weit so gut das Makro startet die Textmarke wird mit dem Wert aus
der TextBox gefüllt. Nun aber meine Frage oder besser gesagt mein Ziel
ist dass der User die UserForm wiederum starten kann und in den
entsprechenden Textboxen die er vorher ausgefüllt hat immer noch seine
Werte oder Texte vorhanden sind und mit einem erneuten Klick auf den
Knopf "erstellen" die eventuell neuen Werte welche der User eingegeben
hat in das Dokument eingefügt werden.

Hoffe das ist nicht zu kompliziert.

Wir setzen bei uns Windows7 64Bit mit Office 2007 SP2 ein.

Gruss

- André

Thomas Gahler

unread,
Jan 17, 2010, 3:19:34 PM1/17/10
to
Guten Abend Andre


> Eventuell ist meine Frage schon zig mal beantwortet worden [...]
Ich habe nicht nachgez�hlt :-)


> Nun aber meine Frage oder besser gesagt mein Ziel
> ist dass der User die UserForm wiederum starten kann und in den

> entsprechenden Textboxen die er vorher ausgef�llt hat immer noch seine


> Werte oder Texte vorhanden sind und mit einem erneuten Klick auf den
> Knopf "erstellen" die eventuell neuen Werte welche der User eingegeben

> hat in das Dokument eingef�gt werden.
Deine Textmarke geht beim bef�llen verloren. Also musst du diese nach dem
�bertragen des Textes von der UserForm auf das Dokument wieder herstellen
(siehe Beispiel).

Deine UserForm verliert die Werte nur dann , wenn diese entladen wird
(Unload UserForm1 oder Set frm = Nothing). Hast du diese nur mittels .Hide
verborgen, dann solltest du die Werte weiterhin sehen.
Aber unabh�ngig davon w�rde ich die Werte erneut einlesen, du weisst ja
nicht was der Anwender im Dokument gewurstelt hat.


Sub Demo1()
Dim cText As String
Dim oRNG As Range
Dim oBM As Bookmark

cText = "ABC"

If ActiveDocument.Bookmarks.Exists("Test") Then
Set oRNG = ActiveDocument.Bookmarks("Test").Range

oRNG.Text = cText

Set oBM = ActiveDocument.Bookmarks.Add( _
Name:="Test", _
Range:=oRNG)
End If
End Sub


> ChangeFileOpenDirectory "C:\Schafer_Office_V3\"
> Documents.Open FileName:="Dok2.doc", ConfirmConversions:=False,
> ReadOnly _
> :=False, AddToRecentFiles:=False, PasswordDocument:="",
> PasswordTemplate:= _
> "", Revert:=False, WritePasswordDocument:="",
> WritePasswordTemplate:="", _
> Format:=wdOpenFormatAuto, XMLTransform:=""

Zwei drei Gedanken zu deinem Code
- Weshalb denn das ChangeFileOpenDirectory? Ein
"FileName:="C:\Schafer_Office_V3\Dok2.doc" geht doch auch.
- Gew�hn dir an mit Objekten zu arbeiten, dann kannst du diese jederzeit
explizit ansprechen
dim doc as word.document
set doc = Documents.Open (Filename:=...)
- Weshlab �bergibst du denn alle Argumente an die .Open-Methode obwohl diese
optional sind und als leere Wert �ber geben werden


--
Thomas Gahler
Co-Autor von �Microsoft Word-Programmierung.
Das Handbuch� (MS Press)


- Windows Vista (SP2), Office 2007 (SP2)


Andre Gobet

unread,
Jan 18, 2010, 7:57:04 AM1/18/10
to
Hallo Thomas

Vielen Dank für deine Hilfestellung dein Code klappt super gut ;-) !!

Betreffend dem Pfad habe ich dies nun geändert, habe es seinerzeit
einfach mal so gelernt aber es ist natürlich nie zu spät etwas zu
ändern.

Nun erlaube ich mir aber noch eine Frage zu stellen welche ich trotz
Suche nicht gefunden habe aber wobei du sicherlich die Lösung weist.

In der erwähnten UserForm kann der User aus einer Dropdown Liste
vordefinierte Texte auswählen welche anschliessend in's Dokument
kopiert werden sollen.

Der ausgewählte Text wird in einer TextBox angezeigt damit der User
weiss was so in seinem Brief stehen wird. Dazu verwende ich die
Funktion
dass in der Textbox .txt Dateien angezeigt werden aber im finalen
Dokument
ein .doc Dokument. Dies auch im Hinblick auf die Formatierung welche
ja im .txt Format verloren geht.

Früher hat mein Code mal so ausgesehen. ABER natürlich ohne Textmarken
usw:

ChangeFileOpenDirectory Me.PathToCurrentBrancheDOC
Documents.Open FileName:=Me.fTexte.Text & ".doc"

Selection.WholeStory
Selection.Copy
ActiveDocument.Close
Selection.PasteAndFormat (wdPasteDefault)

Nun möchte ich ähnliches mit den Textmarken realisieren. Mein Problem
dabei
ist wie kann ich VBA beibringen dass er den Text welcher im .doc ist
kopiert
als Range Objekt.

Mein neuer Code sieht wie folgt aus:

Dim cText As String
Dim ctextdoc As Range


Dim oRNG As Range
Dim oBM As Bookmark

ChangeFileOpenDirectory Me.PathToCurrentBrancheDOC
Documents.Open FileName:=Me.fTexte.Text & ".doc"

Set ctextdoc = ActiveDocument.Range
ActiveDocument.Close

If ActiveDocument.Bookmarks.Exists("ibDokument") Then
Set oRNG = ActiveDocument.Bookmarks("ibDokument").Range

oRNG.Text = ctextdoc

Set oBM = ActiveDocument.Bookmarks.Add(name:="ibDokument",
Range:=oRNG)
End If

Nun erhalte ich eine Fehlermeldung dass das Objekt gelöscht wurde und
stecke fest da
ich den Fehler absolut nicht finden kann.

Vielleicht hast Du / Ihr eine Idee

Thomas Gahler

unread,
Jan 18, 2010, 2:05:15 PM1/18/10
to
Hallo Andre


> Betreffend dem Pfad habe ich dies nun ge�ndert, habe es seinerzeit
> einfach mal so gelernt aber es ist nat�rlich nie zu sp�t etwas zu
> �ndern.
Das w�re mir ja egal, doch mit deinem Code �nderst du das verrhlaten vorn
Word. Denn wenn der Anwender ein weites Dokument ben�tigt und Datei/�ffnen
w�hlt, so ist das Startverrzeichnis in deinem Ordner und dort war er ja gar
nie. Deshlab der Hinweis.

> Fr�her hat mein Code mal so ausgesehen. ABER nat�rlich ohne Textmarken
Ziemlich grosser Unterschied, doch es ist sinnvoll, dass du die Finger von
der Zwischenablage l�sst...


> ist wie kann ich VBA beibringen dass er den Text welcher im .doc ist
> kopiert als Range Objekt.

Dazu hat das .Range-Objekt die .FormatedText-Eigenschaft

Hier kannst du ein wenig abschauen
http://groups.google.ch/group/microsoft.public.de.word.vba/browse_thread/thread/963217410796d31d?hl=de#
Wobei du deinen Code dann ohne .Selection aufbauen kannst, da du hoffentlich
einen klar definierten .Range hast.


> Set ctextdoc = ActiveDocument.Range
> ActiveDocument.Close

Kleiner Spassvogel ;-) Du hast soeben dein ctextdoc-Objekt zerst�rt.
Mittels der Set-Anweisung wird ein Pointer erstellt. Du hast also keine
Kopie der Daten. Das war der Vorteil der Zwischenablage. Du darfst dein
Quelldokument erst schliessen wenn du den Text �bernommen hast.

Und somit kommen wir zu einem anderen Punkt. Es w�re sinnvoll wenn du mit
Objekten arbeitest, sonst hast du schnell mal die �bersicht verloren,
welches denn gerade dein 'ActiveDokument' ist.


Hast du dir schon einmal �berlegt deine Texte in AutoTexte zu verpacken?
W�re auch eine M�glichkeit.

�brigens, wenn du formatierrten Text in der UserForm sehen m�chtest, dazu
gibt es eine RFTTextbox (habe ich aber noch nie verwendet und ist nicht in
der MSForms2.0 Bibliothek drin)

Andre Gobet

unread,
Jan 18, 2010, 3:54:53 PM1/18/10
to
Hallo Thomas

Vielen Dank für deine Hilfestellung und den Link. Habe mir
die Sache nun mal angesehen und meinen Code dementsprechend
angepast. Nur leider funktioniert das ganze nicht, es gibt zwar
keine Fehlermeldung aber der Text wird nicht in die Textmarke
kopiert.

Code:
Dim docZiel As Word.Document
Dim docQuelle As Word.Document
Dim rngZiel As Word.Range
Dim rngQuelle As Word.Range

Set docZiel = ActiveDocument
Set rngZiel = Selection.Range

ChangeFileOpenDirectory Me.PathToCurrentBrancheDOC
Set docQuelle = Documents.Open(FileName:=Me.fTexte.Text & ".doc")
docQuelle.Activate

Set rngQuelle = Selection.Range

docZiel.Activate


If ActiveDocument.Bookmarks.Exists("ibDokument") Then

Set rngZiel = ActiveDocument.Bookmarks("ibDokument").Range

rngZiel.FormattedText = rngQuelle.FormattedText

docQuelle.Saved = True
docQuelle.Close wdDoNotSaveChanges

Thomas Gahler

unread,
Jan 18, 2010, 5:31:24 PM1/18/10
to
Hallo Andre


> die Sache nun mal angesehen und meinen Code dementsprechend
> angepast. Nur leider funktioniert das ganze nicht, es gibt zwar
> keine Fehlermeldung aber der Text wird nicht in die Textmarke
> kopiert.

Es wird schon kopiert, doch die kopierte Menge ist sehr klein.

Wenn du ein Dokument manuell �ffnest, dann ist der Cursor als Strich vor dem
ersten Buchstaben platziert. Diese entspricht deinem Selection.Range.

Selection.Range ist immer der Bereich, den der Cursor markiert. Wenn du das
ganze Dokument ben�tigst, dann bist du mit docQuelle.Range gut bedient,
falls es nur ein Teil davon sein muss, dann musst du den .Range entsprechend
setzen oder vielleicht eine Textmarke verwenden.


> ChangeFileOpenDirectory Me.PathToCurrentBrancheDOC
> Set docQuelle = Documents.Open(FileName:=Me.fTexte.Text & ".doc")

Grmblll.... :-)


> docQuelle.Activate
Kannst du dir ersparen, wenn du auf einen definierten .Range zugreifst. Habe
ich nur eingebaut um sicher zu sein, dass dieses Dokument auch wirklich
aktiv ist, da ich mit dem .Selection-Objekt arbeiten muss.

> docZiel.Activate
Auch dieses zur�ckschalten ben�tigst du nicht, da du ikm Zieldokument einen
klar definiewrten .Range hast.


> If ActiveDocument.Bookmarks.Exists("ibDokument") Then
> Set rngZiel = ActiveDocument.Bookmarks("ibDokument").Range

Hier aber unbeding mit dem Objekt arbeiten, wenn du schon eines hast!!!
- If docZiel.Bookmarks.Exists("ibDokument") Then
Set rngZiel = docZiel.Bookmarks("ibDokument").Range

Andre Gobet

unread,
Jan 19, 2010, 2:00:51 PM1/19/10
to
Hallo Thomas

so nun klappt alles mit dem Einfügen in die Textmarken und mein Code
sieht nun wie folgt aus:

Sub dokument()
'Dokumententeil einfügen


Dim docZiel As Word.Document
Dim docQuelle As Word.Document
Dim rngZiel As Word.Range
Dim rngQuelle As Word.Range

Dim oBM As Bookmark
Dim oRNG As Range

Set docZiel = ActiveDocument
Set rngZiel = Selection.Range

ChangeFileOpenDirectory Me.PathToCurrentBrancheDOC


Set docQuelle = Documents.Open(FileName:=Me.fTexte.Text & ".doc")

docQuelle.Activate

Set rngQuelle = docQuelle.Range

If docZiel.Bookmarks.Exists("ibDokument") Then
Set rngZiel = docZiel.Bookmarks("ibDokument").Range

rngZiel.FormattedText = rngQuelle.FormattedText

docQuelle.Saved = True
docQuelle.Close wdDoNotSaveChanges

Set oBM = docZiel.Bookmarks.Add(name:="ibdokument",
Range:=rngZiel)

End If
End Sub

Nur einen kleinen Schönheitsfehler hat die Sache noch. Beim befüllen
der Textmarke welche sich
in einer Tabelle befindet wird am Ende der Textmarke eine
Zeilenschaltung gemacht, d.h. einen
Return in der Tabelle. Ist zwar nicht so schlimm jedoch optisch nicht
Top. Muss noch schauen
wie ich diese Zeilenschaltung am einfachsten entfernen kann.

Auf alle Fälle vielen Dank

Gruss

- André

Thomas Gahler

unread,
Jan 19, 2010, 2:10:31 PM1/19/10
to
Hallo Andre

> in einer Tabelle befindet wird am Ende der Textmarke eine
> Zeilenschaltung gemacht, d.h. einen
> Return in der Tabelle. Ist zwar nicht so schlimm jedoch optisch nicht
> Top. Muss noch schauen
> wie ich diese Zeilenschaltung am einfachsten entfernen kann.

Nicht entfernen, sondern gar nicuht erst �berrnehmen. Dein .Range ist zu
Gross


Nach dem festlegen des .Range denselben verkleinern

Set rngQuelle = docQuelle.Range
rngQuelle.SetRange Start:=rngQuelle.Start, End:=rngQuelle.End - 1

Andre Gobet

unread,
Jan 23, 2010, 11:25:22 AM1/23/10
to
Hallo Thomas

Kurze Frage zu deiner Anmerkung wegen einer RTF Textbox. Diese
ist ja nicht in den Forms 2.0 drin. Wo bekomme ich die her?
Gibt es irgendwo ein Paket zum Downloaden oder ist das einfach
ein Verweis welchen ich nur noch "aktivieren" muss. Habe so auf
die schnelle in den bestehenden Verweisen nichts über eine RTF
Textbox gefunden.

Gruss

- André

Thomas Gahler

unread,
Jan 23, 2010, 12:10:48 PM1/23/10
to
Hallo Andre

> Gibt es irgendwo ein Paket zum Downloaden oder ist das einfach
> ein Verweis welchen ich nur noch "aktivieren" muss. Habe so auf

> die schnelle in den bestehenden Verweisen nichts �ber eine RTF
> Textbox gefunden.
Kein Verweis sondern Extras/Zus�tzliche Steuerelemente w�hlen. Der Verweis
wird automatsisch gesetzt, sobalkd dui das Ding auf deiner UserForm einf�gst

Geh�rt, wenn ich richtig liege, zum Lieferumfang von "VB" oder "Office
Developer Edition". Und musst du anschliessend ausliefern, denn es wird
nicht auf jedem PC drauf sein (MS Lizenzbedingungen beachten).

Andre Gobet

unread,
Jan 24, 2010, 10:34:39 AM1/24/10
to
Hallo Thomas

Also die Office Developer Edition Tools gibt es in diesem Sinne nicht
mehr
dies wurde nun in die Visual Studio for Office integriert. Und ja die
muss
man bezahlen.

Die alte Microsoft Rich Text Control verursacht Probleme seit Office
2003
man muss dabei die Registry modifizieren.

Im Moment gibt es noch die folgende RTF Control:
http://www.lebans.com/richtext.htm

Mal schauen ob es damit funktioniert ?!

Gruss

- André

0 new messages