[GELÖST] Leere Zellen rausfiltern und nur Werte in neue Tabelle übertragen

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

Moderator: Moderatoren

MASP47
**
Beiträge: 28
Registriert: Sa, 04.06.2022 10:18

[GELÖST] Leere Zellen rausfiltern und nur Werte in neue Tabelle übertragen

Beitrag von MASP47 »

Liebes Forum!
Ich möchte per Makro aus einer Spalte alle Werte in eine neue Tabelle kopieren, die nicht leer sind. Dafür hab ich auch ein funktionierendes Makro:

Code: Alles auswählen

Sub NullenRausFiltern
oSheet = ThisComponent.Sheets.getByName("Daten")
sRange = "E2:E1000"
oSourceRange = oSheet.getCellRangeByName(sRange)
ThisComponent.Sheets.getByName("REFilter").getCellRangeByName("A1:B1000").clearContents(1023)
Dim oFields(0) As New com.sun.star.sheet.TableFilterField
oFields(0).Field=0
oFields(0).IsNumeric = True
oFields(0).Operator = com.sun.star.sheet.FilterOperator.NOT_EMPTY
oFilterDesc = oSourceRange.createFilterDescriptor(True)
oFilterDesc.setFilterFields(oFields())
oFilterDesc.SkipDuplicates = False
oFilterDesc.IsCaseSensitive = False
oFilterDesc.ContainsHeader = True
oFilterDesc.CopyOutputData = True
oFilterDesc.OutputPosition = ThisComponent.Sheets.getByName("REFilter").getCellRangeByName("A1").cellAddress
oSourceRange.Filter(oFilterDesc)
End Sub
Das hat bisher wie gesagt ganz gut funktioniert, allerdings waren bisher nur Zahlenwerte in den Zellen des Quellbereichs. Das hat sich nun geändert, das heißt, ich habe Formeln im Quellbereich, die entweder einen Zahlenwert aus geben oder "leer" bleiben. Jetzt meine Frage, wie muss ich das Makro ändern, damit erstens nur die Zahlenwerte kopiert werden und zweitens die "leeren" Zeilen nicht mitkopiert werden?

Vielen Dank im Voraus und lieben Gruß,
Andi
Zuletzt geändert von MASP47 am Fr, 10.06.2022 21:09, insgesamt 1-mal geändert.
Karolus
********
Beiträge: 7431
Registriert: Mo, 02.01.2006 19:48

Re: Leere Zellen rausfiltern und nur Werte in neue Tabelle übertragen

Beitrag von Karolus »

Code: Alles auswählen

def filter_non_empty(*_):

    doc = XSCRIPTCONTEXT.getDocument()
    data = doc.Sheets["Daten"]["E2:E1000"].DataArray
    out = tuple(row for row in data if row[0] != "") # !! ONE Column
    zieltabelle = doc.Sheets["REFilter"]
    zieltabelle["A1:B1000"].clearContents(1023)
    cursor = zieltabelle.createCursorByRange( zieltabelle["A1"] )
    cursor.collapseToSize(len(out[0]), len(out))
    cursor.DataArray = out
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
MASP47
**
Beiträge: 28
Registriert: Sa, 04.06.2022 10:18

Re: Leere Zellen rausfiltern und nur Werte in neue Tabelle übertragen

Beitrag von MASP47 »

Hallo Karolus,

danke für die Antwort! Leider weiß ich mit dem Code nicht viel anzufangen. Ich bekomme nur Fehlermeldungen..

LG Andi
MASP47
**
Beiträge: 28
Registriert: Sa, 04.06.2022 10:18

Re: Leere Zellen rausfiltern und nur Werte in neue Tabelle übertragen

Beitrag von MASP47 »

Hallo Karolus,

ist das ein Python Code?

LG Andi
Karolus
********
Beiträge: 7431
Registriert: Mo, 02.01.2006 19:48

Re: Leere Zellen rausfiltern und nur Werte in neue Tabelle übertragen

Beitrag von Karolus »

Ja, das ist python, im Anhang eine …ods mit einer Exportfunktion in deine Benutzerkonfiguration.

Hier nochmal der Quellcode für den Export:

Code: Alles auswählen

from pathlib import Path

def copy_to_user_path(*_, fname='some_filter.py'):
    doc =XSCRIPTCONTEXT.getDocument()
    sm = XSCRIPTCONTEXT.ctx.ServiceManager
    sfa = sm.createInstance("com.sun.star.ucb.SimpleFileAccess")
    substitute = sm.createInstance("com.sun.star.util.PathSubstitution")
    config_path = substitute.substituteVariables('$(user)/Scripts/python/', True)
    if not sfa.exists(config_path):
        sfa.createFolder(config_path)
    sfa.copy(f"{Path(__file__).with_name( fname )}", f"{ config_path }/{ fname }")
calc_datei_mit_Export.ods
(9.55 KiB) 82-mal heruntergeladen
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
MASP47
**
Beiträge: 28
Registriert: Sa, 04.06.2022 10:18

Re: Leere Zellen rausfiltern und nur Werte in neue Tabelle übertragen

Beitrag von MASP47 »

Hallo Karolus,
vielen Dank! Leider habe ich damit überhaupt keine Erfahrung. Wärst du so nett und könntest mir ganz kurz erklären, was ich da machen muss?
Vielen Dank und liebe Grüße,
Andi
Karolus
********
Beiträge: 7431
Registriert: Mo, 02.01.2006 19:48

Re: Leere Zellen rausfiltern und nur Werte in neue Tabelle übertragen

Beitrag von Karolus »

Hallo

Wenn du in der angehängen Calcdatei auf die Schaltfläche klickst, wird die eingebettete some_filter.py an die richtige Stelle deiner Benutzerkonfiguration kopiert.
Danach kannst du aus deiner CalcDatei die du filtern willst, →→Extras→Makros→Makros ausführen …Meine Makros→some_filter→→filter_non_empty ausführen.
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
MASP47
**
Beiträge: 28
Registriert: Sa, 04.06.2022 10:18

Re: Leere Zellen rausfiltern und nur Werte in neue Tabelle übertragen

Beitrag von MASP47 »

Wow, vielen Dank Karolus!

Das funktioniert super!

Kann man die Python Makros auch in ein ODS Dokument integrieren, wie Basic Makros? Also, dass man sie im Dokument speichert, mein ich.

Vielen Dank und LG
Andi
Karolus
********
Beiträge: 7431
Registriert: Mo, 02.01.2006 19:48

Re: Leere Zellen rausfiltern und nur Werte in neue Tabelle übertragen

Beitrag von Karolus »

Hallo
Kann man die Python Makros auch in ein ODS Dokument integrieren, wie Basic Makros
Ja, das hab ich ja auch gemacht in der calc_export.ods.

Es gibt dafür eine Anfängerfreunliche Erweiterung, lade dir von hier die Datei `apso.oxt` herunter und öffne sie mit libreoffice.
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
MASP47
**
Beiträge: 28
Registriert: Sa, 04.06.2022 10:18

Re: Leere Zellen rausfiltern und nur Werte in neue Tabelle übertragen

Beitrag von MASP47 »

Der Hammer!

Vielen Dank Karolus, für deine großartige Unterstützung!

Lieben Gruß und schönes Wochenende 8)
Andi
Antworten