BITTE helfen Sie uns HEUTE mit einer SPENDE
Helfen Sie das OpenOffice Forum zu erhalten!

DANKE >><< DANKE

> KEINE WERBUNG FÜR REGISTRIERTE BENUTZER!<
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des OpenOffice Forums verwendet.
🤗 Als Dankeschön werden Sie im Forum als OO-SUPPORTER gekennzeichnet. 🤗

Löschen von doppelten Zeilen per Makro

Alles zur Programmierung im OpenOffice.org
HerrStruppi
Beiträge: 12
Registriert: Fr 13. Jan 2017, 10:54

Löschen von doppelten Zeilen per Makro

Beitrag von HerrStruppi » Fr 24. Feb 2017, 16:39

Hi,

es gab in diesem Forum bereits Diskussionen über dieses Thema, allerdings ist kein Beitrag so richtig abgeschlossen bzw. die vorgeschlagenen Makros funktionieren nicht. :cry:

Es ist eigentlich ganz einfach zu erklären: ich brauche ein makro, das alle doppelten Zeilen löscht, allerdings nicht die leeren Zeilen, da das sonst viel zu lang dauert.

Vielen Dank im Voraus,
HerrStruppi

karolus
Beiträge: 651
Registriert: Di 23. Feb 2010, 12:07

Re: Löschen von doppelten Zeilen per Makro

Beitrag von karolus » Fr 24. Feb 2017, 17:23

Hallo

Gehts hier um [1]writer oder [2]calc ?

Definiere "doppelt"

[2]du kennst →Daten→Filter→Standardfilter ?

HerrStruppi
Beiträge: 12
Registriert: Fr 13. Jan 2017, 10:54

Re: Löschen von doppelten Zeilen per Makro

Beitrag von HerrStruppi » Mo 27. Feb 2017, 09:22

Hi,

erstmal danke für die Hilfe. Hier ein Paar Antworten auf deine Fragen:
karolus hat geschrieben:
Gehts hier um [1]writer oder [2]calc ?
Es geht um Calc
karolus hat geschrieben:
Definiere "doppelt"
Mit doppelt meine ich in dem Fall inhaltlich exakt identische Zeilen, leere Zeilen spielen dabei keine Rolle. Wenn diese auch entfernt werden, ist das allerdings auch nicht schlimm.
karolus hat geschrieben:
[2]du kennst →Daten→Filter→Standardfilter ?
Ja, das kenne ich, das hilft mir aber für ein Makro nicht weiter. Ich habe bereits versucht, mithilfe dieser Funktion ein Makro aufzunehmen, die einzelnen Schritte des Filters werden allerdings nicht aufgezeichnet.

Bis bald,
HerrStruppi

mikele
Beiträge: 771
Registriert: Sa 23. Jul 2011, 22:09

Re: Löschen von doppelten Zeilen per Makro

Beitrag von mikele » Mo 27. Feb 2017, 13:09

Hallo,
für ein sinnvolles Makro wirst du mit dem Aufzeichnen keinen Erfolg haben.
Einen (Standard)Filter kannst du per Makro z. B. so realisieren:

Code: Alles auswählen

Sub Main
	odoc=thiscomponent
	quelle=odoc.sheets(0).getcellrangebyname("A1:C12")
	ziel=odoc.sheets(1).getcellrangebyname("A1")
	oFilter = quelle.createFilterDescriptor(True)
	oFilter.ContainsHeader=true
	oFilter.CopyOutputData=true
	oFilter.OutputPosition=ziel.celladdress
	oFilter.SkipDuplicates=true
	aFilterFields = DimArray(2)
	for i=0 to 2
		aFilterFields(i) = new com.sun.star.sheet.TableFilterField
		aFilterFields(i).Connection = com.sun.star.sheet.FilterConnection.AND
		aFilterFields(i).field=i
		aFilterFields(i).IsNumeric = true
		aFilterFields(i).Operator = com.sun.star.sheet.FilterOperator.NOT_EMPTY
	next
	oFilter.setFilterFields(aFilterFields)
	quelle.filter(oFilter)
End Sub
Der Bereich in Tabelle 1 wird dann ohne Duplikate gefiltert und auf Tabelle 2 ausgegeben.
Ob das Ganze so sinnvoll ist, hängt allerdings davon ab, was du mit den Daten dann noch veranstalten willst. Dazu braucht es mehr Informationen.
Dateianhänge
makro_filter.ods
(9.85 KiB) 253-mal heruntergeladen
Gruß,
mikele

HerrStruppi
Beiträge: 12
Registriert: Fr 13. Jan 2017, 10:54

Re: Löschen von doppelten Zeilen per Makro

Beitrag von HerrStruppi » Mo 27. Feb 2017, 15:43

Hallo,
erstmal danke für die Hilfe.
leider funktioniert das makro nicht es erscheint eine Fehlermeldung in Zeile 4 ("ziel=odoc.sheets(1).getcellrangebyname("A1")"): "Unzulässiger Wert oder Datentyp. Index außerhalb des definierten Bereichs." Bei dem Makro des Dokuments, das du mir zum Download gegeben hast, passiert beim Ausführen des Makros leider gar nichts.

um noch mal genauer zu erklären, was ich meinte hier ein Beispiel:
1) Inhalt 1----------Inhalt 2----------Inhalt 3----------Inhalt 4
2) Inhalt 5----------Inhalt 6----------Inhalt 7----------Inhalt 8
3) Inhalt 9----------Inhalt 10----------Inhalt 3----------Inhalt 5
4) Inhalt 1----------Inhalt 6----------Inhalt 5----------Inhalt 2
5) Inhalt 1----------Inhalt 1----------Inhalt 1----------Inhalt 1
6) Inhalt 5----------Inhalt 6----------Inhalt 7----------Inhalt 8

In diesem Beispiel sollte bei dem Makro, das ich suche, nur die 6) gelöscht werden, da sie identisch zur 2) ist. Die 2) sollte nicht gelöscht werden. Unter gelöscht verstehe ich nicht Inhalte löschen sondern komplette Zeile löschen. Ich will mit den Daten sonst nichts mehr machen, ich will nur, dass keine Zeile doppelt existiert. Es ist auch nicht nötig, dass die Tabelle neu ausgegeben wird oder so was, es reicht, wenn die überflüssigen zeilen gelöscht werden.

Ich hoffe das reicht an Information,
HerrStruppi

mikele
Beiträge: 771
Registriert: Sa 23. Jul 2011, 22:09

Re: Löschen von doppelten Zeilen per Makro

Beitrag von mikele » Mo 27. Feb 2017, 17:27

Hallo,
es erscheint eine Fehlermeldung
Das ist klar, wenn du mein Beispiel unverändert auf deine Datei anwendest (die offensichtlich kein zweites Tabellenblatt besitzt).
es reicht, wenn die überflüssigen zeilen gelöscht werden
Das ist schon klar. Filtern wird hier wahrscheinlich trotzdem der schnellste Weg sein. Anbei ein geändertes Beispiel. Die Daten im Bereich A1:C20 zunächst filtert (in diesem Fall Duplikate ausblendet) und anschließend die ausgeblendeten Zeilen löscht.
Die erste Zeile wird dabei als Überschrift interpretiert.

Code: Alles auswählen

Sub Main
	odoc=thiscomponent
	quelle=odoc.sheets(0).getcellrangebyname("A1:C20")
	oFilter = quelle.createFilterDescriptor(True)
	oFilter.ContainsHeader=true
	oFilter.CopyOutputData=false
	oFilter.SkipDuplicates=true
	aFilterFields = DimArray(2)
	for i=0 to quelle.rangeaddress.endcolumn-quelle.rangeaddress.startcolumn
		aFilterFields(i) = new com.sun.star.sheet.TableFilterField
		aFilterFields(i).Connection = com.sun.star.sheet.FilterConnection.AND
		aFilterFields(i).field=i
		aFilterFields(i).IsNumeric = true
		aFilterFields(i).Operator = com.sun.star.sheet.FilterOperator.NOT_EMPTY
	next
	oFilter.setFilterFields(aFilterFields)
	quelle.filter(oFilter)
	for i=quelle.rangeaddress.endrow to quelle.rangeaddress.startrow step -1
		if odoc.sheets(0).rows(i).isfiltered then odoc.sheets(0).getrows.removebyindex(i,1)
	next
End Sub
Dateianhänge
makro_filter2.ods
(10.68 KiB) 248-mal heruntergeladen
Gruß,
mikele

HerrStruppi
Beiträge: 12
Registriert: Fr 13. Jan 2017, 10:54

Re: Löschen von doppelten Zeilen per Makro

Beitrag von HerrStruppi » Mo 6. Mär 2017, 09:55

Hi,

entschuldigung für die späte Rückmeldung (ich war im Urlaub) und danke für die Hilfe.

Vielleicht stelle ich mich auch einfach dumm an, aber was muss ich denn an dem Makro verändern, damit das funktioniert??
mikele hat geschrieben:Das ist klar, wenn du mein Beispiel unverändert auf deine Datei anwendest (die offensichtlich kein zweites Tabellenblatt besitzt).
Was meinst du damit? Ich habe einfach kein Unterschied zwischen dem Dokument, das du zum Download anbietest und dem, das ich benutze gefunden (Mal abgesehen vom Ihhalt der Zellen). Und dennoch erscheint die selbe Fehlermeldung, die ich bereits erwähnt hatte. Bei dem Dokument zum Download gibt es doch auch kein zweites Tabellenblatt, oder?
Ich schicke anbei nochmal ein Screenshot der Fehlermeldung.
Bildschirmfoto 2017-03-06 um 09.53.35.png
Bildschirmfoto 2017-03-06 um 09.53.35.png (122.33 KiB) 6014 mal betrachtet
Bis später,
HerrStruppi

HerrStruppi
Beiträge: 12
Registriert: Fr 13. Jan 2017, 10:54

Re: Löschen von doppelten Zeilen per Makro

Beitrag von HerrStruppi » Mo 6. Mär 2017, 10:21

Ok, jetzt muss ich mich doch noch mal melden. Ich habe doch etwas im Makro verändert, nur hatte ich das vergessen. Ich habe den Bereich, in dem gesucht wird auf "A1:M100" erweitert. Das scheint der Fehler zu sein. Wie muss ich das Makro verändern, damit das funktioniert?

Ebenfalls ist mir noch aufgefallen, dass die Fehlermeldung nicht erscheint, wenn ich das Makro nicht unter "Meine Makros" sondern im Dokument selbst speichere. Funktionieren tut das Makro dennoch nicht, sowohl mit "A1:C20" als auch mit "A1:M100". Es passiert überhaupt nichts, nur ohne Fehlermeldung.

mikele
Beiträge: 771
Registriert: Sa 23. Jul 2011, 22:09

Re: Löschen von doppelten Zeilen per Makro

Beitrag von mikele » Mo 6. Mär 2017, 11:53

Hallo,
mein Fehler - ich hatte zum Schluss noch etwas geändert und das aber nicht konsequent.
Hier das bereinigte Makro:

Code: Alles auswählen

Sub Main
	odoc=thiscomponent
	quelle=odoc.sheets(0).getcellrangebyname("A1:M100")
	oFilter = quelle.createFilterDescriptor(True)
	oFilter.ContainsHeader=true
	oFilter.CopyOutputData=false
	oFilter.SkipDuplicates=true
	n=quelle.rangeaddress.endcolumn-quelle.rangeaddress.startcolumn
	aFilterFields = DimArray(n)
	for i=0 to quelle.rangeaddress.endcolumn-quelle.rangeaddress.startcolumn
		aFilterFields(i) = new com.sun.star.sheet.TableFilterField
		aFilterFields(i).Connection = com.sun.star.sheet.FilterConnection.AND
		aFilterFields(i).field=i
		aFilterFields(i).IsNumeric = true
		aFilterFields(i).Operator = com.sun.star.sheet.FilterOperator.NOT_EMPTY
	next
	oFilter.setFilterFields(aFilterFields)
	quelle.filter(oFilter)
	for i=quelle.rangeaddress.endrow to quelle.rangeaddress.startrow step -1
		if odoc.sheets(0).rows(i).isfiltered then odoc.sheets(0).getrows.removebyindex(i,1)
	next
End Sub
Gruß,
mikele

HerrStruppi
Beiträge: 12
Registriert: Fr 13. Jan 2017, 10:54

Re: Löschen von doppelten Zeilen per Makro

Beitrag von HerrStruppi » Mo 6. Mär 2017, 12:13

Hi,

vielen Dank für das Makro und die dafür aufgewendete Zeit, jetzt funktioniert es :D

MfG,
HerrStruppi

Antworten