Announcement

Collapse
No announcement yet.

Suchen in Word aus eigener Anwendung

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Suchen in Word aus eigener Anwendung

    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
Working...
X