Hallo Ich Bins,
teste mal meinen Code zunächst nur in meiner Beispieldatei.
Deine zuletzt hochgeladene Datei enthält VBA-Rückstände und ggf. einige andere
Konvertierungsfehler. Als ich ein Makro-Modul einfügen wollte stürzte LibO ab.
Ich habe deshalb das Tabellenblatt in eine neue saubere Calc-Datei kopiert und hier das Makro angelegt.
Dadurch sind fast alle Zell- und Seitenvorlagen verloren gegangen.
Mit Konvertierungsfehler meine ich z.B. die Spalte D. Sie ist laut Basic-Code nicht ausgeblendet,
sondern nur auf einer sehr geringe Spaltenbreite gesetzt (11/1000=0,011cm).
Spalte I hingegen enthält die Eigenschaft "IST AUSGEBLENDET".
Ob dies bei den Zeilen auch vorkommt habe ich nicht geprüft.
Was passiert im Code:
Das aktuelle Dokument wird referenziert.
Das Tabellenblatt mit dem
Index 0 wurde als Quelle festgelegt.
D.h. die Spaltenbreite, die Zeilenhöhe und die Eigenschaft ob die Spalte, bzw. die Zeile ausgeblendet wurde,
wird aus diesem Tabellenblatt in zwei Array‘s eingelesen.
mCol(n,n) steht für die Spalteneigenschaften. Durchnummeriert von 0 bis 15, wobei das Array zweidimensional ist.
mRow(n,n) steht für die Zeileneigenschaften. Durchnummeriert von 0 bis 223, wobei das Array zweidimensional ist.
Beispiel:
mCol(0,0) entspricht der Spalte A und enthält den Wert der Breite (z.B. 4000)
mCol(0,1) entspricht der Spalte A und enthält den Wert True ODER False
Die Eigenschaft dazu lautet „IsVisible“
IsVisible=True → Spalte ist sichtbar
IsVisible=False → Spalte ist ausgeblendet
Dann Zähler +
1
mCol(
1,0) entspricht der Spalte B und enthält den Wert der Breite (z.B. 1400)
mCol(
1,1) entspricht der Spalte B und enthält den Wert True ODER False
usw.
Gleiches gilt für die Zeilen:
mRowl(0,0) entspricht der Zeile 1 und enthält den Wert der Höhe (z.B. 150)
mRow(0,1) entspricht der Zeile 1 und enthält den Wert True ODER False
Die Eigenschaft dazu lautet „IsVisible“
IsVisible=True → Spalte ist sichtbar
IsVisible=False → Spalte ist ausgeblendet
Dann Zähler +
1
mRowl(
1,0) entspricht der Zeile 2 und enthält den Wert der Höhe (z.B. 250)
mRow(
1,1) entspricht der Zeile 2 und enthält den Wert True ODER False
usw.
Danach folgt eine Schleife über alle Tabellenblätter.
Da Tabellenblatt-Index 0 = die Quelle der Daten ist, beginnt der Zähler in meiner Beispieldatei bei 1.
Die Anzahl der zu bearbeitenden Blätter kann im oberen Codeteil mittels der Variablen „nSheet=n“ festgelegt werden.
Ich habe kurz nach dem Start des Makros eine Messagebox eingebaut, diese gibt den internen Index des
jeweiligen Tabellenblattes und den dazugehörenden Namen aus.
Warum?
Wegen der Konvertierung aus einer Excel-Datei in eine Calc-Datei ist die interne Reihenfolge (Index <-->Name)
nicht immer korrekt. Ich will damit sagen „Tabelle2“ muss nicht unbedingt Index 1 (Zählung beginnt bei 0!) sein.
Wenn Du von den Indizes unabhängig arbeiten möchtest, bleibt aus meiner Sicht nur ein etwas unschöner
Umweg über ein eindimensionales Array, dem im Code alle relevanten Tabellenblatt-Namen übergeben werden.
z.B. so:
Code: Alles auswählen
Dim mTab(0 to 3) as String `0-3 = vier Felder = vier Tabellenblätter
mTab()=Array("Tabelle1","Tabelle2","Tabelle3","Tabelle4",)
Danach Codezeilen 69-72 anpassen:
' Tabellenzähler
For z = lBound(mTab()) to uBound(mTab()) ' <-- Untergrenze bis Obergrenze des Array‘s
' Objekt-Referenz auf nächstes Tabellenblatt legen
oSheetNext=oDoc.getSheets.getbyName(mTab(z))
Nachdem nun alle Eigenschaften in die Array‘s geschrieben wurden, werden diese auf die einzelnen Tabellenblätter angewendet. D.h. die Array-Daten werden ausgelesen und den Spalten und Zeilen per Schleife zugewiesen.
Am Ende erfolgt für das jeweilige Blatt die Seitenformatierung. Siehe hierzu den Codeabschnitt ab Zeile 88
Code: Alles auswählen
REM ----------------------------------------------------------------------------------------------
REM Seite formatieren
' ermitteln des Namens der aktuellen Seitenvorlage
s = oDoc.CurrentController.getActiveSheet().PageStyle
Um Dich ein wenig mehr in die Programmierung einzuarbeiten schau Dir auch mal diesen Hinweis an:
Codeinspection: MRI und XRAY
Am Anfang sind die Tools eine wenig konfus, ich möchte sie aber keinerfalls mehr missen.