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é
> 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)
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
> 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)
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
> 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
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é
> 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
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é
> 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).
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é