Calc: Neue Zeile direkt unter Spaltenüberschrift-Zeile einfuegen

Hallo Andreas & Wolfgang,

jetzt aber:

   Sub InsertRow

' A c h t u n g
' iColMax muss an die Anzahl Spalten der aktuellen Tabelle angepasst werden:
' iColMax = 'Anzahl Spalten' - 1
' Der Spalten-Index beginnt bei 0, weswegen man von der 'Anzahl Spalten' 1
' abziehen muss.

      Dim oDoc as Object ' object Document
      Dim oSheet as Object ' object Sheet
      Dim oRow as Object ' object Row
      Dim iCol as Long ' index Column (i=0 => 1st Column)
      Dim iColMax as Long ' index Column Maximum
      Dim iRowIns as Long ' index Row Insert (i=0 => 1st Row )

      oDoc = ThisComponent
      oSheet = oDoc.Sheets(0)
      oRow = oSheet.getRows

      iRowIns = 1
      iColMax = 4

' Zeile einfügen:
      oRow.insertByIndex(iRowIns,1)

      For iCol=0 To iColMax Step 1

' [0] Zell-Typ übernehmen:
         oSheet.getCellByPosition(iCol,iRowIns).NumberFormat = oSheet.getCellByPosition(iCol,iRowIns+1).NumberFormat
' [1] Zell-Inhalt Schriftattribut "Name" übernehmen:
         oSheet.getCellByPosition(iCol,iRowIns).CharFontName = oSheet.getCellByPosition(iCol,iRowIns+1).CharFontName
' [2] Zell-Inhalt Schriftattribut "Größe" übernehmen:
         oSheet.getCellByPosition(iCol,iRowIns).CharHeight = oSheet.getCellByPosition(iCol,iRowIns+1).CharHeight
' [3] Zell-Inhalt Schriftattribut "Farbe" übernehmen:
         oSheet.getCellByPosition(iCol,iRowIns).CharColor = oSheet.getCellByPosition(iCol,iRowIns+1).CharColor
' [4] Zell-Inhalt Schriftattribut "fett" übernehmen:
         oSheet.getCellByPosition(iCol,iRowIns).CharWeight = oSheet.getCellByPosition(iCol,iRowIns+1).CharWeight
' [5] Zell-Inhalt Schriftattribut "kursiv" übernehmen:
         oSheet.getCellByPosition(iCol,iRowIns).CharPosture = oSheet.getCellByPosition(iCol,iRowIns+1).CharPosture
' [6] Zell-Hintergrund "Farbe" übernehmen:
         oSheet.getCellByPosition(iCol,iRowIns).CellBackColor = oSheet.getCellByPosition(iCol,iRowIns+1).CellBackColor
' [7] Zell-Inhalt "vertikale Ausrichtung" übernehmen:
         oSheet.getCellByPosition(iCol,iRowIns).VertJustify = oSheet.getCellByPosition(iCol,iRowIns+1).VertJustify
' [8] Zell-Inhalt "horizontale Ausrichtung" übernehmen:
         oSheet.getCellByPosition(iCol,iRowIns).HoriJustify = oSheet.getCellByPosition(iCol,iRowIns+1).HoriJustify

      Next iCol

   End Sub

[1] Ergänzt um Formatierungsangaben [1]-[8].
[2] Falls Du zu Deiner Tabelle noch weitere Spalten hinzufügst, unbedingt "iColMax" anpassen !!!

Gruß
Hans-Werner :-))

OoOHWHOoO schrieb:

jetzt aber:

Sub InsertRow
[...]

Nochmal vielen Dank, dass Du mir helfen möchtest Hans-Werner :slight_smile:

Ich habe Dein Makro in meine Testdatei eingefügt.

https://www.dropbox.com/s/4n7ccqwj141h81g/test-zeile-einfuegen.ods

Aber leider wirkt es nicht.
Es passiert nix.

Hast Du eine Möglichkeit, Dateien in einen Clouddienst hochzuladen.
Dann ist es einfacher zu testen.

Wenn man Makrocode aus der Mailingliste kopiert müssen diverse
Zeilenumbrüche manuell entfernt werden.

Zum Code:

Gibt es denn wirklich keine einfachere Möglichkeit?

"Gehe zum Anfang der Tabelle"
"Gehe eine Zeile nach unten"
"Füge eine Zeile oberhalb ein"

Gruß, Andreas

Andreas Borutta schrieb:

Gibt es denn wirklich keine einfachere Möglichkeit?

"Gehe zum Anfang der Tabelle"
"Gehe eine Zeile nach unten"
"Füge eine Zeile oberhalb ein"

Ich habe in den Einstellungen jetzt die Makroaufzeichnung aktiviert
und die genannten Schritte aufgezeichnet.

Der Code lautet:

Sub Test

End Sub

Es wird also nichts aufgezeichnet.

Eventuell geht das mit der Version für MacOS gar nicht?

Gruß, Andreas

Jetzt muss ich mir diene Code doch mal etwas anschauen. :slight_smile:

      For iCol=0 To iColMax Step 1

' [0] Zell-Typ übernehmen:
         oSheet.getCellByPosition(iCol,iRowIns).NumberFormat =
oSheet.getCellByPosition(iCol,iRowIns+1).NumberFormat

"getCellRangeByPosition"? Oder noch einfacher "getCellRangeByName, da
kann man als Parameter direkt z. B. "A1:Z1" o. ä. angeben? Würde
zumindest die Schleife eliminieren.

Und könnte man nicht mit oSheet.CopyRange was machen? Müsste man halt
irgendwie aufs Format begrenzen können (ich gehe davon aus, dass
CopyRange Format /und/ Inhalt kopiert). Aber da bist du wohl mehr
Fachman als ich (ehrlich gesagt ist /mein/ 'Spezialgebiet' eigentlich
die Zellenformeln; Makros mach ich nur, wenns gar nicht anders geht).

[2] Falls Du zu Deiner Tabelle noch weitere Spalten hinzufügst,
unbedingt "iColMax" anpassen !!!

Oder gleich von vorn herein groß genug ansetzen (werden halt leere
Zellen kopiert).

Wolfgang

Hallo Wolfgang,

[1] Mit "getCellRangeByPosition" funktioniert es nicht. Offensichtlich kann man einem CellRange nicht alle Werte eines zweiten CellRange 1:1 zuweisen, sondern eben nur einem CellRange einen einzelnen Wert. Meine ich mal ...

[2] Ich arbeite nur mit Indizes und nicht mit Adressen. Ist insbesondere bei Iterationen schön einfach. Und da ich keine UNO-Kommandos nutze, ist es auch nicht notwendig.

[3] oSheet.CopyRange zerschießt Zell-Verweise, wenn ich Dich mal zitieren darf: "[...] Vorsicht; wenn in der 2. Zeile Verweise auf andere Zeilen (z.b. auf die ursprüngliche Zeile 3, jetzt Zeile 4; passiert so aber auch mit jeder beliebigen andern Zeile) stehen sollten, fällst du damit auf die Schnauze. Denn du kopierst den jetzigen Link von z. B. 2 auf 4 nach 3, von wo aus er natürlich ebenfalls 1 Zeile weiter als ursprünglich gedacht (d. h. also nach 5 statt 4) verweist, usw. [...]

[4] Diese kleine Schleife ist sicherlich kein Problem und man hat eine nachvollziehbare 1:1-Zuweisung.

[5] Am Anfang meiner Makro-Programmierung hatte ich auch nur mit UNO-Kommandos gearbeitet. Aber spätestens, wenn man z.B. Tabellen "invisible" bearbeiten will ( https://www.mail-archive.com/users@de.libreoffice.org/msg19072.html ), läuft man gegen die Wand. So habe ich die UNO-Kommandos aufgegeben und mir die Basic-Makro-Programmierung ohne UNO-Kommandos angeeignet, zumal man dazu eine Menge Informationen im WEB findet.

[6] Vielleicht gibt es für das Problem "Neue Zeile direkt unter Spaltenüberschrift-Zeile einfügen" auch noch elegantere Lösungen, mir ist eben diese eingefallen, zumal ich auch kein Makro-Spezialist mit langjähriger Erfahrung bin.

Gruß
Hans-Werner

------ Originalnachricht ------