🙏 Helfen Sie mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Makro: Zellen aus einem Blatt kopieren und ans Ende eines anderen Blatt einfügen

Alles zur Programmierung im LibreOffice.
Antworten
Joachim Peter Uwe
Beiträge: 5
Registriert: Fr 13. Mär 2015, 19:26

Makro: Zellen aus einem Blatt kopieren und ans Ende eines anderen Blatt einfügen

Beitrag von Joachim Peter Uwe » Mo 26. Feb 2024, 18:02

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?

mikele
* LO-Experte *
Beiträge: 1929
Registriert: Mo 1. Aug 2011, 20:51

Re: Makro: Zellen aus einem Blatt kopieren und ans Ende eines anderen Blatt einfügen

Beitrag von mikele » Mo 26. Feb 2024, 18:38

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?
Gruß,
mikele

Joachim Peter Uwe
Beiträge: 5
Registriert: Fr 13. Mär 2015, 19:26

Re: Makro: Zellen aus einem Blatt kopieren und ans Ende eines anderen Blatt einfügen

Beitrag von Joachim Peter Uwe » Mo 26. Feb 2024, 20:12

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
Dateianhänge
daten kopieren.ods
(17.73 KiB) 89-mal heruntergeladen

Joachim Peter Uwe
Beiträge: 5
Registriert: Fr 13. Mär 2015, 19:26

Re: Makro: Zellen aus einem Blatt kopieren und ans Ende eines anderen Blatt einfügen

Beitrag von Joachim Peter Uwe » Mo 26. Feb 2024, 20:16

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.

mikele
* LO-Experte *
Beiträge: 1929
Registriert: Mo 1. Aug 2011, 20:51

Re: Makro: Zellen aus einem Blatt kopieren und ans Ende eines anderen Blatt einfügen

Beitrag von mikele » Di 27. Feb 2024, 18:38

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)
Gruß,
mikele

Joachim Peter Uwe
Beiträge: 5
Registriert: Fr 13. Mär 2015, 19:26

Re: Makro: Zellen aus einem Blatt kopieren und ans Ende eines anderen Blatt einfügen

Beitrag von Joachim Peter Uwe » Di 27. Feb 2024, 21:23

Mikele Du bist der Beste!!!

Vielen dank, eine wirklich großartige Arbeit.
Und die ganzen Kommentare helfen beim lernen!

Nochmals vielen vielen dank !!!

Benutzeravatar
karolus
* LO-Experte *
Beiträge: 2533
Registriert: Fr 10. Dez 2010, 10:01

Re: Makro: Zellen aus einem Blatt kopieren und ans Ende eines anderen Blatt einfügen

Beitrag von karolus » Mi 28. Feb 2024, 11:40

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!
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

mikele
* LO-Experte *
Beiträge: 1929
Registriert: Mo 1. Aug 2011, 20:51

Re: Makro: Zellen aus einem Blatt kopieren und ans Ende eines anderen Blatt einfügen

Beitrag von mikele » Mi 28. Feb 2024, 14:02

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.
Gruß,
mikele


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten