Linie (Borders) nur beim ersten Durchgang

  • Word

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von tamaleus.

    Linie (Borders) nur beim ersten Durchgang

    Hallo zusammen!

    Erst mal hoffe ich wirklich, dass ich nichts übersehen habe und an der richtigen Stelle bin.

    Ich möchte aus VB.Net heraus eine Worddatei generieren, in welcher jeweils nach einer Textzeile eine Linie (Borders...) ausgegeben wird. Das klappt eigentlich auch, allerdings wird diese Linie nur immer nach der ersten Textzeile (sichtbar?) ausgegeben. Was mache ich falsch, dass ich immer nur nach der ersten Zeile eine Linie bekomme?

    Ferner - vielleicht hängt das auch zusammen (?) - werden in meinen Word-Befehlen die Parameter wie z.B. in folgender Anweisung nicht erkannt, bzw. durch VB reklamiert. Und zwar sämtliche "wd..."-Parameter ALLER Befehle. Dieser MoveUp nur als Beispiel:

    .MoveUp(unit:=wdParagraph, Count:=1, Extend:=wdExtend)

    "wdParagraph" und "wdExtend" funktionieren nicht. Wenn ich diese Parameter allerdings durch Zahlen ersetze, dann funktionieren die jeweiligen Befehle. Was mache ich falsch, dass diese Parameter nicht richtig erkannt werden?

    Ich hoffe zur Verdeutlichung füge ich hier meinen exeplarischen Code mit ein.

    Visual Basic-Quellcode

    1. Dim objWord As Object
    2. objWord = CreateObject("Word.Application")
    3. objWord.Visible = True
    4. objWord.Documents.Add()
    5. With objWord.Selection
    6. For i = 0 To ListBoxWord.Items.Count - 1
    7. ' Folgendes funktioniert wegen den Parameter-Namen wie z.B. "wdParagraph" nicht
    8. ' Sie werden in meinem VB 2010 EE einfach nicht erkannt. Woran kann das liegen?
    9. '.MoveUp(unit:=wdParagraph, Count:=1, Extend:=wdExtend)
    10. ' Allerdings funktioniert - als Beispiel - Folgendes:
    11. '.MoveUp(unit:=4, Count:=1, Extend:=0)
    12. ' Hier werden beispielsweise meine Zeilen ausgegeben:
    13. .TypeText(strZeileninhalt Zeile 1)
    14. .TypeParagraph()
    15. .TypeText(strZeileninhalt Zeile 2)
    16. .TypeParagraph()
    17. .TypeParagraph()
    18. ' Auch dieser Linien-Befehl erzeugt eine Linie - wie gewünscht.
    19. ' Dies allerdings nur beim ersten Durchgang durch die FOR-NEXT-Schleife.
    20. ' Sobald die Schlaufe ein zweites Mal durchlaufen wird, ist diese Linie,
    21. ' welche ich mit "Borders..." erzeugen wollte im Ergebnis, der Worddatei,
    22. ' nicht zu sehen. Woran kann das liegen?
    23. .Borders(1).LineStyle = 2
    24. .TypeParagraph()
    25. Next i
    26. End With
    27. 'objWord.Documents.Close(Word.WdSaveOptions.wdDoNotSaveChanges)
    28. 'objWord.Quit()
    29. 'objWord = Nothing



    Nun hoffe ich, ich habe nichts vergessen und danke schon mal im Voraus für jeglichen Input.

    Beste Grüsse

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „tamaleus“ ()

    Kein Late-Binding sondern

    Visual Basic-Quellcode

    1. Dim objWord As New Word.Application
    Dafür das CreateObject weglassen.

    Dazu musst du die passende Referenz auf Microsoft.Office.Interop.Word einbinden (vermutlich Microsoft Word 12.0 Object Library).
    Und den Namespace importieren

    Visual Basic-Quellcode

    1. Imports Microsoft.Office.Interop.Word

    Damit müssten automatisch auch die wd...-Konstanten vorhanden sein.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()

    Vielen Dank für Deine Antwort!

    Habe das auch gleich umgesetzt, wurde aber darauf hingewiesen, dass ich zusätzlich auch

    Visual Basic-Quellcode

    1. Imports Microsoft.Office.Interop


    importieren muss. Habe das dann auch gemacht. Trotzdem werden die Variablen noch nicht erkannt. Eine Reihe von Wd...-Werten kann ich in der interaktiven Eingabehilfe sehen, aber nicht z.B. "WdParagraph" (es ist nur z.B. "WdParagraphAlignment" zu sehen, sobald ich "wdpara.." eintippe.

    Auch das mit der Ausgabe der Trennlinie bei JEDEM Durchgang durch die For-Next-Schlaufe klappt leider noch nicht. Daran, dass ich noch mit Word 2003, SP3 arbeite kann's ja wohl nicht liegen, oder doch?

    Noch eine Idee, was vielleicht auch noch nicht stimmt oder ich vielleicht falsch gemacht habe?

    PS: Ein Teil der wd-Parameter scheint nun vorhanden zu sein und zu funktionieren. So klappt z.B. Folgendes:

    Visual Basic-Quellcode

    1. .Borders(1).LineStyle = WdLineStyle.wdLineStyleDot


    Dass diese Linie aber immer nur beim ersten Durchgang erscheint, bleibt nach wie vor unklar.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „tamaleus“ ()

    Dein "With Selection" bewirkt, dass sich alles auf die ursprüngliche Selection bezieht.
    Durch die Inserts (TypeText, TypeParagraph) wird aber "Selection" verschoben.
    Lass das With-Statement weg und schreibe stattdessen das "Selection" explizit dazu, dann bezieht es sich auf die jeweils aktive Selection.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Das war's leider auch nicht.

    Der Output sieht unverändert aus: Immer nur nach dem ersten Durchgang wird an der gewünschten Stelle eine Linie gesetzt.

    Allerdings glaube ich verstanden zu haben, dass mit dem Befehl:

    Visual Basic-Quellcode

    1. .Borders(1).LineStyle = WdLineStyle.wdLineStyleDot


    bzw. wie er jetzt lautet:

    Visual Basic-Quellcode

    1. objWord.Selection.Paragraphs.Borders(1).LineStyle = WdLineStyle.wdLineStyleDot


    das Zeichnen der Linie quasi eingeschaltet wird. Ich möchte hingegen nur, dass an der bestimmten Stelle eine Linie gezeichnet wird (und die anderen Paragrafen in ihrer Formatierung unverändert bleiben).

    Denn wenn ich anstelle des ".Borders(1).LineStyle"-Befehls z.B. angebe: "objWord.Selection.TypeText("- - - - -")", dann passiert eigentlich genau das, was ich möchte. Bloss, kann das nicht die Lösung sein, da die Dokumente ja von Fall zu Fall unterschiedlich breit eingestellt sein können. Mit ein paar Strichlein werde ich es also nie hinbekommen, eine Linie über die ganze Breite zu erzeugen.

    Auch der Versuch, das Ganze mit Makro-Rekorder aufzuzeichnen hat deshalb nicht funktioniert, weil wiederum die meisten der "wd-Parameter" bei mir nicht funktionieren.

    Noch eine Idee?

    tamaleus schrieb:

    das Ganze mit Makro-Rekorder aufzuzeichnen hat deshalb nicht funktioniert, weil wiederum die meisten der "wd-Parameter" bei mir nicht funktionieren.
    Die gibt's schon, die heißen nur eventuell leicht anders. IntelliSense listet die richtigen auf.

    Wenn du sie nicht findest, kannst du sie immer noch als Konstanten definieren.
    Die Word-IDE zeigt sie bei MoouseOver ja an.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Danke für den Hinweis.

    Habe den Cursor (im Word) an die gewünschte Stelle gesetzt und dann über "Format / Rahmen und Schattierung" unten eine Linie gesetzt. Das ganze mit Rekorder aufgezeichnet sah so aus:

    Visual Basic-Quellcode

    1. '
    2. ' Makro1 Makro
    3. ' Makro aufgezeichnet am 05.11.2012 von tamaleus
    4. '
    5. With Selection.ParagraphFormat
    6. .Borders(wdBorderLeft).LineStyle = wdLineStyleNone
    7. .Borders(wdBorderRight).LineStyle = wdLineStyleNone
    8. .Borders(wdBorderTop).LineStyle = wdLineStyleNone
    9. With .Borders(wdBorderBottom)
    10. .LineStyle = wdLineStyleDot
    11. .LineWidth = wdLineWidth050pt
    12. .Color = wdColorAutomatic
    13. End With
    14. With .Borders
    15. .DistanceFromTop = 1
    16. .DistanceFromLeft = 4
    17. .DistanceFromBottom = 1
    18. .DistanceFromRight = 4
    19. .Shadow = False
    20. End With
    21. End With
    22. With Options
    23. .DefaultBorderLineStyle = wdLineStyleDot
    24. .DefaultBorderLineWidth = wdLineWidth050pt
    25. .DefaultBorderColor = wdColorAutomatic
    26. End With


    Habe das dann für mein VB.Net (ohne With-Blöcke) umgearbeitet und dann dies in meinen Code (innerhalb der For-Next-Schleife) eingefügt:

    Visual Basic-Quellcode

    1. '
    2. ' Makro1 Makro
    3. ' Makro aufgezeichnet am 05.11.2012 von tamaleus
    4. '
    5. 'With Selection.ParagraphFormat
    6. objWord.Selection.ParagraphFormat.Borders(WdBorderType.wdBorderLeft).LineStyle = WdLineStyle.wdLineStyleNone
    7. objWord.Selection.ParagraphFormat.Borders(WdBorderType.wdBorderRight).LineStyle = WdLineStyle.wdLineStyleNone
    8. objWord.Selection.ParagraphFormat.Borders(WdBorderType.wdBorderTop).LineStyle = WdLineStyle.wdLineStyleNone
    9. 'With .Borders(wdBorderBottom)
    10. objWord.Selection.ParagraphFormat.Borders(WdBorderType.wdBorderBottom).LineStyle = WdLineStyle.wdLineStyleDot
    11. objWord.Selection.ParagraphFormat.Borders(WdBorderType.wdBorderBottom).LineWidth = WdLineWidth.wdLineWidth050pt
    12. objWord.Selection.ParagraphFormat.Borders(WdBorderType.wdBorderBottom).Color = WdColor.wdColorAutomatic
    13. 'End With
    14. 'With .Borders
    15. objWord.Selection.ParagraphFormat.Borders.DistanceFromTop = 1
    16. objWord.Selection.ParagraphFormat.Borders.DistanceFromLeft = 4
    17. objWord.Selection.ParagraphFormat.Borders.DistanceFromBottom = 1
    18. objWord.Selection.ParagraphFormat.Borders.DistanceFromRight = 4
    19. objWord.Selection.ParagraphFormat.Borders.Shadow = False
    20. 'End With
    21. 'End With
    22. 'With Options
    23. objWord.Options.DefaultBorderLineStyle = WdLineStyle.wdLineStyleDot
    24. objWord.Options.DefaultBorderLineWidth = WdLineWidth.wdLineWidth050pt
    25. objWord.Options.DefaultBorderColor = WdColor.wdColorAutomatic
    26. 'End With


    Ergebnis ist, dass an der betreffenden Stelle eine Linie eingefügt wird, die aber mit jeder neuen Zeile, die aus meinem VB kommt, eins nach unten geschoben wird, so dass die unterstrichene Linie anstatt immer wieder dazwischen nur am Schluss einmal vorkommt.

    Ungefähr so sollte das Ganze dann aussehen:

    Visual Basic-Quellcode

    1. Titelzeile
    2. 19.00 Zeile 1a
    3. 19.00 Zeile 1b
    4. 01.00 Zeile 2a
    5. 01.00 Zeile 2b
    6. 02.00 Zeile 3a
    7. 02.00 Zeile 3b


    Jeweils nach einem Zweierblock aus Zeile a und b sollte eine Trennlinie sein. Effektiv ist diese Linie aber nun nur am Ende zu sehen.

    Was muss ich ändern, damit immer zwei Zeilen durch eine Linie getrennt werden?

    tamaleus schrieb:

    die aber mit jeder neuen Zeile, die aus meinem VB kommt, eins nach unten geschoben wird,
    Die Formatierung gilt für den aktuellen Abschnitt.
    Füge den relevanten Text in diesen Abschnitt ein.

    Dann fügst du danach einen neuen Abschnitt ein und formatierst diesen genauso.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Sorry, das verstehe ich noch nicht so ganz.

    Kannst Du mir das bitte anhand meines ersten Code-Beispiels in meinem ersten Beitrag, den ich zwischenzeitlich leicht angepasst habe, sodass er zum gezeigten Beispiel von Beitrag Nr. 7 passt, aufzeigen, was ich wo einfügen muss, wenn Zeile Nr. 30 jene ist, die den Absatz unterstreichen sollte?
    Ich muss zu meiner Schande gestehen: Ich hab das nicht so ganz verstanden.

    Jedenfalls habe ich alle Varianten, die mir einfielen durchgetested: Leider immer mit dem gleichen Ergebnis, nämlich dem, dass es immer nur eine Linie gibt. Jedenfalls nicht, wie gewünscht, jeweils hinter einem Zeilenpaar (aus "Xa" und "Xb").

    Ich bin auch immer dafür, dass es am besten ist, wenn man sich die Lösung selbst erarbeitet. Leider bekomme ich es nicht hin und bitte daher um eine konkrete Lösung oder eine etwas ausführlichere Erklärung.
    Zur Lösung des Problems gekommen mit:

    1. Verweis
    auf "Microsoft Word 11.0 Object Library" gelöscht und neu importiert.
    Möglicherweise war diese OL nicht sauber/vollständig eingebunden.

    2. Word-Steuerung
    anstatt mit dem Befehl
    --> objWord.Selection.Borders(1).LineStyle = 2
    nun mit dem Befehl
    --> objWord.Selection.Borders(1).LineStyle = WdLineStyle.wdLineStyleDot
    gemacht.

    3. Zusätzlich: Markierung
    der betreffenden Zeile vor Druckbefehl mit diesem Statement:
    --> objWord.Selection.MoveUp(Unit:=Word.WdUnits.wdParagraph, Count:=1, Extend:=Word.WdMovementType.wdExtend)
    Das Statement (ebenfalls im Internet gefunden):
    --> objWord.Selection.MoveUp(Unit:=wdParagraph, Count:=1, Extend:=wdExtend)
    funktioniert jedenfalls bei mir nicht, da z.B. "wdParagraph" nach wie vor nicht erkannt wird.

    @ petaod: Nochmals besten Dank für die ausdauernde Schützenhilfe.