Ausschneiden einer Zeile und Einfügen auf 2. Tabellenblatt

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

OttoR
Beiträge: 5
Registriert: Mo, 14.03.2022 12:08

Ausschneiden einer Zeile und Einfügen auf 2. Tabellenblatt

Beitrag von OttoR »

Moderatorenhinweis: Verschoben in den Bereich Makros!

Hallo,

ich bin ziemlich neu in Open Office und habe folgendes Problem:

Ich habe eine Calc-Liste mit Bestellungen, wo ich in der Spalte G mit Ja/Nein eintrage, ob die Bestellung erledigt ist. Wenn ja, dann sollen die Zeilen mit ja in ein 2. Tabellenblatt übertragen und aus dem 1. Tabellenblatt gelöscht werden. Geht das mit einem Makro?

Wie kann ich das machen? Könntet Ihr mir da bitte weiterhelfen?

Vielen Dank im voraus.

MlG
Otto

PS: eine Beispiel Datei habe ich angehängt.
Dateianhänge
bestellungen.ods
(12.68 KiB) 116-mal heruntergeladen
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Ausschneiden einer Zeile und Einfügen auf 2. Tabellenblatt

Beitrag von Toxitom »

Hey Otto,

ja, mit Makro geht das allemale;))

Wie viel Ahnung hast Du von Makros bereits? Und... bitte schildere zeimlich genau, wie das Verfahren aussehen soll... also z.B. manuelles Starten eines Makros über einen Button oder einen Menüeintrag und übertragen aller bestehende "ja" Zeilen, automatisches Übertragen sobald "ja" eingetragen wird .... was soll auf dem 2. Tabellenblatt passieren... alle untereinander? ...

Möglicherweise lassen sich hier auch andere Lösungen finden.

Viele Grüße
Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
OttoR
Beiträge: 5
Registriert: Mo, 14.03.2022 12:08

Re: Ausschneiden einer Zeile und Einfügen auf 2. Tabellenblatt

Beitrag von OttoR »

Hallo,
erstmal sorry für das späte Antworten....

Bzgl. Wissen über Makros: ein wenig, aber mehr als Aufzeichnen ist nicht wirklich drinnen. Zum Vorgehen:

In der Liste werden die Daten eingetragen und in der Spalte G dieser Liste wird ja oder nein eingetragen, ob die Bestellung erledigt ist oder nicht. Super wäre jetzt ein Button, der dann alle Zeilen, wo in der Spalte G ein ja steht, auf ein 2. Tabellenblatt verschiebt, also aus dem ersten Tabellenblatt löscht und die gelöschten Zeilen dann auch weglöscht. Es sollten im ersten Tabellenblatt nur mehr die Zeilen stehen, wo in der Spalte G ein nein steht.

Am zweiten Tabellenblatt sollen die eingefügten Zeilen einfach eingefügt werden. Den Button für das Ordnen nach dem Datum auf dem 2. Tabellenblatt habe ich schon mittels Makroaufzeichnung erstellt.

Vielen Dank für Deine Hilfe!
MlG
Otto
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Ausschneiden einer Zeile und Einfügen auf 2. Tabellenblatt

Beitrag von Toxitom »

Hey Otto,

also, so ganz überzeugt mich die Vorgehensweise nicht. Wäre zwar per Makro machbar.... aber: wozu der Aufwand?

Wenn Du denkst, es werden mal mehr als 100 Datensätze, dann arbeit Dich in Datenbanken ein und leg Dir ne Datenbank zu. Da brauchst Du keine Makros - da geht das mit Abfragen... und ziemlich einfach.

Falls Deine Tabelle nicht so groß wird, nimm einfach den Autofilter. Cursor in die Tabelle setzen in Tabellenblatt 1 - Menü Daten- Autofilter.

Jetzt ist Deine Kopfzeile mit Pfeilen versehen und Du kannst die Liste direkt nach Wunsch filtern oder sortieren (siehe Bild).
Wählst Du im letzten Feld bsp nur die "n" - werden die "j" alle ausgebedent - also Deine Wunschliste auf Tab1. Wählst Du nur die "j" - dann wäre das Deine Wunschliste auf Tab 2 - und das ales ohne Makros etc.

Also, was braucht man mehr?
Zwischenablage01.jpg
Zwischenablage01.jpg (48.27 KiB) 2268 mal betrachtet
VG Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
OttoR
Beiträge: 5
Registriert: Mo, 14.03.2022 12:08

Re: Ausschneiden einer Zeile und Einfügen auf 2. Tabellenblatt

Beitrag von OttoR »

Servus Tom,

so habe ich es bisher auch gemacht und hat auch wunderbar funktioniert. Aber die Anzahl der Zeilen werden immer mehr und ich habe jetzt 500 Zeilen in der Tabelle; dann ist mir genau das passiert, was nicht passieren sollte: ich hab die erledigten Zeilen gelöscht, weil ich sie alle markiert hatte und danach das Blatt gespeichert. Zum Glück hab ich das Blatt vorher gesichert und ich konnte es wiederherstellen.

Aber das soll mir kein 2. Mal passieren, deswegen meine Frage bzgl. Makro. Der Vorteil wäre auch der, dass ich die erledigten von den unerledigten getrennt habe.

Könntest Du mir da bitte helfen?
Danke
Otto
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Ausschneiden einer Zeile und Einfügen auf 2. Tabellenblatt

Beitrag von Toxitom »

Hey Otto,

na ja, wie ich schon sagte: Nimm eine Datenbank, das wäre der richtige Weg!!! Aus 500 werden schnell 1000 und so weiter- da ist die Datenbank immer die bessere Option. Das mit dem kopieren und löschen sind "Krämpfe" und kein sinnvoller Arbeitsschritt.....

Aber bitte, hier das passende Makro. Versuche es zu verstehen, passe es für Deine Bedürfnisse an und ergänze die Deklarationen:

Code: Alles auswählen

REM Kopiert Zeilen aus Tab1 auf Tab2 und löscht die Zeile aus Tab1
Sub CopyAndDelete
 
  'zugriff auf das Dokument
  oDoc = thisComponent
  QTab = oDoc.sheets.getByName("Tabelle1")    'Quelltabelle
  ZTab = oDoc.sheets.getByName("Tabelle2")     'Zieltabelle
  
  REM letzte benutzte Zeile in Quelltabelle
  oCur = QTab.createCursor()
  oCur.gotoEndofUsedArea(false) 
  nLztZeileQ = oCur.RangeAddress.EndRow
  
  REM Letzte Zeile der Zieltabelle ermitteln und daraus erste Einfügezeile 
  oCur = zTab.createCursor()
  oCur.gotoEndofUsedArea(false)  
  nZielZeile = oCur.RangeAddress.EndRow + 2

  REM Schleife über alle Zeilen beginnend von der letzten rekursiv! - Zeile 1 (Index 0) wird dabei nicht berücksichtigt!
  for i = nLztZeileQ to 1 step -1
     REM Prüfen ob in Spalte G ein "j" steht
     if QTab.getCellByPosition(6,i).string = "j" then
       REM zellbereich a-g der aktuellen Zeile kopieren auf a Zielzeile in der Zieltabelle kopieren 
       QTab.copyRange(ZTab.getCellRangeByName("A" & nZielZeile).CellAddress, QTab.getCellRangebyPosition(0,i,6,i).RangeAddress)
       nZielZeile = nZielZeile + 1   'Zeilenzähler eins hochsetzen
       REM jetzt wird die Zeile aus der Quelltabelle gelöscht
       QTab.rows.removeByIndex(i,1)
     end if
  next 
  
End Sub
PS: Wenn Du damit spielst und das Makro einbaust - nimm auf jedenfall nur eine Kopie Deiner Datei. So bleibt Dir das Orginal auf jedenfall erhalten!!!

VG Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Antworten