Text in einem Word.Paragraph ändern...

Von: , Frage gestellt am So, 7. Okt 2007

Halli hallo,

ich habe eine recht spezielle Frage und weiß nicht wirklich ob ich eher hier oder im VisualBasic Bereich richtig bin.
Das Problem ist leider Themenübergreifend.

Es geht um folgendes:

Ich parse ein Word- Dokument nach Paragraphs ab die einem bestimmten Word.Style genügen. Dann finde ich einen Paragraph, welcher leider auch irrelevanten text enthält.
Nun, ich übergebe den kompletten Paragraph an eine Funtion die das entfernen des unnötigen teil übernimmt.
Die Funktion mach nichts anderes als den Paragraph.Range.Text in eine Variable zu übergeben die ich dann nach belieben kürze.

Nun zum Kern der Sache:
Wenn ich am Ende der Funktion den Text der in meiner Variable übrig geblieben ist wieder in den Paragraph.Range.Text schreibe, ist dort beliebig viel Text der, erstens vorher nicht in ihm vorhanden war, und zweitens eigentlich in einem der folgenden Paragraphen enthalten sein sollte.

Ich bin Dankbar für jeden Vorschlag. Behandle ich das Paragraph Object nicht richtig?

Mit freundlichen Grüßen

kjellski

P.S.: Das ganze passiert von außern über das Word-Object-Model.

5 Antworten zu dieser Frage

  1. Antwort von nach 4 Stunden 0 hilfreich
    Re: Text in einem Word.Paragraph ändern...

    Guten Abend nochmal allerseits,

    anscheinend ist meine Frage doch sehr speziell.
    Ich bin am Problem an sich vorbei weil ich mir einfach eine
    Klasse geschrieben habe die diese Informationen über Style
    und Text beinhaltet.

    Allerdings bin ich doch nicht zufrieden. Es wird doch wohl eine
    Erklärung für mein Problem geben oder?

    Wenn ich mein Problem nicht ausführlich genug geschildert habe
    dann hoffe ich noch jmd. muten zu finden der mir das sagt.

    Mit freundlichen Grüßen

    kjellski [Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

  2. Antwort von nach 17 Stunden 0 hilfreich
    der code sagt mehr als 1000 worte...

    hallo kjellski

    natürlich kann man da jetzt jede menge kaffeesudlesen. einfacher geht es aber, wenn du mal den relevanten code hier postest (sowohl die text-ersetzen-funktion als auch den aufrufenden teil) - dann kann man gezielt nach einer lösung für dich suchen.

    lg
    erwin

    • Antwort von nach 18 Stunden 0 hilfreich
      Re: der code sagt mehr als 1000 worte...

      Hallo erwin,
      erstmal tausend Dank das du so mutig warst.

      Hier ein paar Codeschnipsel:
      <code>

      Dim doc as Word.Document
      Dim sSection as Word.Section
      Dim para as Word.Paragraph

      'funktion sinngemäß wie im Code...
      For Each sSection in doc.sections
      For Each para in sSection.Range.ListParagaphs
      if para.Style.NameLocal = "MyStyle" then
      para.Range.Text = evaluateText(para)
      end if
      ...
      Next para
      Next sSection

      Public Function evalText(ByVal para as Word.Paragraph) as Word.Paragraph
      Dim text as String

      text = para.Range.Text

      text = text.Trim(" " & vbTab)

      para.Range.Text = text

      return para
      </code>

      Wie gesagt, da der Code so nicht mehr existiert habe ich ihn hier nachgebaut.
      Der Code ist allerdings sinngemäß exakt gleich.

      Das Problem war das er bei dem Rückgabewert nicht nur meinen Text im para.Range.Text hatte, wie man es nach der Zuweisung vermuten sollte, sondern auch Text aus einem der folgenden Paragraphs.

      Ich habe auch schon versucht den Range neu zu definieren, geht nicht wegen ReadOnly...

      Wie gesagt, ich habe mir schon ein Workarround gebastelt und wollte nur nochmal erfragen ob jmd. weiß wieso sich das Programm so komisch verhalten hat.

      Mit freundlichen =)

      kjellski [Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

      • Antwort von nach 19 Stunden 1 hilfreich
        Re^2: der code sagt mehr als 1000 worte...

        hallo kjellski

        also, wenn ich deinen codeschnipsel so korrigiere, dass er annähernd funktioniert, hat er eigentlich nicht mehr mit dem originalcode zu tun. insofern tue ich mir schwer, das ganze objektiv zu beurteilen.

        eine vermutung habe ich allerdings:

        - im beispielcode wird der text sowohl in der funktion als auch im aufrufenden code ersetzt (also das range.text = ...). ist so nicht ganz notwendig.

        - hauptproblem: das paragraph.range.text beinhaltet auch das abschließende absatzendezeichen. wird jetzt diesem range ein neuer text zugewiesen, wird dieses absatzendezeichen gelöscht - spricht, der absatz wird mit dem nachfolgenden kombiniert. dass dein ersetz-text vielleicht auch noch ein absatzzeichen drinnen hat, ist irrelevant - die granzen des ranges werden ausgewertet, bevor der neue text drinnen ist.

        das ganze ist etwas kompliziert zu erklären: ein range-objekt ist einfach nur ein markierter text-bereich im dokument - also beginn- und endposition. wenn du einen paragraph aus einen dokument ausliest und davon den range holst, bekommst du beginn und ende des paragraphen. wenn du nun in diesen range neuen text einfügst, verschiebt sich zwar das ende nach hinten - es muss nach dem einfügen aber kein einzelner paragraph mehr sein sondern kann durchaus inzwischen mehrere paragraphen beinhalten.



        generell:
        - eine funktion zu schreiben, die eine referenz auf einen paragraphen bekommt, um den text darin zu modifizieren, ist immer etwas gefährlich. der code wird dadurch extrem unübersichtlich. besser wäre es, nur den text des paragraphen zu übergeben und wieder einen text zurückzubekommen. dann hat der aufrufende code die verantwortung über den paragraphen - was normalerweise besser ist.

        - beim auslesen des texts eines paragraphen immer bedenken, dass das letzte zeichen das absatz-ende-zeichen ist. also immer ein
        text = left(para.range.text,len(para.range.text)-1)
        machen.

        im gegenzug niemals den range eines paragraphen vollständig überschreiben. also ein:
        Set bereich = ActiveDocument.Range(para.Range.Start, para.Range.End - 1)
        bereich.text = "blablabla"

        oder noch besser: gleich mit der suchen-und-ersetzen-funktion arbeiten. die ist um einiges schneller als alles, was du da mit vba irgendwie programmieren kannst. und es gibt wirklich nur ganz wenige dinge, die man damit nicht wirklich sauber hinbekommt.

        lg
        erwin

        • Antwort von nach 4 Tagen 0 hilfreich
          Re^3: der code sagt mehr als 1000 worte...

          Hallo erwin,

          du bist mein Held! =)

          Ich habe nie darüber nachgedacht das ich ja mit meinem ersetzen auch das letzte, also Paragraph beendende, Zeichen mit überschreibe.
          So macht das ganze Sinn.
          Mittlerweile habe ich den kompletten Overhead des Paragraph Objekts verworfen und die relevanten Informationen über einzel Variablen in einem extra Objekt gekapselt.

          Das mit dem Suchen ist so eine Sache.
          Ich habe schon versucht mir die einzelheiten über Suchen herauszufilter bin aber auf ein Problem gestoßen.
          Ich muss leider die Reihenfolge der Überschriften unterschiedlicher Formatierung einhalten. Ich könnte natürlich nach jedem Fund wieder einmal nachschaun ob zwischen diesem und dem nächsten ein relevanter anderer kommt, aber das erschien mir dann doch etwas umständlich.
          Ich bin für jeden Vorschlag offen.

          Ich würde dir gerne einmal umschreiben was mein Programm eigentlich machen soll:

          Bestimmt Dokumente sollen auf Überschriften hin durchsucht werden.
          Die Reihenfolge der relevanten Überschriften soll erhalten bleiben.
          Ich muß zu jeder Überschrift den Footer auslesen und in diesem möglicherweise unterschiedliche Daten filtern.
          Die überschriften werden Seitenweise in einer Liste zusammengefasst.
          Die Seite ist ein von mir erstelltes Objekt was auch die Informationen über den Footer enthält.

          Es gibt ein Objekt das ein komplettes Dokument darstell. Dieses enthält den Namen, Pfad und ein paar andere Informationen, sowie eine Liste über Seitenobjekte.

          Ich hoffe das hilft dir dabei eine Vorstellung von meinem Vorhaben zu bekommen.

          Mit freundlichen Grüßen

          kjellski

Keine passende Antwort gefunden? Jetzt eigene Frage stellen!