Zeilen von vb.net aus in Word farbig unterlegen

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von tulla.

    Zeilen von vb.net aus in Word farbig unterlegen

    Hallo allerseits

    Hoffe, habe keinen Eintrag übersetzen und bin hier richtig. Ich möchte von VBEE 2010/vb.net aus in Word bestimmte Zeilen farbig unterlegen und habe dazu mal folgendes zusammengestellt aufgrund dessen, was ich so finden konnte. Das funktioniert allerdings nicht, bzw. nur soweit, als dass zwar die eine oder andere Zeile ganz schnell farbig unterlegt wird, mit Beginn der nächsten Zeile diese Farb-Unterlegung aber wieder weg ist. Wer kann mir bitte möglichst konkret bei folgendem Code helfen:

    VB.NET-Quellcode

    1. 'Dim objWord As Object
    2. Dim objWord As New Word.Application
    3. ' Word anzeigen
    4. objWord.Visible = True
    5. ' Word-Dokument hinzufügen
    6. objWord.Documents.Add()
    7. ' Name der Schriftart auslesen
    8. objWord.Selection.Font.Name = "Arial"
    9. Const wdColorWhite = 16777215
    10. Const wdColorGray10 = 15132390
    11. Const wdColorYellow = 65535
    12. Dim i As Integer = 1
    13. objWord.Selection().Range.Select()
    14. objWord.Selection.ParagraphFormat.Shading.BackgroundPatternColor = wdColorGray10
    15. objWord.Selection.TypeText("Dies ist der erste Absatz, bzw. die erste Zeile")
    16. objWord.Selection.TypeParagraph()
    17. i = i + 1
    18. objWord.Selection().Range.Select()
    19. objWord.Selection.ParagraphFormat.Shading.BackgroundPatternColor = wdColorWhite
    20. objWord.Selection.TypeText("Dies ist der zweite Absatz")
    21. objWord.Selection.TypeParagraph()
    22. objWord.Selection().Range.Select()
    23. objWord.Selection.ParagraphFormat.Shading.BackgroundPatternColor = wdColorWhite
    24. objWord.Selection.TypeText("Dies ist der dritte Absatz")
    25. objWord.Selection.TypeParagraph()
    26. i = i + 1
    27. objWord.Paragraphs(i).Range.Select()
    28. objWord.Selection.ParagraphFormat.Shading.BackgroundPatternColor = wdColorYellow
    29. objWord.Selection.TypeText("Dies ist der vierte Absatz")
    30. objWord.Selection.TypeParagraph()
    31. i = i + 1


    Nachtrag: Wenn ich den Buchstaben "i" überall einsetze, wie das im letzten Block der Fall ist, dann kommt schon bei der ersten Zeile eine Fehlermeldung. Dabei möchte ich ja eigentlich nur einfach bei Bedarf eine farbige Unterlegung einschalten und dann für die nächste Zeile wieder ausschalten können.

    Vorab schon mal besten Dank für jegliche Schützenhilfe.

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Ich brauche das "i" nicht, da ich mir meine Bedingung dann sowieso anders zusammenbauen muss. Aber auf der Seite, auf welcher ich das Grundmuster des Codes gefunden habe, war das "i" als Zeilenzähler genutzt, um zb. jede n-te Zeile so oder so farbig zu hinterlegen. Wenn ich allerdings bei mir das "i" so einsetze, wie es das auf dieser Seite angegeben war, also

    VB.NET-Quellcode

    1. objWord.Selection(i).Range.Select()


    eintrage, dann erhalte ich schon gleich beim Eingeben den Fehler: "Zu viele Argumente für "Public Default Property Text as String". Drum habe ich es hier im Beispiel zwar aus den Klammern rausgenommen, aber noch drin stehen lassen, falls das sonst wie von Bedeutung wäre, ausser eben, dass es nur ein Zähler ist. Kurzer Rede langer Sinn: Vergiss das "i".

    Meine Frage ist nach wie vor: Warum funktioniert obiges Stück Code nicht wunschgemäss. Bei mir blitzt die einzufärbende Zeile nur kurz in der gewünschten Farbe auf, ist dann aber am Schluss wieder "normal", also schwarz auf weiss. Warum?

    (Quelle: technet.microsoft.com/en-us/library/ee692865.aspx)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „tamaleus“ () aus folgendem Grund: Quellenangabe

    Du solltest dir da eine andere Formulierung ausdenken.

    Da dieser Fehler:
    Der öffentliche Member range für den Typ ApplicationClass wurde nicht gefunden.

    im Bezug auf:

    VB.NET-Quellcode

    1. objWord.paragraph().range.Select()


    Wenn ich das richtig lese, gibt es diese Funktion in der Art nicht mehr.
    Hattest Du Gelegenheit, Dir die angegebene Quelle anzusehen?

    Dann wird klar, was ich gerne möchte punkto farbig unterlegen: Allein, es funktioniert nicht und ich erbitte eine Lösung, da ich ziemlicher Anfänger bin, was das Makroschreiben angeht.

    Wie bitte komme ich zum gewünschten Ziel?

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

    Du kannst versuchen, das Word-intern mit dem Macro-Editor aufzuzeichnen und dann abzuspielen, solange bis er das macht, was du willst.
    Diesen Code kannst du dann in VB.net adaptieren.
    Aber trivial ist das Code-gesteuerte Formatieren in Word nicht, da Word ein Eigenleben hat, das ich auch noch nicht komplett verstanden habe.

    Es kann gut sein, dass du erst schreiben musst und dann das Geschriebene selektieren und formatieren.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Danke für den Recording-Tipp. Den habe ich bereits durchexerziert und kann bestätigen, was Du äusserst: Es ist nicht einfach und vor allem führt es - zumindest in meinem Fall - leider NICHT zum Ziel. Ich kann aber mit grosser Wahrscheinlichkeit sagen, dass die Zeilen

    VB.NET-Quellcode

    1. objSelection.ParagraphFormat.Shading.BackgroundPatternColor = wdColorRed ' färbt rot ein, soweit richtig
    2. objSelection.TypeText "Dies ist der gewünschte Text" ' schreibt den Text
    3. objSelection.TypeParagraph()
    ' erzeugt eine Absatzmarke

    schon richtig sind. Ich kann auch den farbig (rot) hinterlegten Balken wirklich kurz aufblitzen sehen; mit der nächsten Anweisung (hier oben nicht zu sehen), also dem Zurückstellen der Hintergrundfarbe wieder auf weiss (für die nächste Textzeile) ist eben auch der rote Balken wieder weg. Wie also müsste der rote Balken "fixiert" werden, sodass er nicht durch eine nachfolgende Formatierung wieder aufgehoben wird?
    Das kann ich nachvollziehen und bestätigen.

    Wie aber komme ich jetzt zum Ziel, dass nur eine Zeile, egal ob die erste oder sonst eine, aber nur EINE farbig hinterlegt ist und die anderen dann wieder "normal" sind. Also wie kann ich das Hinterlegen für EINE Zeile ein- und dann wieder ausschalten?

    ( Ich hab's Gefühl es fehlt sooo wenig ;(
    Wenn du nur einen Absatz(Zeile) färben willst reicht doch das hier

    VB.NET-Quellcode

    1. objWord.Selection().Range.Select()
    2. objWord.Selection.ParagraphFormat.Shading.BackgroundPatternColor = wdColorGray10
    3. objWord.Selection.TypeText("Dies ist der erste Absatz, bzw. die erste Zeile")
    4. objWord.Selection.TypeParagraph()


    dann solltest noch hinten dran hängen ABER TESTEN!

    VB.NET-Quellcode

    1. objWord.Selection.BackgroundPatternColor = wdColorWhite


    Es geht ja nur darum nach der Anweisung zu sagen, "Mach hintergrund wieder weiß".

    Habe aber im mom nicht testen können ob die Word.Aplication dies so unterstütz. Musst mal schauen was er dir für Möglichkeiten beim eingeben von objWord.Selection. gibt.
    Eben genau das "wieder auf weiss stellen" funktioniert eben nicht.

    Laut (meiner) Intellisense gibt es die Konstellation

    VB.NET-Quellcode

    1. objWord.Selection.BackgroundPatternColor = wdColorWhite


    nicht.

    Hinter "objWord.Selection." könnten z.B. folgen "Paragraphsformat" oder "Paragraph". Und so habe ich auch ziemlich alle Varianten von

    VB.NET-Quellcode

    1. objWord.Selection.ParagraphFormat.Shading.BackgroundPatternColor = wdColorWhite


    ausprobiert, ohne, dass das einen Effekt gezeigt hätte. Ich brauche aber nicht einen ganzen Absatz gelb, sondern nur eine Zeile und dann nachher wieder weiss, also normal weiter. Halt so, dass in einer Liste eine bestimmte Zeile durch farbige Unterlegung deutlich sichtbar wird. Und da eben schon recht viele Farben im Spiel sind, ist es auch keine optimale Lösung, einfach den Text andersfarbig darzustellen. Das farbig Unterlegen wäre schon super!

    Und um alle Missverständnisse auszuschliessen: So sollte es aussehen:

    Ich glaube, nun eine funktionierende Lösung gefunden zu haben, bin mir aber nicht so ganz sicher, an was es gelegen hat; möglicherweise, weil ich vorher bei den Imports den "Imports Microsoft.Office.Core" nicht dabei hatte. Jedenfalls hat bei mir der folgende Code nun das gewünschte Ergebnis gezeigt und nur die eine Zeile farbig hinterlegt und nicht alle danach folgenden:

    VB.NET-Quellcode

    1. Imports Microsoft.Office.Interop
    2. Imports Microsoft.Office.Interop.Word
    3. Imports Microsoft.Office.Core
    4. Public Class Form1
    5. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    6. Try
    7. Dim objWord As New Word.Application
    8. Dim objDocument As New Word.Document
    9. objWord.Visible = True
    10. objDocument = objWord.Documents.Open _
    11. (Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "\MyDoc.doc")
    12. Const wdColorWhite = 16777215
    13. Const wdColorGray10 = 15132390
    14. Const wdColorYellow = 65535
    15. With objWord.Selection
    16. .ParagraphFormat.Shading.BackgroundPatternColor = wdColorGray10
    17. .TypeText("This is the first paragraph.")
    18. .TypeParagraph()
    19. objDocument.Paragraphs(i).Range.Select()
    20. .ParagraphFormat.Shading.BackgroundPatternColor = wdColorWhite
    21. .TypeText("This is the second paragraph.")
    22. .TypeParagraph()
    23. objDocument.Paragraphs(i).Range.Select()
    24. .ParagraphFormat.Shading.BackgroundPatternColor = wdColorYellow
    25. .TypeText("This is the third paragraph.")
    26. .TypeParagraph()
    27. objDocument.Paragraphs(i).Range.Select()
    28. .ParagraphFormat.Shading.BackgroundPatternColor = wdColorWhite
    29. .TypeText("This is the fourth paragraph.")
    30. .TypeParagraph()
    31. End With
    32. Catch ex As Exception
    33. MessageBox.Show(Err.Number & ": " & Err.Description)
    34. End Try
    35. End Sub


    Für mich wäre das also soweit geklärt. Allen, die sich beteiligt haben nochmals besten Dank für die Inputs. Auch das mit der vermeintlich nicht existierenden Konstante "wdColorWhite" hat sich geklärt: Sie wird eingangs definiert und sieht aber nur so aus, wie eine Microsoft-Word-Konstante.

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

    Auf ein Neues:

    VB.NET-Quellcode

    1. Imports Microsoft.Office.Interop
    2. Imports Microsoft.Office.Interop.Word
    3. Imports Microsoft.Office.Core
    4. Public Class Form1
    5. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    6. Try
    7. Dim objWord As New Word.Application
    8. Dim objDoc As New Word.Document
    9. Dim i As Integer = 0
    10. Const wdColorWhite = 16777215
    11. Const wdColorGray10 = 15132390
    12. Const wdColorYellow = 65535
    13. objWord.Visible = True
    14. objDoc = objWord.Documents.Add()
    15. i = 1
    16. objWord.Selection.ParagraphFormat.Shading.BackgroundPatternColor = CType(wdColorGray10, Word.WdColor)
    17. objWord.Selection.TypeText("This is the first paragraph.")
    18. objWord.Selection.TypeParagraph()
    19. i = i + 1
    20. objDoc.Paragraphs(i).Range.Select()
    21. objWord.Selection.ParagraphFormat.Shading.BackgroundPatternColor = CType(wdColorWhite, Word.WdColor)
    22. objWord.Selection.TypeText("This is the second paragraph.")
    23. objWord.Selection.TypeParagraph()
    24. i = i + 1
    25. objDoc.Paragraphs(i).Range.Select()
    26. objWord.Selection.ParagraphFormat.Shading.BackgroundPatternColor = CType(wdColorYellow, Word.WdColor)
    27. objWord.Selection.TypeText("This is the third paragraph.")
    28. objWord.Selection.TypeParagraph()
    29. i = i + 1
    30. objDoc.Paragraphs(i).Range.Select()
    31. objWord.Selection.ParagraphFormat.Shading.BackgroundPatternColor = CType(wdColorWhite, Word.WdColor)
    32. Catch ex As Exception
    33. MessageBox.Show(Err.Number & ": " & Err.Description)
    34. End Try
    35. End Sub


    Ich hoffe sehr, dass ich jetzt nichts vergessen und nicht die falsche Version erwischt habe.

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

    naja - so richtig programmieren würde ich das noch nicht nennen - dassis noch eher von hier und da zusammengeschrieben ohne viel davon zu verstehen. Nicht falsch verstehen: aller Anfang ist so. :thumbsup:

    Jedenfalls bei VBA findich ganz wichtig, dass man die Selection-Objekte, die der MacroRecorder immer generiert, versteht und für sich nutzt. Das sind nämlich Ranges, und die kann man auch in einer Range-Variable speichern, und dann drauf rumorgeln, ohne dass da ständig mit Document.Select(blabla) da irrsinnige Umorganisierungen im Word (Selection ändern ist urs teuer) erzwungen werden. Also erster Schritt:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    2. Dim objWord As New Word.Application
    3. Dim objDoc As New Word.Document
    4. Const wdColorWhite = 16777215
    5. Const wdColorGray10 = 15132390
    6. Const wdColorYellow = 65535
    7. objWord.Visible = True
    8. objDoc = objWord.Documents.Add()
    9. With objWord.Selection
    10. .ParagraphFormat.Shading.BackgroundPatternColor = CType(wdColorGray10, Word.WdColor)
    11. .TypeText("This is the first paragraph.")
    12. .TypeParagraph()
    13. End With
    14. With objDoc.Paragraphs(2).Range
    15. .ParagraphFormat.Shading.BackgroundPatternColor = CType(wdColorWhite, Word.WdColor)
    16. .TypeText("This is the second paragraph.")
    17. .TypeParagraph()
    18. End With
    19. With objDoc.Paragraphs(3).Range
    20. .ParagraphFormat.Shading.BackgroundPatternColor = CType(wdColorYellow, Word.WdColor)
    21. .TypeText("This is the third paragraph.")
    22. .TypeParagraph()
    23. End With
    24. With objDoc.Paragraphs(4).Range
    25. .ParagraphFormat.Shading.BackgroundPatternColor = CType(wdColorWhite, Word.WdColor)
    26. End With
    27. End Sub
    ich hoffe, ich habe keine Fehler eingebaut - ist ungetestet :/

    Da sieht man nun auch, dass mit allen Paragraphen eiglich dasselbe gemacht wird, weshalb sich anböte, eine Methode

    VB.NET-Quellcode

    1. Private Sub OverWriteRange(rng As Range, color As Word.WdColor, text as String)
    2. '...
    zu coden.

    Sodass man letztendlich diese 3 mal aufrufen kann:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    2. Dim objWord As New Word.Application
    3. Dim objDoc As New Word.Document
    4. Const wdColorWhite = 16777215
    5. Const wdColorGray10 = 15132390
    6. Const wdColorYellow = 65535
    7. objWord.Visible = True
    8. objDoc = objWord.Documents.Add()
    9. OverWriteRange(objWord.Selection, CType(wdColorGray10, Word.WdColor),"This is the first paragraph.")
    10. OverWriteRange(objDoc.Paragraphs(2).Range, CType(wdColorWhite, Word.WdColor),"This is the second paragraph.")
    11. OverWriteRange(objDoc.Paragraphs(3).Range, CType(wdColorYellow, Word.WdColor),"This is the third paragraph.")
    12. With objDoc.Paragraphs(4).Range
    13. .ParagraphFormat.Shading.BackgroundPatternColor = CType(wdColorWhite, Word.WdColor)
    14. End With
    15. End Sub

    Ich glaube auch nicht, dass diese Typumwandlung

    VB.NET-Quellcode

    1. CType(wdColorWhite, Word.WdColor)
    wirklich nötig ist.
    Gibts da keine Werte wie

    VB.NET-Quellcode

    1. Word.WdColor.ColorWhite
    oder sowas?