Calc-Tabellen kopieren und mit Daten füttern
Moderator: Moderatoren
Calc-Tabellen kopieren und mit Daten füttern
Hallo,
ohne nennenswerte Programmierkenntnisse möchte ich mich an einem (oder mehreren) Makro für Calc versuchen.
Problemstellung: Mir liegt hier eine Calc-Datei mit mehreren Arbeitsblättern vor. Das letzte Arbeitsplatt soll (mit allen Formatierungen und Formeln sowie dem Druckbereich ect.) kopiert und ans Ende gestellt werden, und zwar nicht nur einmal sonderen entsprechend der Menge von Datensätzen die in einer anderen Tabelle der Datei vorhanden sind und nach dem Ihalt der Zellen einer bestimmten Spalte in dieser Tabelle benannt werden (im konkreten Beispiel ist es die 3 Spalte der vorletzten Tabelle, dort von der C5 bis C20). Es müsste also irgendwass mit For XY 4 to 19 werden.
Später (oder meinetwegen auch vorher) sollen dann weitere Daten (Zahlen, Text und Datum) dieser Datensätze in bestimmte Zellen der neu erstellten Tabellen(-kopien) kopiert werden.
Könnt Ihr mir passende Stichworte und/oder Literturstellen benenen, die das gut erklären? Oder kann mir jemand sogar etwas Beispiel-Code schreiben?
Jedenfalls vielen dank vorab!
(wahrscheinlich komme ich erst übermorgen-früh wieder an meinen eigenen Rechner)
ohne nennenswerte Programmierkenntnisse möchte ich mich an einem (oder mehreren) Makro für Calc versuchen.
Problemstellung: Mir liegt hier eine Calc-Datei mit mehreren Arbeitsblättern vor. Das letzte Arbeitsplatt soll (mit allen Formatierungen und Formeln sowie dem Druckbereich ect.) kopiert und ans Ende gestellt werden, und zwar nicht nur einmal sonderen entsprechend der Menge von Datensätzen die in einer anderen Tabelle der Datei vorhanden sind und nach dem Ihalt der Zellen einer bestimmten Spalte in dieser Tabelle benannt werden (im konkreten Beispiel ist es die 3 Spalte der vorletzten Tabelle, dort von der C5 bis C20). Es müsste also irgendwass mit For XY 4 to 19 werden.
Später (oder meinetwegen auch vorher) sollen dann weitere Daten (Zahlen, Text und Datum) dieser Datensätze in bestimmte Zellen der neu erstellten Tabellen(-kopien) kopiert werden.
Könnt Ihr mir passende Stichworte und/oder Literturstellen benenen, die das gut erklären? Oder kann mir jemand sogar etwas Beispiel-Code schreiben?
Jedenfalls vielen dank vorab!
(wahrscheinlich komme ich erst übermorgen-früh wieder an meinen eigenen Rechner)
- komma4
- ********
- Beiträge: 5332
- Registriert: Mi, 03.05.2006 23:29
- Wohnort: Chon Buri Thailand Asia
- Kontaktdaten:
Re: Calc-Tabellen kopieren und mit Daten füttern
siehe meine Antwort hier:MB29 hat geschrieben:Könnt Ihr mir passende Stichworte und/oder Literturstellen benenen, die das gut erklären? Oder kann mir jemand sogar etwas Beispiel-Code schreiben?
viewtopic.php?f=2&t=28409
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
- komma4
- ********
- Beiträge: 5332
- Registriert: Mi, 03.05.2006 23:29
- Wohnort: Chon Buri Thailand Asia
- Kontaktdaten:
Re: Calc-Tabellen kopieren und mit Daten füttern
Code: Alles auswählen
' index spalte
idxSpalte = 2
' werte für x und y setzen!
x = 4
y = 19
' Schleife
For i = x to y
' hier die Aktionen
Next i
Code: Alles auswählen
' Aktionen
oZelle = oBlatt.getCellByPosition( 2, i )
oZelle.String = "Wert " & i +1
' oder was auch immer
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Re: Calc-Tabellen kopieren und mit Daten füttern
Nein. Es gibt eigentlich bezüglich des Codes nur:Bei Zellen wird doch auch zwischen String und Function unterschieden, oder?
Code: Alles auswählen
oZelle.String
Code: Alles auswählen
oZelle.Value
oZelle.Formula
oZelle.FormulaLocal
Gruß
Stephan
Re: Calc-Tabellen kopieren und mit Daten füttern
Zunächst vielen Dank für Deine Mühe, bzw. das konkrete Beispiel, das mich in der Tat weiter bringt als die allgemeinen Hinweisekomma4 hat geschrieben:Hilft das?
1. Verstehe ich es richtig, dass man zuerst nochkomma4 hat geschrieben:Code: Alles auswählen
' index spalte idxSpalte = 2 ' werte für x und y setzen! x = 4 y = 19 ' Schleife For i = x to y ' hier die Aktionen Next i
Code: Alles auswählen
Sub Main
Dim Dim Doc As Object
2. Versteht OO sofort, dass mit >> idxSpalte = 2 << und später >> For i = ... << der Zeilen-Index in der in meinem Fall vierten und zunächst vorletzten Tabelle ("Tab04") gemeint ist?
Leider muss ich jetzt zur Arbeit und kann mich erst heute Abend weiter damit auseinander setzen, bzw. zu Euren Beiträgen Stellung nehmen.
Zuvor noch eine Anmerkung/Erläuterung zu meinem Projekt. Das fünfte und zunächst letzte Blatt der Calc-Datei enthält eine formatierte Tabelle mit allerlei Daten und Formeln. In diese sollen Date aus der vierten und bislang vorletzten Tabelle eingefügt (und dort ggf. vorhandene Daten überschrieben) werden, und zwar zeilenweise (zeilenweise bezieht sich auf die vorletzte Tabelle, die Einfügestellen der letzten Tabelle liegen verstreut). Für jeden Datensatz/jede Zeile der vorletzten Tabelle soll nun eine Kopie der letzten Tabelle (mit eben diesen Daten der jeweiligen Zeile der vierten Tabelle) erstellt und in der Rheinfolge der Datensätze an das Ende der Calc-Datei gestellt werden.
Das Anschlussprojekt wäre dann der .pdf-Export der neuen Tabellen (möglichst als einzelne Dateien mit (bis auf die Dateiendung) demselben Namen).
Danke nochmal für Eure Hilfe!
- komma4
- ********
- Beiträge: 5332
- Registriert: Mi, 03.05.2006 23:29
- Wohnort: Chon Buri Thailand Asia
- Kontaktdaten:
Re: Calc-Tabellen kopieren und mit Daten füttern
Ja.MB29 hat geschrieben:noch weiteren einleitenden Code definieren muss? (z.Bsp. Bestimmung der Tabelle deren Spalte/n ausgelesen werden soll/en)
Eine Dimensionierung von Variablen wird nur benötigt, wenn Du deren Sichtbarkeit (=Gültigkeit, Beibehaltung des Wertes) über die SUB eines Moduls hinaus sicherstellen willst;
siehe F1 Online Hilfe, OpenOffice.org Basic, Suchen: DIM ==> Arbeiten mit Variablen
Der empfohlene Typ ist Variant - nicht Object.
Möchtest Du Codesicherheit erreichen ist der Einsatz von Option Explicit angebracht.
"Natürlich" musst Du das Tabellenblatt erst festlegen,
Code: Alles auswählen
oBlatt = ThisComponent.Sheets().getByName( "Tab04" )
Die FOR-Schleife ändert den Wert von i bei jedem Durchlauf (die korrigierte Anweisung im Folgenden)MB29 hat geschrieben:2. Versteht OO sofort, dass mit >> idxSpalte = 2 << und später >> For i = ... << der
Code: Alles auswählen
oZelle = oBlatt.getCellByPosition( idxSpalte , i )
Auch dies ist eine "Standard-Aufgabe", die hier schon mehrfach besprochen wurde (Suchfunktion: PDF und FilterName)MB29 hat geschrieben:der .pdf-Export der neuen Tabellen (möglichst als einzelne Dateien mit (bis auf die Dateiendung) demselben Namen).
Hole Dir Andrew Pitonyaks Makro Dokument da stehen, wie schon mehrfach hier im Forum gesagt, Beispiele für Standard-Programmieraufgaben drinne.
Noch eine Anmerkung (auch wenn Du das vllt. nicht hören magst - und es für einen "Programmieranfänger" und/oder Neu-Anwender Einarbeitung und damit Aufwand bedeutet):
Calc ist eine Tabellenkalkulation.
Du solltest eine Datenbank nehmen, um Datensätze (Du verwendest den Begriff selbst) zu historisieren (Stichwort: "Zeitstempel" und DB-Spalten "gültig-ab" und "gültig-bis")
Die Druckaufbereitung kann über Berichte erfolgen (ggfs. auch über Abfragen und Ergebnisausgabe nach Calc).
Viel Erfolg und weiterhin viel Spass mit OOo!
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Re: Calc-Tabellen kopieren und mit Daten füttern
Hallo,
ich bin leider doch sehr verwirrt. Bevor ich auf Eure obigen Anmerkunen eingehe stelle ich Euch hier zunächst meinen kläglich gescheiterten Versuch dar:
Zunächst scheint meine Idee mit >> Cell.Formula = "=$Tab04.$D" & I << nicht zu klappen, als Basic-Laufzeitfehler wird mir jedoch nicht schon diese sondern die vorletzte Zeile >> Sheet.copyByName("Tab05", Cell.String, Doc.Sheets.count) << ausgewiesen (Eigenschaft oder Methode nicht gefunden)
Nun zu Euren Anmerkungen:
1. komma4: Verwendung von 'Variablen, bzw. >> Variant << statt >> Object <<
An der von Dir angegebenen Hilfe-Stelle konnte ich keinen Hinweis auf diese Problematik finden (dort wird "Variant" gar nicht erwähnt). Zudem hieß es in sämtlichen Beispielen Dim Doc As Object.
2. komma4: Datenbanken/Zeitstempel
Auch hier verstehe ich nicht worauf Du hinaus willst.
a) An das Historisieren von Datensätzen (Zeitstempel) habe ich im Zusammenhang mit dieser Aufgabe gar nicht gedacht.
b) Es mag sein, dass man meine Aufgabe eleganter über Datenbank-Berichte lösen kann. Damit habe ich noch nicht gearbeitet. Aus einem ersten testweisen Versuch vor vielen Jahren (seinerzeit noch mit Access 2000) habe ich in Erinnerung, dass die seinerzeitigen Formatierungsmöglichkeiten gegenüber dem Tabellenkalkulationsprogramm eingeschränkt oder doch zumindest wesentlich aufwendiger zu realisieren waren. Und die halbwegs ansehnliche Darstellung des Ergebnisses der Berechnungen ist hier auch wichtig.
ich bin leider doch sehr verwirrt. Bevor ich auf Eure obigen Anmerkunen eingehe stelle ich Euch hier zunächst meinen kläglich gescheiterten Versuch dar:
Code: Alles auswählen
Sub Main
Dim Doc As Object
Dim Sheets As Object
Dim Sheet As Object
Dim Cell As Object
Dim I As Integer
Doc = ThisComponent
Sheet = Doc.getSheets.getByName("Tab05")
For I = 5 To 20
Cell = Sheet.getCellRangeByName("C3")
Cell.Formula = "=$Tab04.$D" & I
'In die Zelle "C3" in der "Tab05" soll die Formel/der Verweis "=$Tab04.$DI" eingetragen werden, wobei I der benanntenen Zeile entsprechen soll (also Index + 1)
'später sollen noch weitere Formeln, bzw. Verweise auf die Tab04 eingefügt werden
Sheet.copyByName("Tab05", Cell.String, Doc.Sheets.count)
'Die fünfte und zunächst letzte Tabelle mit dem Namen "Tab05" soll kopiert, mit dem neuen Inhalt der Zelle C3 benannt und ans Ende der Calc-Datei gestellt werden, was leider nicht klappt
Next I
End Sub
Nun zu Euren Anmerkungen:
1. komma4: Verwendung von 'Variablen, bzw. >> Variant << statt >> Object <<
An der von Dir angegebenen Hilfe-Stelle konnte ich keinen Hinweis auf diese Problematik finden (dort wird "Variant" gar nicht erwähnt). Zudem hieß es in sämtlichen Beispielen Dim Doc As Object.
2. komma4: Datenbanken/Zeitstempel
Auch hier verstehe ich nicht worauf Du hinaus willst.
a) An das Historisieren von Datensätzen (Zeitstempel) habe ich im Zusammenhang mit dieser Aufgabe gar nicht gedacht.
b) Es mag sein, dass man meine Aufgabe eleganter über Datenbank-Berichte lösen kann. Damit habe ich noch nicht gearbeitet. Aus einem ersten testweisen Versuch vor vielen Jahren (seinerzeit noch mit Access 2000) habe ich in Erinnerung, dass die seinerzeitigen Formatierungsmöglichkeiten gegenüber dem Tabellenkalkulationsprogramm eingeschränkt oder doch zumindest wesentlich aufwendiger zu realisieren waren. Und die halbwegs ansehnliche Darstellung des Ergebnisses der Berechnungen ist hier auch wichtig.
Re: Calc-Tabellen kopieren und mit Daten füttern
Yipieh!!!
Leicht verändert funktioniert mein obiges Codebeispiel:
Leicht verändert funktioniert mein obiges Codebeispiel:
Code: Alles auswählen
Sub Main
Dim Doc As Object
Dim Sheets As Object
Dim Sheet As Object
Dim Cell As Object
Dim NeuerName As String
Dim I As Integer
Doc = ThisComponent
Sheet = Doc.getSheets.getByName("Tab05")
Sheets = Doc.Sheets
For I = 5 To 20
Cell = Sheet.getCellRangeByName("C3")
Cell.Formula = "=$Tab04.$D" & I
'Nun müssen noch weitere Formeln, bzw. Verweise auf die Tab04 eingefügt werden
TabName = LTRIM(Cell.String)
Doc.Sheets.CopyByName("Tab05", TabName, Sheets.Count)
Next I
End Sub