Word Table bestimmte Zellen in einer Spalte auswählen und Mergen trotz Pagebreak

  • Word

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Broco.

    Word Table bestimmte Zellen in einer Spalte auswählen und Mergen trotz Pagebreak

    Hallo zusammen,

    ich greife per Microsoft.Office.Interop auf Word zu um da eine Tabelle zu erzeugen, trotzdem ist es ja quasi VBA, deshalb dachte ich, es passt hier besser rein.

    Mein Problem: Meine Tabelle besteht unter anderem aus einer Spalte "Kategorie" und einer Spalte "Einträge". Die Tabelle wird mit einer SQLite-Datenbank gefüttert.
    Jetzt soll meine Software die Zellen in der Spalte Kategorie Mergen und den Namen der Kategorie reinschreiben. Das funktioniert soweit ganz gut, allerdings nicht, wenn die Tabelle durch einen Seitenumbruch gesplittet wird.

    Hier der Codebereich für eine Kategorie:

    Quellcode

    1. If numberMachines > 0 Then
    2. wordtable.Cell(kategorypos, 1).Select()
    3. If numberMachines > 1 Then
    4. word.Selection.MoveDown(wordoptions.WdUnits.wdLine, (numberMachines - 1), wordoptions.WdMovementType.wdExtend)
    5. word.Selection.Cells.Merge()
    6. word.Selection.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphCenter
    7. word.Selection.Cells.VerticalAlignment = Microsoft.Office.Interop.Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter
    8. End If
    9. word.Selection.Shading.BackgroundPatternColor = -671039489
    10. If numberMachines > 4 Then
    11. word.Selection.Orientation = Microsoft.Office.Interop.Word.WdTextOrientation.wdTextOrientationUpward
    12. word.Selection.Font.Bold = True
    13. word.Selection.Font.Color = Microsoft.Office.Interop.Word.WdColor.wdColorWhite
    14. word.Selection.Font.Size = 8
    15. word.Selection.TypeText("Maschinen")
    16. End If
    17. With word.Selection.Borders(Microsoft.Office.Interop.Word.WdBorderType.wdBorderBottom)
    18. .LineStyle = Microsoft.Office.Interop.Word.WdLineStyle.wdLineStyleSingle
    19. .LineWidth = Microsoft.Office.Interop.Word.WdLineWidth.wdLineWidth150pt
    20. .Color = Microsoft.Office.Interop.Word.WdColor.wdColorBlack
    21. End With
    22. wordtable.Cell((kategorypos + numberMachines - 1), 2).Select()
    23. word.Selection.MoveRight(wordoptions.WdUnits.wdCharacter, 53, wordoptions.WdMovementType.wdExtend)
    24. With word.Selection.Borders(Microsoft.Office.Interop.Word.WdBorderType.wdBorderBottom)
    25. .LineStyle = Microsoft.Office.Interop.Word.WdLineStyle.wdLineStyleSingle
    26. .LineWidth = Microsoft.Office.Interop.Word.WdLineWidth.wdLineWidth150pt
    27. .Color = Microsoft.Office.Interop.Word.WdColor.wdColorBlack
    28. End With
    29. kategorypos = kategorypos + numberMachines
    30. End If


    Wenn also mehr als 1 Eintrag einer Kategorie vorhanden ist, sollen die Kategoriezellen gemerged werden, bei mehr als 4 soll der Name der Kategorie in die Zelle rein. Befindet sich jedoch ein Pagebreak in der Tabelle, passiert folgendes:



    Ich denke das liegt daran, dass die Range nicht einfach per "MoveDown" festegelegt werden kann. Wie kann ich eine Zelle in einer Tabelle auswählen, wenn der Header sich auf jeder Seite wiederholt?
    In Excel würde ich die Range der zu selektierenden Zellen einfach mit

    Quellcode

    1. ActiveSheet.Range(Cells(x1,y1), Cells(x2,y2)).Select

    auswählen, wie mache ich das mit den eindimensionalen Ranges in Word?
    Funktioniert das überhaupt manuell?
    Verbundene Zellen werden meines Wissens immer der Seite der ersten Zelle zugeordnet und auf der Folgeseite nicht angezeigt, selbst wenn der Text vom Format her auf die nächste Seite gehören würde.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Klar geht das. Sieht dann so aus:


    Ich muss eigentlich nur wissen, wie ich Zellen anhand ihrer Koordinaten in Word auswählen kann bzw. einen Bereich zwischen zwei Zellen markieren kann.
    Ich meine, so wäre es auch mit mogeln möglich, indem ich einfach schaue, wie viele Reihen auf eine Seite passen und am Ende muss ich einfach 6x "Move Down" machen, denn genau 6 Zellen bleiben frei. Das ist aber weder "sauber" noch sicher.
    Oh man, das war leichter als gedacht:

    Quellcode

    1. Dim r As Dim r As wordoptions.Range
    2. r = doc_gesamt.Range( _
    3. Start:=wordtable.Cell(kategorypos, 1).Range.Start, _
    4. End:=wordtable.Cell((kategorypos + numberMachines - 1), 1).Range.End)
    5. r.Select()
    6. word.Selection.Merge()