Werte aus Tabelle mittels Makros filtern und ausgeben

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

Moderator: Moderatoren

Charly
*****
Beiträge: 450
Registriert: Di, 20.01.2004 13:14
Wohnort: München

Re: Werte aus Tabelle mittels Makros filtern und ausgeben

Beitrag von Charly »

Hallo!

Ich habe ein Makro mit deinen Angaben geschrieben. Vielleicht passt es so!

Gruß
Charly
Dateianhänge
FilterInNeuerTabelle.ods
(10.65 KiB) 516-mal heruntergeladen
Charly
*****
Beiträge: 450
Registriert: Di, 20.01.2004 13:14
Wohnort: München

Re: Werte aus Tabelle mittels Makros filtern und ausgeben

Beitrag von Charly »

Hallo!

Ich verwende als Filterkriterium einen regulären Ausdruck: [1,2,3]. Jetzt habe ich im ersten Moment gedacht, das Makro erkennt in der 1 an der Zehnerposition ein erfülltes Filterkriterium. Aber bei mir wird die Ziffer 10 nicht angezeigt.
Ich bin jetzt ein bisschen ratlos, warum die 10 angezeigt wird.

Nachdem der übrige Teil des Filters funktioniert hat, gehe ich davon aus, dass du in den Extra -Optionen - Calc - Berechnen eingestellt hast: reguläre Ausdrücke in Formeln ermöglichen.

Vielleicht ladest du die Datei, in der du das Verhalten festgestellt hast zur Gegenprobe hoch.

Gruß
Charly
hoover
Beiträge: 6
Registriert: Di, 22.12.2009 08:23

Re: Werte aus Tabelle mittels Makros filtern und ausgeben

Beitrag von hoover »

Also das hier ist die Datei

Ich bin jetzt auch registriert(Deshalb statt h00ver --> hoover)
Zuletzt geändert von hoover am Di, 22.12.2009 14:13, insgesamt 1-mal geändert.
Karolus
********
Beiträge: 7519
Registriert: Mo, 02.01.2006 19:48

Re: Werte aus Tabelle mittels Makros filtern und ausgeben

Beitrag von Karolus »

Hallo
Ändere im Makrocode die Zeile:
oFilterBeschreib.ContainsHeader = True
auf:
oFilterBeschreib.ContainsHeader = false

Gruß Karo
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
Charly
*****
Beiträge: 450
Registriert: Di, 20.01.2004 13:14
Wohnort: München

Re: Werte aus Tabelle mittels Makros filtern und ausgeben

Beitrag von Charly »

Hallo!

Ich habe den Fehler schon gefunden. In meiner Beispielsdatei habe ich mit Überschrift gearbeitet, während du in deiner Datei keine Überschrift hast. Das bedeutet mit meinem Code wird die erste Zeile nicht gefiltert.

Du musst folgenden Code:

Code: Alles auswählen

oFilterBeschreib.ContainsHeader = True
umwandeln in

Code: Alles auswählen

oFilterBeschreib.ContainsHeader = False
Gruß
Charly
hoover
Beiträge: 6
Registriert: Di, 22.12.2009 08:23

Re: Werte aus Tabelle mittels Makros filtern und ausgeben

Beitrag von hoover »

Hallo
Danke! Super es klappt!
Vielen Dank an Karo und Charly


Gruß Hoover
hoover
Beiträge: 6
Registriert: Di, 22.12.2009 08:23

Re: Werte aus Tabelle mittels Makros filtern und ausgeben

Beitrag von hoover »

Hallo nochmal,

hätte da noch ein kleines Problem bzw. Anliegen. Ich möchte da jetzt niemanden überstapazieren aber es gäbe da noch eine Kleinigkeit.

Nachdem alles gefiltert ist und in eine neue Tabelle gekommen ist müsste mit den Werten in Spalte 4 und 5 noch eine Operation durchgeführt werden. Sie sollen durch hundert geteilt werden, die in spalte 4 anschließend plus 4000000 die in 5 plus 5000000 und dann angezeigt werden

Danke
Charly
*****
Beiträge: 450
Registriert: Di, 20.01.2004 13:14
Wohnort: München

Re: Werte aus Tabelle mittels Makros filtern und ausgeben

Beitrag von Charly »

Hallo Hoover!

Ich habe den Code ergänzt.

Code: Alles auswählen

Sub FilterAusgabeInNeuerTabelle()
Dim Dok as Object
Dim Blatt as Object
Dim Bereich as Object
Dim Endspalte as long
Dim Endzeile as long
Dim Filterarray(0)
DIM Zielblatt as Object
Dim Zelle as Object

Dok = ThisComponent

'Zielblatterstellen
If Dok.sheets.hasByName("Ergebnis") then
Dok.sheets.removeByName("Ergebnis")
end if
Dok.sheets.insertNewByName("Ergebnis",0)
Zielblatt = Dok.sheets.getByName("Ergebnis")
Ziel = Zielblatt.getCellRangeByName("A1")


'Datenbereich definieren
Blatt = Dok.getsheets().getbyName("Daten")
Cursor = Blatt.createCursor()
Cursor.gotoEndOfUSEDArea(True)


EndSpalte = Cursor.getRangeAddress().EndColumn
EndZeile = Cursor.getRangeAddress().Endrow


Bereich = Blatt.getCellRangeByPosition(0,0,Endspalte,Endzeile)


'Filterobjekt mit Einstellungen erstellen
oFilterBeschreib = Bereich.createFilterDescriptor(True)
oFilterBeschreib.ContainsHeader = false
oFilterBeschreib.UseRegularExpressions = True
oFilterBeschreib.isCaseSensitive = false
oFilterBeschreib.CopyOutputData = true
oFilterBeschreib.OutputPosition = Ziel


Filterfeld = createUnoStruct("com.sun.star.sheet.TableFilterField")


Filterfeld.operator = com.sun.star.sheet.FilterOperator.EQUAL

Filterfeld.StringValue = "[1,2,3]" 
Filterfeld.field = 5
FilterArray(0) = Filterfeld


oFilterBeschreib.setFilterFields(FilterArray)
Bereich.filter(oFilterBeschreib)

'Ergebnisblatt bearbeiten

Cursor = ZielBlatt.createCursor()
Cursor.gotoEndOfUSEDArea(True)

EndSpalte = Cursor.getRangeAddress().EndColumn
EndZeile = Cursor.getRangeAddress().Endrow

For I = 1 to Endzeile
Zelle = Zielblatt.getCellByPosition(3,I)
Betrag = Zelle.value/100 + 4000000
Zelle.value = Betrag

Zelle = Zielblatt.getCellByPosition(4,I)
Betrag = Zelle.value/100 + 5000000
Zelle.value = Betrag

next
End Sub 
Gruß
Charly
hoover
Beiträge: 6
Registriert: Di, 22.12.2009 08:23

Re: Werte aus Tabelle mittels Makros filtern und ausgeben

Beitrag von hoover »

Hallo Charly,

danke, dass du Dich der Sache so schnell angenommen hast.
Es funktioniert wunderbar!
Vielen, vielen Dank!

Hättest Du evtl noch einen Tip zur Formatierung wie man sich die ergebnisse 3 Stellig nach dem Komma anzeigen lassen kann??

Habs über den Makrorekorder versucht die Formatierung aufzuzeichnen, ging aber irgendwie nicht.
Über number format value
value = 107 sollte es gehen meine ich, ging aber nicht
Karolus
********
Beiträge: 7519
Registriert: Mo, 02.01.2006 19:48

Re: Werte aus Tabelle mittels Makros filtern und ausgeben

Beitrag von Karolus »

Hallo Damuscheng85 oder hoover oder wer auch immer

Mit
msgbox thisComponent.currentselection().numberformat
könntest du den Formatindex der aktuellen Zelle auslesen....

Gruß Karo
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
Charly
*****
Beiträge: 450
Registriert: Di, 20.01.2004 13:14
Wohnort: München

Re: Werte aus Tabelle mittels Makros filtern und ausgeben

Beitrag von Charly »

Hallo!

Der Vorschlag von Karolus ist gut, die Nummer des Numberformat aus einer formatierten Zelle auszulesen. Ich habe die Erfahrung gemacht, dass die Nummer bei unterschiedlichen Systemen variieren. Bei mir bin ich auf den Nummerncode 108 gekommen. Wenn für die gewünschte Formatierung ein Code existiert und man diesen weiß, ist einfach die Formatierung in ein Makro auch ohne Aufzeichnung einzubauen.

Hier das Teilmakro:

Code: Alles auswählen

For I = 1 to Endzeile
Zelle = Zielblatt.getCellByPosition(3,I)
Betrag = Zelle.value/100 + 4000000
Zelle.value = Betrag
Zelle.numberformat = 108
Zelle = Zielblatt.getCellByPosition(4,I)
Betrag = Zelle.value/100 + 5000000
Zelle.value = Betrag
Zelle.numberformat = 108
next
Gruß
Charly
hoover
Beiträge: 6
Registriert: Di, 22.12.2009 08:23

Re: Werte aus Tabelle mittels Makros filtern und ausgeben

Beitrag von hoover »

Hallo Charly


es funktioniert leider nicht so wie Du gedacht hast, aber wenn man in eine Zeile reinklickt und diese formatiert wird die Formatierung für die anderen übernommen.
Woran könnte das liegen

Gruß Hoover
Charly
*****
Beiträge: 450
Registriert: Di, 20.01.2004 13:14
Wohnort: München

Re: Werte aus Tabelle mittels Makros filtern und ausgeben

Beitrag von Charly »

Hallo!

Bei mir hat das mit der Nummer 108 funktioniert. Aber wie schon erwähnt, gibt es beim Nummernformat unterschiedliche Nummern, durch die es bei der Zuweisung zu Problemen kommen kann.
Ich habe mal in den Code die lange Version eingefügt, bei der das Makro den NummernformatCode selbst sucht. Wenn er kein entsprechendes Format findet, erzeugt er sich selbst einen Code. Vielleicht funktioniert es so bei dir.

Code: Alles auswählen

Sub FilterAusgabeInNeuerTabelle()
Dim Dok as Object
Dim Blatt as Object
Dim Bereich as Object
Dim Endspalte as long
Dim Endzeile as long
Dim Filterarray(0)
DIM Zielblatt as Object
Dim Zelle as Object
Dim objNummerFormat as object
Dim strNummerFormat as String
Dim lngNummerFormatId as long
Dim objLocalSettings as New com.sun.star.lang.Locale

Dok = ThisComponent

'Zielblatterstellen
If Dok.sheets.hasByName("Ergebnis") then
Dok.sheets.removeByName("Ergebnis")
end if
Dok.sheets.insertNewByName("Ergebnis",0)
Zielblatt = Dok.sheets.getByName("Ergebnis")
Ziel = Zielblatt.getCellRangeByName("A1")

'Datenbereich definieren
Blatt = Dok.getsheets().getbyName("Daten")
Cursor = Blatt.createCursor()
Cursor.gotoEndOfUSEDArea(True)

EndSpalte = Cursor.getRangeAddress().EndColumn
EndZeile = Cursor.getRangeAddress().Endrow

Bereich = Blatt.getCellRangeByPosition(0,0,Endspalte,Endzeile)

'Filterobjekt mit Einstellungen erstellen
oFilterBeschreib = Bereich.createFilterDescriptor(True)
oFilterBeschreib.ContainsHeader = false
oFilterBeschreib.UseRegularExpressions = True
oFilterBeschreib.isCaseSensitive = false
oFilterBeschreib.CopyOutputData = true
oFilterBeschreib.OutputPosition = Ziel

Filterfeld = createUnoStruct("com.sun.star.sheet.TableFilterField")

Filterfeld.operator = com.sun.star.sheet.FilterOperator.EQUAL

Filterfeld.StringValue = "[1,2,3]" 
Filterfeld.field = 5
FilterArray(0) = Filterfeld

oFilterBeschreib.setFilterFields(FilterArray)
Bereich.filter(oFilterBeschreib)

'das Numberformat suchen bzw. ein neues bei nicht vorhanden erzeugen
objLocalSettings.Language = "de"
objLocalSettings.Country = "DE"
objNummerFormat = Dok.NumberFormats
strNummerFormat = "0,000"

lngNummerFormatId = objNummerFormat.queryKey(strNummerFormat,objLocalSettings, True)

If lngNummerFormatId = -1 then
   lngNummerFormatId = objNummerFormat.addNew(strNummerFormat, objLocalSettings)
End if

'Ergebnisblatt bearbeiten

Cursor = ZielBlatt.createCursor()
Cursor.gotoEndOfUSEDArea(True)

EndSpalte = Cursor.getRangeAddress().EndColumn
EndZeile = Cursor.getRangeAddress().Endrow

For I = 1 to Endzeile
Zelle = Zielblatt.getCellByPosition(3,I)
Betrag = Zelle.value/100 + 4000000
Zelle.value = Betrag
Zelle.numberformat = lngNummerFormatId

Zelle = Zielblatt.getCellByPosition(4,I)
Betrag = Zelle.value/100 + 5000000
Zelle.value = Betrag
Zelle.numberformat = lngNummerFormatId

next
End Sub 
Gruß
Charly
hoover
Beiträge: 6
Registriert: Di, 22.12.2009 08:23

Re: Werte aus Tabelle mittels Makros filtern und ausgeben

Beitrag von hoover »

Vielen Dank!
Hat alles super geklappt.
Danke, schöne Weihnachten!
Liebe Grüße
Antworten