ich möchte gerne einen bestimmten Textbereich per Macro durch einen
anderen erstzen. Mein Code dafür sieht so aus:
Sub ReplaceMyDoc
Dim oRNG As Range
Set oBM As Bookmark
If ActiveDocument.Bookmarks.Exists("MyDoc") Then
Set oRNG = ActiveDocument.Bookmarks("MyDoc").Range
oRNG.Delete
oRNG.InsertFile("MyDoc.xml")
ActiveDocuments.Bookmarks("MyDoc").Delete
Set oBM = ActiveDocument.Bookmarks.Add("MyDoc", oRNG)
End If
End Sub
Das Einsetzen wird auch wie gewünscht vorgenommen, aber offenbar wird
der Bereich nicht gelöscht/neu gesetzt. Wenn ich das Macro ein zweites
mal aufrufe, wird nicht der vorhandene Bereich überschrieben, sondern
die Datei einfach am Beginn eingefügt.
Warum ist das so und wie kann ich das ändern?
Viele Grüße
Ole
> Das Einsetzen wird auch wie gewünscht vorgenommen, aber offenbar wird
> der Bereich nicht gelöscht/neu gesetzt. Wenn ich das Macro ein zweites
> mal aufrufe, wird nicht der vorhandene Bereich überschrieben, sondern
> die Datei einfach am Beginn eingefügt.
>
> Warum ist das so und wie kann ich das ändern?
Was dann bedeuten würde, dass deine Textmarke nicht dort gesetzt wird, wo du
gerne hättest.
Ich habe nicht gross getestet, woran es liegt. Die nachstehenden Zeilen
haben bis jetzt den Text an einer Textmarke immer zuverlässig ersetzt. Wird
sicher schnell auf .InsertFile angepasst sein.
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
Ich nehme mal an, dass du eine Textmarke hast, die im Dokument einen
[Bereich] und nicht nur eine ][Stelle einschliesst.
Könnte auch daran liegen dass du ein .Delet ausführst. Ich weiss es nicht
auf den ersten Blick
--
Thomas Gahler
MVP für Word
Co-Autor von »Microsoft Word-Programmierung.
Das Handbuch« (MS Press)
- Windows XP (SP3), Office XP (SP3)
"Thomas Gahler" <wurze...@LASSEN.bluemailch> writes:
> Ich habe nicht gross getestet, woran es liegt. Die nachstehenden Zeilen
> haben bis jetzt den Text an einer Textmarke immer zuverlässig ersetzt. Wird
> sicher schnell auf .InsertFile angepasst sein.
> 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
Mit einem Text funktioniert das bei mir auch :-) Nur eben mit einem
File-Include nicht. Offenbar wird dabei der eingefügte Text nicht Teil
des Ranges (?). Wie könnte man das am besten anstellen?
Viele Grüße
Ole
> Mit einem Text funktioniert das bei mir auch :-) Nur eben mit einem
> File-Include nicht. Offenbar wird dabei der eingefügte Text nicht Teil
> des Ranges (?). Wie könnte man das am besten anstellen?
Stimmt der Range ist so ziemlich nicht dort, wo ich ihn erwartet hätte ;-(
Aber wenn es mit einem Text geht, dann nehmen wir doch Text. Deine
.xml-Datei ist ja unformatierter Text. Die Datei mit Open öffnen am Stück in
eine Variable einlesen und Hopps, schon sollten wir Erfolg haben.
Weisst du wie das geht?
> Mit einem Text funktioniert das bei mir auch :-) Nur eben mit einem
> File-Include nicht. Offenbar wird dabei der eingefügte Text nicht Teil
> des Ranges (?). Wie könnte man das am besten anstellen?
Ich gehe mal von einer gschlossenen Bookmark aus. Wenn der Range
zuerst geleert wird, wird er dabei auf einen Punkt verkleinert. Damit
wird Text am Ende eingefügt, vielleicht besser so:
_____
Sub ReplaceMyDoc()
Dim oRNG As Range
If ActiveDocument.Bookmarks.Exists("MyDoc") Then
Set oRNG = ActiveDocument.Bookmarks("MyDoc").Range
With oRNG
.Text = " "
.InsertFile ("MyDoc.xml")
.MoveEnd wdCharacter, -2
ActiveDocument.Bookmarks.Add "MyDoc", oRNG
End With
End If
Set oRNG = Nothing
End Sub
_____
Gruß
Lisa
_____
http://www.schreibbuero-richter.de/word/textmarker.html
"Thomas Gahler" <wurze...@LASSEN.bluemailch> writes:
>> Mit einem Text funktioniert das bei mir auch :-) Nur eben mit einem
>> File-Include nicht. Offenbar wird dabei der eingefügte Text nicht Teil
>> des Ranges (?). Wie könnte man das am besten anstellen?
> Stimmt der Range ist so ziemlich nicht dort, wo ich ihn erwartet hätte ;-(
> Aber wenn es mit einem Text geht, dann nehmen wir doch Text. Deine
> .xml-Datei ist ja unformatierter Text.
Nee, das ist eine WordML-Datei. ca. 400 kbyte groß.
> Die Datei mit Open öffnen am Stück in eine Variable einlesen und
> Hopps, schon sollten wir Erfolg haben. Weisst du wie das geht?
Leider nicht. Word für Windows ist eine ganz neue Erfahrung für mich :-)
Geht das auch mit solch "riesigen" Texten? In WordML (2003 Variant)?
Viele Grüße
Ole
"Lisa (Nora Richter)" <li...@schreibbuero-richter.de> writes:
> Ich gehe mal von einer gschlossenen Bookmark aus. Wenn der Range
> zuerst geleert wird, wird er dabei auf einen Punkt verkleinert. Damit
> wird Text am Ende eingefügt, vielleicht besser so:
Hilft leider nix :-(
Viele Grüße
Ole
> Hilft leider nix :-(
das ist leider nicht so aussagekräftig. Ich habe es mit einem
(natürlich kurzen) Textfile probiert. Die geschlossene Bookmark
umfasst bei mir ein Wort, das in einem eigenen Absatz steht. Dieser
gesamte Absatz wird markiert und erhält dann die geschlossene Bookmark
"MyDoc". Der Platzhalter hat also ein Wort und eine Absatzmarke im
Dokument zum Inhalt.
Kannst Du mal bitte sagen, wie Deine Bookmark aussieht, bei der es
"nix hilft"?
Gruß
Lisa
_____
http://www.schreibbuero-richter.de/word.html
Wie andere schon geschrieben haben, wird der Text nicht in die Textmarke
eingefüllt sondern dahinter gestellt
Lösungsidee:
Textmarke suchen, ich nenne sie mal T1
dahinter ein Leerzeichen setzen, dahinter eine Dummy-Textmarke setzen, ich nenne
sie mal T2
nun den Text bei T1 einsetzen
Jetzt einen Range abgreifen, der bei T1 anfängt und bei T2 aufhört. Dort die
Textmarke T1 neu setzen
Zum Schluss T2 und das überflüssige Leerzeichen wieder löschen.
Gruß
Bernhard Sander
Bernhard Sander <off...@kein.spam> writes:
> Wie andere schon geschrieben haben, wird der Text nicht in die
> Textmarke eingefüllt sondern dahinter gestellt
Word ist ein Mysterium. Warum werden eingefügte Dateien anders
behandelt als eingefügte Strings?
> Lösungsidee: Textmarke suchen, ich nenne sie mal T1 dahinter ein
> Leerzeichen setzen, dahinter eine Dummy-Textmarke setzen, ich nenne
> sie mal T2 nun den Text bei T1 einsetzen Jetzt einen Range abgreifen,
> der bei T1 anfängt und bei T2 aufhört. Dort die Textmarke T1 neu
> setzen Zum Schluss T2 und das überflüssige Leerzeichen wieder löschen.
Das hört sich gut an. Frage des Laien (den Rest bekomme ich wohl hin :-) )
Wie definiere ich mir einen Range, der zwischen zwei Textmarken liegt?
Und darf ein Range auch beliebig groß sein? Ich hatte beim
Experimentieren das Gefühl, dass ich nicht alle ca. 40 eingefügten
Seiten in einem Rutsch markieren und löschen konnte.
Ansonsten hatte ich gerade noch herausgefunden, dass ich den neuen
Bookmark ja auch in der WordML-Datei setzen kann. Wahrscheinlich wäre
das dann die beste Lösung.
Viele Grüße
Ole
> Das hört sich gut an. Frage des Laien (den Rest bekomme ich wohl hin :-) )
> Wie definiere ich mir einen Range, der zwischen zwei Textmarken liegt?
Zwei Textmarken im Dokument, eine namens "Anfang", die andere namens
"Ende" setzen.
_____
Sub RangeZwischenZweiTextmarken()
Dim rng As Word.Range
If ActiveDocument.Bookmarks.Exists("Anfang") And _
ActiveDocument.Bookmarks.Exists("Ende") Then
Set rng = ActiveDocument.Range(Start:=ActiveDocument.Bookmarks
("Anfang").Range.Start, _
End:=ActiveDocument.Bookmarks("Ende").Range.End)
rng.Select 'nur zum Test
End If
End Sub
_____
Die Zeile rng.Select jetzt nur zum Test, damit man sieht, wo der Rang
ist, die muss natürlich wieder heraus.
> Und darf ein Range auch beliebig groß sein? Ich hatte beim
> Experimentieren das Gefühl, dass ich nicht alle ca. 40 eingefügten
> Seiten in einem Rutsch markieren und löschen konnte.
Wenn die Seiten in der Benutzerschnittstelle markiert werden, um sie
in einem Rutsch zu löschen, dürfte ein solcher Eindruk eher aus der
Geschwindigkeit der Grafikkarte resultieren. Solche Effekte treten bei
Ranges nicht auf, weil da nichts im Dokument markiert wird.
Gruß
Lisa
_____
http://www.schreibbuero-richter.de/vba.html
> Nee, das ist eine WordML-Datei. ca. 400 kbyte groß.
Also hast du eigentlich eine formatierte Word-Datei, die als .xml
abgespeichert wurde. Und du willst das "Dokument" einfügen und nicht nur den
XML-Code, oder?
> Geht das auch mit solch "riesigen" Texten? In WordML (2003 Variant)?
Das ist der Variablen vom Typ String "fast" egal, da hat viel drin Platz.
<Auszug aus der Hilfe>
String-Datentyp
Es gibt zwei Arten von Zeichenfolgen: Zeichenfolgen variabler Länge und
Zeichenfolgen fester Länge.
- Zeichenfolgen variabler Länge können bis zu 2 Milliarden (oder 2^31)
Zeichen enthalten.
- Zeichenfolgen fester Länge können 1 bis etwa 64 KB (2^16) Zeichen
enthalten.
</Auszug aus der Hilfe>
--
Thomas Gahler
MVP für Word
Co-Autor von »Microsoft Word-Programmierung.
Das Handbuch« (MS Press)
- Windows Vista (SP1), Office 2007 (SP?)
"Thomas Gahler" <wurze...@LASSEN.bluemail.ch> writes:
>> Nee, das ist eine WordML-Datei. ca. 400 kbyte groß.
> Also hast du eigentlich eine formatierte Word-Datei, die als .xml
> abgespeichert wurde.
Fast :-) Die XML-Datei sieht das Word zum ersten mal in dem
Augenblick, wo sie eingefügt wird. Sie entstammt einer
xslt-Verarbeitung.
> Und du willst das "Dokument" einfügen und nicht nur den XML-Code,
> oder?
Sie sollte von Word dem Format entsprechend interpretiert werden.
>> Geht das auch mit solch "riesigen" Texten? In WordML (2003 Variant)?
> Das ist der Variablen vom Typ String "fast" egal, da hat viel drin Platz.
Naja, zwischen "vom Prinzip geht es" und "brauchbar" ist noch eine
ganze Menge Spielraum...
Bekomme ich das Dokument auch entsprechend formatiert in den
String hinein? Oder kann Word den String beim Einfügen in den Range
interpretieren?
Viele Grüße
Ole
>>> Geht das auch mit solch "riesigen" Texten? In WordML (2003 Variant)?
>> Das ist der Variablen vom Typ String "fast" egal, da hat viel drin Platz.
>
> Naja, zwischen "vom Prinzip geht es" und "brauchbar" ist noch eine
> ganze Menge Spielraum...
>
> Bekomme ich das Dokument auch entsprechend formatiert in den
> String hinein? Oder kann Word den String beim Einfügen in den Range
> interpretieren?
Also wegen der Grösse muss du dir keine Sorgen machen, das geht locker. Aber
dann hast du einen Textstring und der wird als solcher eingefügt. Also keine
Formatierung. Würde genau gleich aussehen, wie wenn die Datei mit
Nortpad.exe geöffnet wird.
Aber dann packe ich nochmals einen Versuch mit .InsertFile an. Und werde ein
paar temporäre Bookmarks setzten...
--
Thomas Gahler
MVP für Word
Co-Autor von »Microsoft Word-Programmierung.
Das Handbuch« (MS Press)
Ich hoffe mit diesen Zeilen bekommst du jetzt das was du gerne hättest.
Ansonsten habe ich irgendwas immer noch nicht verstanden....
Sub Demo1()
Dim oRNG As Word.Range
Dim oRNGtmp As Word.Range
Dim oBM As Word.Bookmark
Set oRNGtmp = ActiveDocument.Range
If ActiveDocument.Bookmarks.Exists("Test") Then
'Wir setzen uns eine Textmarke ein Zeichen *vor* der
'bestehenden Textmarke.
oRNGtmp.SetRange Start:=ActiveDocument.Range.Start, _
End:=ActiveDocument.Bookmarks("Test").Range.Start - 1
Set oBM = ActiveDocument.Bookmarks.Add( _
Name:="Vor", _
Range:=oRNGtmp)
'Wir setzen uns eine Textmarke ein Zeichen *nach* der
'bestehenden Textmarke.
oRNGtmp.SetRange Start:=ActiveDocument.Bookmarks("Test").Range.End +
1, _
End:=ActiveDocument.Range.End
Set oBM = ActiveDocument.Bookmarks.Add( _
Name:="Nach", _
Range:=oRNGtmp)
'Wir fügen die Datei an der gewünschten Textmarke ein.
Set oRNG = ActiveDocument.Bookmarks("Test").Range
oRNG.InsertFile FileName:="C:\Temp\Test.txt", _
ConfirmConversions:=False
'Wir berechnen die Position für die Textmarke, die restauriert werden
'soll. Diese beginnt ein Zeichen nach der Textmarke 'Vor' und endet
'ein Zeichen vor der Textmarke 'Nach'.
oRNGtmp.SetRange Start:=ActiveDocument.Bookmarks("Vor").Range.End + 1,
_
End:=ActiveDocument.Bookmarks("Nach").Range.Start - 1
'Die Textmarke wird erstellt...
Set oBM = ActiveDocument.Bookmarks.Add( _
Name:="Test", _
Range:=oRNGtmp)
'...und die beiden temporären Textmarken werden wieder entfernt.
'ActiveDocument.Bookmarks("Vor").Delete
'ActiveDocument.Bookmarks("Nach").Delete
End If
End Sub
--
Thomas Gahler
MVP für Word
Co-Autor von »Microsoft Word-Programmierung.
Das Handbuch« (MS Press)
"Thomas Gahler" <wurze...@LASSEN.bluemailch> writes:
> Ich hoffe mit diesen Zeilen bekommst du jetzt das was du gerne hättest.
> Ansonsten habe ich irgendwas immer noch nicht verstanden....
Danke, das funktioniert so. Ich habe mich aber doch entschlossen,
einen in das WordML-Dokument "eingebetteten" Bookmark zu verwenden.
Zwei Fragen hätte ich noch:
Kann ich einen Bookmark einfach umbenennen? Die Hilfe kennt zumindest
kein "Rename()".
Und gibt es eine einfache Möglichkeit, sich per VBA ein eigenes Menü
zu bauen, das die gerade definierte Subroutine als Menüpunkt enthält?
Ich bin per Google immer nur auf "dynamische Menüs" gestoßen, die aber
hier wohl Overkill wären.
Viele Grüße
Ole
> Kann ich einen Bookmark einfach umbenennen? Die Hilfe kennt zumindest
> kein "Rename()".
Umbenennen kenne ich auch nicht.
Eiegen Prozedur erstellen welche
- neue Textmarke auf dem Range der Alten anlegt
- die alte Textmarke löschen
> Und gibt es eine einfache Möglichkeit, sich per VBA ein eigenes Menü
> zu bauen, das die gerade definierte Subroutine als Menüpunkt enthält?
> Ich bin per Google immer nur auf "dynamische Menüs" gestoßen, die aber
> hier wohl Overkill wären.
Weiss nicht genau, was du meinst. Ein Makro auf eine Symbolleiste legen?
> Word ist ein Mysterium. Warum werden eingefügte Dateien anders
> behandelt als eingefügte Strings?
Na, diese ganze Newsgroup wäre ja überflüssig, wenn alles gleich offensichtlich
wäre...
> Ansonsten hatte ich gerade noch herausgefunden, dass ich den neuen
> Bookmark ja auch in der WordML-Datei setzen kann. Wahrscheinlich wäre
> das dann die beste Lösung.
Hängt ein bisschen von Deiner Umgebung ab, aber ich würde es trotzdem mit der
Hilfstextmarke im Zieltext angehen. Dann bleibt dieses Makro auch für andere
Fälle nutzbar, wo die Hilfstextmarke nicht im einzufügenden Text gesetzt werden
kann. Ausserdem darf man nicht vergessen, die Hilfstextmarke im einzufügenden
Text zu setzen während bei meiner Variante das Makro selbst die Textmarke setzt.
Viele Grüße
Bernhard Sander
"Thomas Gahler" <wurze...@LASSEN.bluemailch> writes:
>> Kann ich einen Bookmark einfach umbenennen? Die Hilfe kennt zumindest
>> kein "Rename()".
> Umbenennen kenne ich auch nicht.
> Eiegen Prozedur erstellen welche
> - neue Textmarke auf dem Range der Alten anlegt
> - die alte Textmarke löschen
Genauso habe ich es auch gemacht. Sah nur etwas umständlich aus.
>> Und gibt es eine einfache Möglichkeit, sich per VBA ein eigenes Menü
>> zu bauen, das die gerade definierte Subroutine als Menüpunkt enthält?
>> Ich bin per Google immer nur auf "dynamische Menüs" gestoßen, die aber
>> hier wohl Overkill wären.
> Weiss nicht genau, was du meinst. Ein Makro auf eine Symbolleiste legen?
Ja, sowas in der Art, eher noch als Menü. Ich will einfach neben dem
"Hilfe"-Menü einen neuen Punkt "external Update" haben, in dem ich
dann auswählen kann "All", "Section 2", "Section 4", "Section 5", und
die dann die entsprechenden Subroutinen aufrufen (wie bisher
beschrieben).
Oder eine andere Weise, die Makros starten zu können, ohne dass man
umständlich durch das Menü "Tools"->"Macro"->"Macros" gehen muss, um
dann das passende Macro herauszusuchen und zu starten. Quasi
enduserfähig.
Sorry für diese sicher triviale Frage -- aber Word ist immer noch
total neu für mich :-)
Viele Grüße
Ole
Bernhard Sander <off...@kein.spam> writes:
>> Ansonsten hatte ich gerade noch herausgefunden, dass ich den neuen
>> Bookmark ja auch in der WordML-Datei setzen kann. Wahrscheinlich wäre
>> das dann die beste Lösung.
> Hängt ein bisschen von Deiner Umgebung ab, aber ich würde es trotzdem
> mit der Hilfstextmarke im Zieltext angehen. Dann bleibt dieses Makro
> auch für andere Fälle nutzbar, wo die Hilfstextmarke nicht im
> einzufügenden Text gesetzt werden kann. Ausserdem darf man nicht
> vergessen, die Hilfstextmarke im einzufügenden Text zu setzen während
> bei meiner Variante das Makro selbst die Textmarke setzt.
Naja, ich habe ja den einzufügenden Text unter eigener Kontrolle. Was
bei der Lösung mit dem im einzufügenden Text enthaltenen Bookmark
schön ist: ich kann ja offenbar bei InsertFile auch das Bookmark (als
"Range"-Parameter) angeben. Das hat den Vorteil, dass ich an anderer
Stelle (z.B. im Vorwort) noch einen Satz ergänzen kann "This document
is based on version xyz of some external property".
Da entsteht für mich gleich die nächste Frage: Ich habe das mit
oRNG.InsertFile(FileName, "BookmarkToInsert")
versucht, mit der Fehlermeldung "Compile Error: Expected: =". Was soll
mir die sagen und wie spezifiziere ich an dieser Stelle das (in der
einzufügenden Datei befindliche) Bookmark korrekt?
Viele Grüße
Ole
>>> Und gibt es eine einfache Möglichkeit, sich per VBA ein eigenes Menü
>>> zu bauen, das die gerade definierte Subroutine als Menüpunkt enthält?
>>> Ich bin per Google immer nur auf "dynamische Menüs" gestoßen, die aber
>>> hier wohl Overkill wären.
>> Weiss nicht genau, was du meinst. Ein Makro auf eine Symbolleiste legen?
>
> Ja, sowas in der Art, eher noch als Menü. Ich will einfach neben dem
> "Hilfe"-Menü einen neuen Punkt "external Update" haben, in dem ich
> dann auswählen kann "All", "Section 2", "Section 4", "Section 5", und
> die dann die entsprechenden Subroutinen aufrufen (wie bisher
> beschrieben).
Wieso willst du das denn unbedingt mit VBA erledigen. Wenn das Menü statisch
ist, dann kannst du das locker via Extras / Anpassen aufbauen. Reicht das
nihct aus?
"Thomas Gahler" <wurze...@LASSEN.bluemailch> writes:
>> Ja, sowas in der Art, eher noch als Menü. Ich will einfach neben dem
>> "Hilfe"-Menü einen neuen Punkt "external Update" haben, in dem ich
> Wieso willst du das denn unbedingt mit VBA erledigen. Wenn das Menü statisch
> ist, dann kannst du das locker via Extras / Anpassen aufbauen. Reicht das
> nihct aus?
Reicht mir völlig aus. Ich wusste nur nicht, dass es das gibt :-)
Danke nochmal,
Viele Grüße
Ole
> Da entsteht für mich gleich die nächste Frage: Ich habe das mit
>
> oRNG.InsertFile(FileName, "BookmarkToInsert")
>
> versucht, mit der Fehlermeldung "Compile Error: Expected: =". Was soll
> mir die sagen und wie spezifiziere ich an dieser Stelle das (in der
> einzufügenden Datei befindliche) Bookmark korrekt?
Die Fehlermeldung weist darauf hin, dass die Zeile falsch aufgebaut ist.
Schreibe Deine Zeile ohne die Klammern:
oRNG.InsertFile FileName, "BookmarkToInsert"
Der Compiler hat wegen der Klammern erwartet, dass die Methode einen Wert
liefert und der müsste z.B. in einer Variable gespeichert werden, daher der
Hinweis auf das erwartete =, also etwa so:
var = oRNG.InsertFile(FileName, "BookmarkToInsert")
Wobei das vermutlich auf einen Laufzeitfehler stoßen würde, bin grad zu faul zum
testen...
Wenn ein Methodenaufruf keinen Wert zurückliefert, dann darf man die Klammern
nur setzen, wenn genau ein Parameter mitgegeben wird. Bei mehr als einem
Parameter muss man die Klammern weglassen.
Ein paar fiktive Beispiele:
korrekt:
var = objekt.methode()
var = objekt.methode(p1)
var = objekt.methode(p1, p2)
objekt.methode
objekt.methode(p1)
objekt.methode p1
objekt.methode p1, p2
falsch:
var = objekt.methode
var = objekt.methode p1
var = objekt.methode p1, p2
objekt.methode (p1, p2)
Gruß
Bernhard Sander
Bernhard Sander <off...@kein.spam> writes:
>> Da entsteht für mich gleich die nächste Frage: Ich habe das mit
>> oRNG.InsertFile(FileName, "BookmarkToInsert") versucht, mit der
>> Fehlermeldung "Compile Error: Expected: =". Was soll
> oRNG.InsertFile FileName, "BookmarkToInsert"
OK, Danke. Das funktioniert jetzt.
Ich habe mein Problem inzwischen weitgehend lösen können. Es gibt
jetzt noch eine Ärgerlichkeit: Ich möchte gerne die einzufügende Datei
per http hinbekommen. Also habe ich folgendes gemacht:
Dim oRNG As Range
Dim FileName As String
FileName = "http://www.mypage.org/dir/myinclude.xml"
...
Set oRNG = ActiveDocument.Bookmarks("mybookmark").Range
oRNG.insertFile FileName "bookmarkinfile"
...
Das funktioniert "im Prinzip". Allerdings wird regelmäßig nicht bei
oRNG eingefügt, sondern an der aktuellen Cursorposition, was natürlich
die Datei komplett kaputtmacht.
Ist das ein bekannter Bug von Word-2003 oder ein Fehler meinerseits?
Und gibt es ein Workaround dafür? Kann ich z.B. den Cursor auf den
(Beginn des) Ranges setzen?
Set oRNG = ActiveDocument.Bookmarks("mybookmark").Range
oRNG.Delete
oRNG.Set_den_Cursor_hierhin ???
oRNG.insertFile FileName "bookmarkinfile"
Viele Grüße
Ole
> Set oRNG = ActiveDocument.Bookmarks("mybookmark").Range
> oRNG.insertFile FileName "bookmarkinfile"
> Das funktioniert "im Prinzip". Allerdings wird regelmäßig nicht bei
> oRNG eingefügt, sondern an der aktuellen Cursorposition, was natürlich
> die Datei komplett kaputtmacht.
Mit diesen beiden Zeilen sollte die Datei bei der Textmarke eingefügt werden,
frag mich jetzt aber nicht ob davor oder danach. Offenbar wird nicht der Text
der Textmarke ersetzt. Die Datei sollte aber auf keinen Fall beim Cursor, der
zufällig sonstwo im Dokument steht, eingefügt werden. Insofern wundert mich
Deine Beobachtung betreffs Einfügen beim Cursor.
> Ist das ein bekannter Bug von Word-2003 oder ein Fehler meinerseits?
Ich denke mir, da liegt ein Fehler in Deinem Programm, z.B. wird zwischen der
Abfrage der Textmarke und dem Einfüge die Variable oRNG nochmal auf den Cursor
gesetzt:
SET oRNG = Selection
Der Cursor ist an der Stelle, die in VBA mit SELECTION angesprochen wird. Wenn
man einen Bereich (Range) verwendet, dann ist das sowas wie ein unsichtbarer
Cursor und ist mit dem sichtbaren Cursor à priori nicht verbunden.
> Und gibt es ein Workaround dafür? Kann ich z.B. den Cursor auf den
> (Beginn des) Ranges setzen?
Um den Cursor auf einen Bereich zu setzen gibt es die Methode
oRNG.Select
Das sollte hier aber nicht nötig sein!
Um einen Bereich zu vergrößern, zu verkleinern oder zu verschieben schau Dir mal
die Methode Move, MoveStart, MoveEnd, weitere MoveIrgendwas und Collapse in der
VBA-Hilfe an.
Viele Grüße
Bernhard Sander
m...@spam.unerwuenscht writes:
>> Ist das ein bekannter Bug von Word-2003 oder ein Fehler meinerseits?
> Ich denke mir, da liegt ein Fehler in Deinem Programm
Mir kommt da auch bei schärfstem Draufblicken keine Erleuchtung. Darum
hier mal der gesamte bisherige Quelltext (ist ja zum Glück mehr ein
"Gewusst-wie" als eine komplexe Sache):
Attribute VB_Name = "Module1"
Sub ReplaceFunctions()
ReplaceXml ("functions")
End Sub
Sub ReplaceRecipeCalib()
ReplaceXml ("recipe_calib")
End Sub
Sub ReplaceXml(name As String)
Dim oRNG As Range
Dim FileName As String
FileName = "http://my_xml_server/dir/" & name & ".xml"
Dim BookmarkName As String
BookmarkName = name & "_xml"
If ActiveDocument.Bookmarks.Exists(BookmarkName) Then
Set oRNG = ActiveDocument.Bookmarks(BookmarkName).Range
oRNG.InsertFile FileName, "Inserted_XML_File"
If ActiveDocument.Bookmarks.Exists("Inserted_Xml_File") Then
Set oRNG = ActiveDocument.Bookmarks("Inserted_Xml_File").Range
ActiveDocument.Bookmarks.Add BookmarkName, oRNG
ActiveDocument.Bookmarks("Inserted_Xml_File").Delete
End If
End If
Set oRNG = Nothing
End Sub
Das Ganze funktioniert einwandfrei, wenn ich den FileName durch einen
lokalen Dateinamen ersetze. Ebenso funktioniert es, wenn ich die
Macros schrittweise abarbeite.
> zwischen der Abfrage der Textmarke und dem Einfüge die Variable oRNG
> nochmal auf den Cursor gesetzt:
> SET oRNG = Selection
Wer sollte das tun?
>> Und gibt es ein Workaround dafür? Kann ich z.B. den Cursor auf den
>> (Beginn des) Ranges setzen?
> Um den Cursor auf einen Bereich zu setzen gibt es die Methode
> oRNG.Select
> Das sollte hier aber nicht nötig sein!
Scheint zu helfen.
Was stimmt da bei meinem Code nicht? Soll ich mit dem Workaround
"oRNG.Select" leben oder gibt es da einen Fehler zu korrigieren?
Viele Grüße
Ole
> Also hast du eigentlich eine formatierte Word-Datei, die als .xml
> abgespeichert wurde. Und du willst das "Dokument" einfügen und nicht nur den
> XML-Code, oder?
Auch wenn der Thread alt ist, JFTR: Bei mir klappt (bis jetzt in W97 und
W2k3): Zu includende Datei öffnen und dem Range.FormattedText der
Zielstelle den Document.Range.FormattedText des zu includenden Dokuments
zuweisen.