Hi,
Erstmal entschuldigung, falls die Frage in diesem Forum falsch wäre, aber ich weiß nicht, ob das hier oder in der Office-Abteilung besser aufgehoben ist, da es sich aber um ein Problem mit einem eigenständigen Programm handelt, das mit Word kommuniziert und nicht mit einem Word Makro selbst stelle ich es mal hier rein, auch wenn die Ursache selbst in Word sein mag.
Also: Um eine Textmarke in einer Word-Vorlage durch ein Bild zu ersetzen nutze ich folgenden Code (den ich auch irgendwann mal übernommen habe):
[highlight=vbnet]
Class WinWord
Private wrdApp As Object ' late binding zu Microsoft.Office.Interop.Word.Application
[...]
Public Shared Sub Replace(ByVal was As String, ByVal durch As String, Optional ByVal nichtWennLeer As Boolean = False)
If durch <> "" Or nichtWennLeer = False Then
If durch.Length() > 254 Then
While Finden(was)
appWord.selection.Delete()
appWord.selection.TypeText(Text:=durch)
End While
Else
appWord.selection.HomeKey(Unit:=wdStory, Extend:=wdMove)
With appWord.selection.Find
.Text = was
.ClearFormatting()
.Replacement.Text = Left$(durch, 254)
.Replacement.ClearFormatting()
.Execute(Replace:=wdReplaceAll, Forward:=True)
End With
End If
End If
End Sub
Public Shared Function Selection() As Object
Return appWord.selection
End Function
Public Shared Function Finden(ByVal was As String) As Boolean
appWord.selection.HomeKey(Unit:=wdStory, Extend:=wdMove)
With appWord.selection.Find
.Text = was
.ClearFormatting()
.Replacement.Text = ""
.Replacement.ClearFormatting()
.Forward = True
.Execute()
End With
Finden = (UCase$(appWord.selection.Text) = UCase$(was))
End Function
End Class
[...]
Sub DokumentBearbeiten()
[...]
If Not WinWord.Finden("*Freistempel") Then Return
WinWord.Selection.InlineShapes.AddPicture(picnameF reistempel, False, True)
While WinWord.Finden("*Freistempel") 'alle Vorkommen der Textmarke bearbeiten
WinWord.Selection.InlineShapes.AddPicture(picnameF reistempel, False, True)
End While
WinWord.Replace("*Freistempel", "")
[...]
End Sub
[/highlight]
Das hat eigentlich bisher auch immer geklappt, heute hatten wir aber plötzlich den Fall (auf meinem Rechner nicht reproduzierbar), dass Word hier in einer Endlosschleife hängenbleibt, weil er bei jedem Find denselben (einzigen) Eintrag erneut findet. Nun kann die Sache zwar einfach behoben werden, indem ich in DokumentBearbeiten nach dem WinWord.Selection.InlineShapes.AddPicture ein WinWord.Selection.Text="" setzen, und das Replce am Ende weglassen, das wäre dann aber auch nur wieder ein herumdoktoren an Symptomen.
Die Frage ist nun, woher kommt dieses Fehlverhalten? Warum verhält sich die Word-Instanz des Kollegen so anders als meine, hat der Kollege irgendwo Einstellungen geändert (er sagt nein, aber das muss ja nicht viel heißen )? Und wie arbeite ich dem effektiv entgegen? Reicht es im Find-Objekt das Execute() auszuwerten, muss ich explizit die Selection aufheben, bevor eine neue Suche gestartet wird (wegen der aktuellen "Ich habe was gefunden"-Auswertung) ein .Wrap=0 anzugeben?
Vielen Dank
Martin
Erstmal entschuldigung, falls die Frage in diesem Forum falsch wäre, aber ich weiß nicht, ob das hier oder in der Office-Abteilung besser aufgehoben ist, da es sich aber um ein Problem mit einem eigenständigen Programm handelt, das mit Word kommuniziert und nicht mit einem Word Makro selbst stelle ich es mal hier rein, auch wenn die Ursache selbst in Word sein mag.
Also: Um eine Textmarke in einer Word-Vorlage durch ein Bild zu ersetzen nutze ich folgenden Code (den ich auch irgendwann mal übernommen habe):
[highlight=vbnet]
Class WinWord
Private wrdApp As Object ' late binding zu Microsoft.Office.Interop.Word.Application
[...]
Public Shared Sub Replace(ByVal was As String, ByVal durch As String, Optional ByVal nichtWennLeer As Boolean = False)
If durch <> "" Or nichtWennLeer = False Then
If durch.Length() > 254 Then
While Finden(was)
appWord.selection.Delete()
appWord.selection.TypeText(Text:=durch)
End While
Else
appWord.selection.HomeKey(Unit:=wdStory, Extend:=wdMove)
With appWord.selection.Find
.Text = was
.ClearFormatting()
.Replacement.Text = Left$(durch, 254)
.Replacement.ClearFormatting()
.Execute(Replace:=wdReplaceAll, Forward:=True)
End With
End If
End If
End Sub
Public Shared Function Selection() As Object
Return appWord.selection
End Function
Public Shared Function Finden(ByVal was As String) As Boolean
appWord.selection.HomeKey(Unit:=wdStory, Extend:=wdMove)
With appWord.selection.Find
.Text = was
.ClearFormatting()
.Replacement.Text = ""
.Replacement.ClearFormatting()
.Forward = True
.Execute()
End With
Finden = (UCase$(appWord.selection.Text) = UCase$(was))
End Function
End Class
[...]
Sub DokumentBearbeiten()
[...]
If Not WinWord.Finden("*Freistempel") Then Return
WinWord.Selection.InlineShapes.AddPicture(picnameF reistempel, False, True)
While WinWord.Finden("*Freistempel") 'alle Vorkommen der Textmarke bearbeiten
WinWord.Selection.InlineShapes.AddPicture(picnameF reistempel, False, True)
End While
WinWord.Replace("*Freistempel", "")
[...]
End Sub
[/highlight]
Das hat eigentlich bisher auch immer geklappt, heute hatten wir aber plötzlich den Fall (auf meinem Rechner nicht reproduzierbar), dass Word hier in einer Endlosschleife hängenbleibt, weil er bei jedem Find denselben (einzigen) Eintrag erneut findet. Nun kann die Sache zwar einfach behoben werden, indem ich in DokumentBearbeiten nach dem WinWord.Selection.InlineShapes.AddPicture ein WinWord.Selection.Text="" setzen, und das Replce am Ende weglassen, das wäre dann aber auch nur wieder ein herumdoktoren an Symptomen.
Die Frage ist nun, woher kommt dieses Fehlverhalten? Warum verhält sich die Word-Instanz des Kollegen so anders als meine, hat der Kollege irgendwo Einstellungen geändert (er sagt nein, aber das muss ja nicht viel heißen )? Und wie arbeite ich dem effektiv entgegen? Reicht es im Find-Objekt das Execute() auszuwerten, muss ich explizit die Selection aufheben, bevor eine neue Suche gestartet wird (wegen der aktuellen "Ich habe was gefunden"-Auswertung) ein .Wrap=0 anzugeben?
Vielen Dank
Martin