Discussion:
Hinzufügen von Zeilen zu einer Tabelle
(zu alt für eine Antwort)
Richard Ohl
2012-01-04 17:23:58 UTC
Permalink
Hallo,
ich habe eine Prozedur in Excel, die in Word Tabellen erstellt.
Mein Layout sieht so aus, dass ich grundsätzliche eine Zeile mit 3 Spalten
habe. In einigen Ausnahmen sind jedoch Spalten 2-3 oder gar alle 1-3
zusammengefasst.

Wenn ich nun oTable.Rows.Add benutze, wird immer die letzte Zeile kopiert,
ich muss nun abhängig von cells.count einen split oder merge benutzen und
die spaltenbreite erneut anpassen.

Geht das irgendwie eleganter? Habe schon überlegt, ob man nicht einfach die
erste Zeile (die immer leer ist) kopieren und einfügen soll oder sowas...
Dann hätte ich zumindest immer die 3 Spalten, und könnte nach Bedarf mergen.

Wäre über einen Tipp sehr dankbar.

Vielen Dank
Richard

P.S. So wird die Tabelle bei mir erstellt, das Dokument ist an der Stelle
grundsätzlich leer:

Set oTable = oDocument.Tables.Add(Range:=oDocument.Range(Start:=0,
End:=0), NumRows:=1, NumColumns:=3,
DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:=wdAutoFitFixed)
With oTable
.Rows.Alignment = wdAlignRowCenter
.PreferredWidthType = wdPreferredWidthPercent
.PreferredWidth = 100
.Style = "ISAFOSR"
.ApplyStyleHeadingRows = False
.ApplyStyleLastRow = False
.ApplyStyleFirstColumn = False
.ApplyStyleLastColumn = False
' resize columns
.Columns(1).PreferredWidthType = wdPreferredWidthPercent
.Columns(1).PreferredWidth = iCol1
.Columns(2).PreferredWidthType = wdPreferredWidthPercent
.Columns(2).PreferredWidth = iCol2
.Columns(3).PreferredWidthType = wdPreferredWidthPercent
.Columns(3).PreferredWidth = iCol3
.AutoFormat
End With
--
Always carry a flagon of whiskey in case of snakebite and furthermore always
carry a small snake. -- W. C. Fields
Wolfram Jahn
2012-01-04 23:35:12 UTC
Permalink
Post by Richard Ohl
Geht das irgendwie eleganter?
Kopiere die komplette Zeile vorher, stelle erst danach die nun vorletzte
so ein wie du sie brauchst und fülle sie.

Am Ende hast Du eine letzte Zeile zu viel, die kannst Du dann einfach
löschen.

Wolfram
Richard Ohl
2012-01-05 10:28:01 UTC
Permalink
Post by Wolfram Jahn
Post by Richard Ohl
Geht das irgendwie eleganter?
Kopiere die komplette Zeile vorher, stelle erst danach die nun vorletzte
so ein wie du sie brauchst und fülle sie.
Am Ende hast Du eine letzte Zeile zu viel, die kannst Du dann einfach
löschen.
Hallo Wolfram,
ich bin nicht ganz sicher, wie du das meinst. Könntest du das ein ganz klein
wenig ausführen? Ich komme zwar mit Excel ganz gut klar, aber das Word-Vba
habe ich nicht nicht 100% geblickt...

Vielen Dank!
Richard
--
To be stupid, selfish, and have good health are three requirements for
happiness, though if stupidity is lacking, all is lost. -- Gustave Flaubert
Richard Ohl
2012-01-06 10:16:04 UTC
Permalink
Post by Wolfram Jahn
Post by Richard Ohl
Geht das irgendwie eleganter?
Kopiere die komplette Zeile vorher, stelle erst danach die nun vorletzte
so ein wie du sie brauchst und fülle sie.
Am Ende hast Du eine letzte Zeile zu viel, die kannst Du dann einfach
löschen.
Hallo Wolfram,
ein paste der row range in der letzten Zeile schien zuerst das gewünschte
Ergebnis zu bringen:

Dim oTemplateRow As Word.Row
Set oTemplateRow = oTable.Rows(1)
oTemplateRow.Range.Copy
' Fügt eine Zeile nach dem Vorbild der ersten Zeile an
oTable.Rows.Last.Range.Paste

Ich habe dann ein merge in nur eine Spalte mit der Zeile gemacht:
oTable.Rows.Last.Cells.Merge

Wenn ich nun ein erneutes Paste mache, scheint die Zeile _vor_ der nunmehr
letzen Zeile gemacht zu werden, das verwirrt mich. Ich habe auch ein
collapse des Ranges vorher versucht, aber ohne Erfolg. Hier mal der gesamte
Code ab dem Kopieren der Template-Zeile:

oTable.Rows.Last.Range.Paste
oTable.Rows.Last.Cells.Merge
oTable.Rows.Last.Range.Collapse Direction:=wdCollapseEnd
oTable.Rows.Last.Range.Paste
oTable.Rows.Last.Range.Collapse Direction:=wdCollapseEnd

Ich hätte jetzt erwartet, meine Template-Zeile 1 mit 3 Spalten zu haben, die
zuerst eingefügte Zeile, die in eine einzige Spalte gemergt wurde, und eine
dritte Zeile wieder mit drei Spalten. Leider ist nun die 2. Zeile die mit
den drei Spalten, und die letze diejenige mit nur einer.

Wärst du oder jemand anders in der Lage, mir meinen Denkfehler aufzuzeigen?
Herzlichen Dank,
Richard
--
Ich war mal in eine hübsche Blondine verliebt. Sie hat mich in den Suff
getrieben. Das ist das Einzige, wofür ich ihr dankbar bin. -- W. C. Fields
Wolfram Jahn
2012-01-07 00:00:52 UTC
Permalink
Hallo Richard,

ich habe mich vermutlich zu knapp ausgedrückt.

0. - Ich meinte, dass Du mit einer Tabelle anfängst, die eine Zeile mit
drei Spalten hat.

1. - Dann fügst Du eine zweite Zeile an (.rows.add), die sollte dann ja
auch drei Spalten haben.

2. - Dann fügst Du genauso wieder eine weitere Zeile an, die hat dann
auch drei Spalten.

3. - Jetzt bearbeitest Du die vorletzte Zeile (mergen, füllen, was auch
immer). (Beim ersten Mal ist das die Zeile 2.)

4. - Solange noch Zeilen einzufügen sind, machst Du mit 2. weiter.

5. - jetzt löschst Du die letzte Zeile und bist fertig.


(Die Schritte 0. und 1. lassen sich natürlich auch zusammenfassen, wenn
Du die Tabelle gleich mit 2 Zeilen und drei Spalten erzeugst. Den
Schritt 2. brauchst Du hingegen bei der Wiederholung.)


Wolfram
Richard Ohl
2012-01-09 09:56:57 UTC
Permalink
Wolfram Jahn tastaturte dies:

Hallo Wolfram!
Post by Wolfram Jahn
ich habe mich vermutlich zu knapp ausgedrückt.
Vielen Dank für die neuen Ausführungen, ich habe es jetzt verstanden und es
funktioniert.

Ich mache direkt nach der Erstellung der Tabelle ein rows.add, und füge
weitere Zeilen dann so ein:

' although table has 4 columns col 1 is reserved. use 1-3 for iNumberColumns
Private Function addRow(ByRef oRow As Word.Row, Optional iNumberColumns As
Integer = 3)
' add a row to the end, then work on the one before that
oTable.Rows.Add
Set oRow = oTable.Rows(oTable.Rows.Count - 1)
' if number of columns is 1 merge 2 to 4, if 2, 3 to 4
Select Case iNumberColumns
Case 1
oRow.Cells(2).Merge MergeTo:=oRow.Cells(4)
Case 2
oRow.Cells(3).Merge MergeTo:=oRow.Cells(4)
End Select
End Function

Vielen Dank nochmals!
Richard
--
Chaotic action is preferable to orderly inaction. -- Will Rogers
Lesen Sie weiter auf narkive:
Loading...