Seite 1 von 1
Makro: Zellen aus einem Blatt kopieren und ans Ende eines anderen Blatt einfügen
Verfasst: Mo 26. Feb 2024, 18:02
von Joachim Peter Uwe
Hallo zusammen!
Sitze gerade an einer alten MS Office 2006 Datei, die ich 2006 erstellt habe und auch einige Jahre nutze.
Über die Jahre bin ich jedoch auf Linux umgestiegen (Dualboot).
Nun brauche ich diese Datei wieder, und nun tauchen auch diverse Probleme auf.
Die damals in der Datei verwendeten Makros funktionieren nicht mehr mit den aktuellen MS-Office Versionen.
Da ich seit Jahren überwiegend mit Libreoffice arbeite, wollte ich die Datei als Libreoffice Datei umarbeiten
und benötige ein wenig Hilfe.
Ich möchte per Makro einen Bereich des Tblattes 3, A27-Q27 kopieren.
Dieser solle dann in das Tblatt 4 ans Ende eines Datensatzes eingefügt werden.
Wie setze ich dieses am besten einmal um?
Re: Makro: Zellen aus einem Blatt kopieren und ans Ende eines anderen Blatt einfügen
Verfasst: Mo 26. Feb 2024, 18:38
von mikele
Hallo,
ich vermute mal, dass es reichen würde die Inhalte der Zellen A27:Q27 zu kopieren.
Dieser solle dann in das Tblatt 4 ans Ende eines Datensatzes eingefügt werden.
Was ist das "Ende eines Datensatzes"?
Nächste Vermutung wäre, dass fortlaufend Daten von Tabelle3 nach Tabelle4 kopiert werden sollen und dann immer in die nächste freie Zeile der Tabelle4?
Re: Makro: Zellen aus einem Blatt kopieren und ans Ende eines anderen Blatt einfügen
Verfasst: Mo 26. Feb 2024, 20:12
von Joachim Peter Uwe
Vielen Dank für Eure Hilfe!
Die Daten kopiere ich über die Zwischenablage in das TBlatt 3.
Diese Daten befinden sich dann in den Zellen A27:Q27.
Diese sollen nun per Schaltfläche in das TBlatt 4 kopiert werden.
Und man gibt ein Datensatz nach dem anderen per Schaltfläche ein.
Diese sollen immer zum Schluss des TBlatt 4 eingefügt werden.
Beispiel:
TBlatt 3
Name Straße Ort Datum usw.
TBlatt 4
Meier Musterstr.4 1100 Musterhausen 01.01.1980 usw.
Müller Musterstr.4 1100 Musterhausen 01.01.1980 usw.
Schmidt Musterstr.4 1100 Musterhausen 01.01.1980 usw.
Neuer Datensatz hier einfügen ...
Ich habe auch eine Beispiel Datei gefunden jedoch scheitere ich aufgrund Hintergrundwissen ...
Code: Alles auswählen
REM ***** BASIC *****
Sub Main
odoc=thiscomponent
quelle=odoc.sheets(0)
ziel=odoc.sheets(1)
daten()=quelle.getcellrangebyname("C9:O9").getdataarray()
i=8
do while ziel.getcellbyposition(2,i).type>0
i=i+1
loop
ziel.getcellrangebyposition(2,i,14,i).setdataarray(daten())
End Sub
Damit wird der Bereich C9 - O9 in ein neues TBlatt kopiert, und nacheinander abgelegt.
Jedoch konnte ich nicht erkennen wie ich das an meinen Bedürfnissen anpassen kann.
Danke
Re: Makro: Zellen aus einem Blatt kopieren und ans Ende eines anderen Blatt einfügen
Verfasst: Mo 26. Feb 2024, 20:16
von Joachim Peter Uwe
Ich habe diese Datei damals für meine Bewerbungen erstellt. In der Ursprünglichen Datei konnte ich sogar e.Mails verschicken. Und Datensätze aus einer bestimmten HTML herauskopieren. Deshalb die Schaltflächen.
Re: Makro: Zellen aus einem Blatt kopieren und ans Ende eines anderen Blatt einfügen
Verfasst: Di 27. Feb 2024, 18:38
von mikele
Hallo,
hier mal eine Variante in Basic:
Code: Alles auswählen
Sub Main
'Zugriff auf dieses Dokument
oDoc=ThisComponent
'Zugriff auf Tabelle1
oTab=oDoc.Sheets.getByName("Tabelle1")
'Zugriff auf Zellebereich
oBereich=oTab.getCellRangeByName("A27:Q27")
'Auslesen der Inhalten in Array
aDaten=oBereich.getDataArray
'Zugriff auf Tabelle2
oZiel=oDoc.Sheets.getByName("Tabelle2")
'Bestimmung der nächste freien Zeile
'dazu suche ich die leeren Zellen der Spalte A
aLeer=oZiel.Columns(0).queryEmptyCells.RangeAddresses
n=aLeer(uBound(aLeer)).StartRow
'Zielbereich mit Daten füllen
oZiel.getCellRangeByPosition(0,n,uBound(aDaten(0)),n).SetDataArray(aDaten)
'eventuell löschen des ursprünglichen Bereiches
oBereich.ClearContents(1+2+4)
End Sub
und das Gleiche in Python (da habe ich wieder was gelernt):
Code: Alles auswählen
def bereich_kopieren():
oDoc = XSCRIPTCONTEXT.getDocument()
oTab1 = oDoc.Sheets.getByName("Tabelle3")
oBereich = oTab1.getCellRangeByName('A27:Q27')
aDaten=oBereich.getDataArray()
oTab2 = oDoc.Sheets.getByName("Tabelle4")
oLeer=oTab2.Columns[0].queryEmptyCells()
n=oLeer.RangeAddresses[-1].StartRow
m=len(aDaten[0])-1
oTab2.getCellRangeByPosition(0,n,m,n).setDataArray(aDaten)
oBereich.clearContents(1+2+4)
Re: Makro: Zellen aus einem Blatt kopieren und ans Ende eines anderen Blatt einfügen
Verfasst: Di 27. Feb 2024, 21:23
von Joachim Peter Uwe
Mikele Du bist der Beste!!!
Vielen dank, eine wirklich großartige Arbeit.
Und die ganzen Kommentare helfen beim lernen!
Nochmals vielen vielen dank !!!
Re: Makro: Zellen aus einem Blatt kopieren und ans Ende eines anderen Blatt einfügen
Verfasst: Mi 28. Feb 2024, 11:40
von karolus
Hallo
@Mikele: Dein Pythoncode wird schon
anderenorts zitiert

Das ist super!
Dein Code ist nahezu eine 1:1 Übersetzung aus Basic mit »vollständigen« Api-methoden und damit auch rückwärtskompatibel mit AOO
Mit LO 5.1 wurden ein paar Änderungen eingepflegt, die »pythonischeren« Code-Stil ermöglichen, hier ein paar Varianten davon (mit reichlich Kommentaren):
Code: Alles auswählen
doc = XSCRIPTCONTEXT.getDocument()
sheets = doc.Sheets
# ↓↓ Object-zugriff auf Tabelle
# ↓ !Vorsicht Syntax-Falle bei Tabellennamen mit Leerzeichen etcpp.
quelle = sheets.Tabelle1
# besser Dictionary-zugriff, siehe unten:
bereich = quelle['A8:I8']
data = bereich.DataArray
ziel = sheets["Tabelle2"] # ↑↑↑ vergleiche oben!
# ↓ Object-zugriff per Spalten_bezeichnung !
leer= ziel.Columns.A.queryEmptyCells()
row = leer[-1].RangeAddress.StartRow
# ↓ slice-syntax hier im speziellen 2-D [zeilen , spalten], möglich seit LO 5.1
ziel[ row, :len(data[0]) ].DataArray = data
# ↓ alternativ per Name-Access und f-String ! Achtung row+1
# ziel[f"A{ row+1 }:I{ row+1 }"].DataArray = data
bereich.clearContents(1+2+4)
und daraus eine Funktion ohne Kommentare:
Code: Alles auswählen
def copy_row(*_):
doc = XSCRIPTCONTEXT.getDocument()
sheets = doc.Sheets
quelle = sheets.Tabelle1
bereich = quelle['A8:I8']
data = bereich.DataArray
ziel = sheets["Tabelle2"]
leer= ziel.Columns.A.queryEmptyCells()
row = leer[-1].RangeAddress.StartRow
ziel[ row, :len(data[0]) ].DataArray = data
bereich.clearContents(1+2+4)
Ist halt blöd das der Code hier nicht mit vernünftigen Syntax-highlighting angezeigt wird!
Re: Makro: Zellen aus einem Blatt kopieren und ans Ende eines anderen Blatt einfügen
Verfasst: Mi 28. Feb 2024, 14:02
von mikele
Hallo karolus,
cool und danke - ich hatte die stille Hoffnung, dass du/jemand der mit Python vertrauter ist, meine laienhaften Anfänge ausbaut und verbessert.