Makro - Zeile löschen wenn WERT kleiner als

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

Moderator: Moderatoren

MavMan
*
Beiträge: 10
Registriert: Mi, 03.07.2019 16:13

Makro - Zeile löschen wenn WERT kleiner als

Beitrag von MavMan »

Ich habe doch noch einmal eine Bitte und Problem, wo ihr mir sicher helfen könnt.
Nachdem ich den Code eingefügt habe sind doch noch einige Sachen und Daten aus dem Export dazu gekommen.

Den Code mit dem Area und die Schleife habe ich verstanden und mich auch noch ein bißchen mehr mit VBA auseinandergesetzt und gelesen. Echt interessant und da kann man viel machen und lernen.

Nun zu meinen Sachen, die ich gerne lösen würde. Im Anhang habe ich mal eine Beispiel-Datei gelegt, weil es damit einfacher ist.

1) Gemerkt habe ich, dass es wenig Sinn macht anhand der Fahrzeit die Zeilen zu entfernen, sondern besser wäre es anhand Kilometer (Spalte G), mit der Schleifendefinition kleiner 1.0 km. Das Feld ist jedoch definiert mit Uhrzeit - was dem Export geschuldet ist. Frage: Kann man die Spalte eigentlich auch als decimal mit einer Nachkommastelle umkonvertieren? Dann kann ich damit später besser mit Formeln agieren. Und dann eben die Schleife, dass alles kleiner 1.0 gelöscht wird.

2) Die Datei hat x Tabellenblätter. Wie kann man drum herum noch eine Schleife basteln, dass alle Datenblätter angewandt werden? Das Makro soll auf jedem Blatt greifen.

3) Die Anzahl der Zeilen die aus Punkt 1 gelöscht wurden sollen in Zelle A2 unterhalb der Überschrift mit dem Text "Anzahl der gelöschten Zeilen: [variable Anzahl]" geschrieben werden. Darunter dann eine Leerzeile.

4) Letzter Punkt - Die Zeile "Täglich gesamt:" interessiert mich überhaupt nicht. In der Beispieldatei im Anhang habe ich hier auch nur Phantasiewerte stehen. Wie kann man diese, die mehrmals je Blatt vorkommen suchen und durch eine Leerzeile ersetzen?

Hoffe ich überfordere Eure Nerven und Zeit nicht. Ihr würdet mir sehr helfen und ich bin ein gelehriger Schüler und analysiere Euren Code und werde mich verbessern - versprochen.

Vielen, vielen Dank!
Grüsse MavMan
Dateianhänge
Beispiel-Tabelle.ods
(16.14 KiB) 105-mal heruntergeladen
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Makro - Zeile löschen wenn WERT kleiner als

Beitrag von Stephan »

immer für ein neues Thema einen neuen Thread erstellen, siehe:
viewtopic.php?f=3&t=54568
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Makro - Zeile löschen wenn WERT kleiner als

Beitrag von clag »

Hallo MayMan

deine km sind Text und keine Werte.
was ist denn nun richtig ?

Das siehst du ganz deutlich in G9

Code: Alles auswählen

=SUMME(G5:G8)
= 0,0 weil G5:G8 = Text
Zuletzt geändert von clag am Di, 16.07.2019 13:08, insgesamt 1-mal geändert.
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Makro - Zeile löschen wenn WERT kleiner als

Beitrag von Stephan »

ich fange mal an:
1) ...
z.B.:

Code: Alles auswählen

Sub Main
	Dim LocalSettings As New com.sun.star.lang.Locale
	
	blatt = ThisComponent.CurrentController.ActiveSheet
	
	cur = blatt.createCursor()
	cur.GotoEndOfUsedArea(True)
	letzte_zeile = cur.RangeAddress.EndRow
	
	For i = 4 To letzte_zeile
		With blatt.getCellByPosition(6, i)
			.Value = .String
			LocalSettings.Language = "de"
			LocalSettings.Country = "DE"
			nfs = ThisComponent.NumberFormats
			nf = "#.###,0"
			nfid = nfs.queryKey(nf, LocalSettings, True)
			If nfif = - 1 Then
				nfid = nfs.addNew(nf, LocalSettings)
			End If
			.NumberFormat = nfid
		End With
	Next i

End Sub
2) ...
z.B.:

Code: Alles auswählen

Sub Main
	For i = 0 To x-1
		aktuelles_Blatt = ThisComponent.Sheets.getByIndex(i)
		'... hier Dein weiterer Code
	Next i
End Sub
es ist jedoch nicht nötig x zu kennen oder vorzugeben, sondern man kann die Blattanzahl ermitteln lassen:

Code: Alles auswählen

Sub Main
	blattanzahl = ThisComponent.Sheets.Count
	For i = 0 To blattanzahl-1
		aktuelles_Blatt = ThisComponent.Sheets.getByIndex(i)
		'... hier Dein weiterer Code
	Next i
End Sub

Gruß
Stephan
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Makro - Zeile löschen wenn WERT kleiner als

Beitrag von clag »

Hallo MavMan,

aus allen bereits geposteten Codeschnipseln habe ich etwas hergenommen
von Stephan und mikeleb, habe noch etwas eigenes dazu gemischt
und das ganze auf Text angewendet wie in deiner Beispieltabelle vorgegeben.

Code: Alles auswählen

Sub cleanup
	blattanzahl = ThisComponent.Sheets.Count
	For ix = 0 To blattanzahl-1
		Blatt = ThisComponent.Sheets.getByIndex(ix)
		cur = blatt.createCursor()
		cur.GotoEndOfUsedArea(True)
		letzte_zeile = cur.RangeAddress.EndRow
		For i = letzte_zeile To 4 Step -1
			If left(blatt.getCellByPosition(6, i).string, 2) = "0."  Then
				blatt.rows.removeByIndex(i, 1)
			End If
		Next i
	Next ix
End Sub

Vielleicht kannst du das ja so gebrauchen?

Hier in deiner Beispieldatei per Button aufrufbar.
Beispiel-Tabelle+Makro.ods
(15.15 KiB) 111-mal heruntergeladen
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
MavMan
*
Beiträge: 10
Registriert: Mi, 03.07.2019 16:13

Re: Makro - Zeile löschen wenn WERT kleiner als

Beitrag von MavMan »

Hallo zusammen,

also ich lerne und hab das verstanden :-)
Ich habe nun kein neues Topic erstellt, weil die Grundfragestellung ja noch nicht abschliessend gelöst ist.....hoffe das ist okay.
Habe seit gestern den Code von Stephan als Grundlage benutzt und das so zusammengebaut. Zuerst das Format wandeln und dann Aktionen darauf ausfuehren.

Punkt 4 habe ich durch den Codeschnipsel von Clag so lösen können und gelöst -> Löschen der Zeile wenn dort "Täglich gesamt steht"

Das ist der aktuelle Code:

Code: Alles auswählen

Sub TESTCommunity
	'Mit der Hilfe aus de.openoffice.info Community 
	'20190717 - Initiale Erstellung
	blattanzahl = ThisComponent.Sheets.Count
	For j = 0 To blattanzahl-1
		aktuelles_Blatt = ThisComponent.Sheets.getByIndex(j)
		
			'Start Schleifencode ueber alle Arbeitsblaetter	
			Dim LocalSettings As New com.sun.star.lang.Locale
	
			'blatt = ThisComponent.CurrentController.ActiveSheet
	
			cur = aktuelles_Blatt.createCursor()
			cur.GotoEndOfUsedArea(True)
			letzte_zeile = cur.RangeAddress.EndRow
	
			For i = 4 To letzte_zeile
				With aktuelles_Blatt.getCellByPosition(6, i)
				.Value = .String
				LocalSettings.Language = "de"
				LocalSettings.Country = "DE"
				nfs = ThisComponent.NumberFormats
				nf = "#.###,0"
				nfid = nfs.queryKey(nf, LocalSettings, True)
				If nfif = - 1 Then
				nfid = nfs.addNew(nf, LocalSettings)
				End If
				.NumberFormat = nfid
				
				'Start - Alle kleiner als 5km - delete Zeile
					'Frage: Der Cursor ist ja schon auf der richtigen Position, wie kann ich ihn direkt ansprechen? Brauche ja nur den aktuellen Value - Ich mach das hier defintiv falsch
					'If aktuelles_Blatt.getCellByPosition(6, i).Value < (5.0) Then
					'aktuelles_Blatt.rows.removeByIndex(i, 1)
					'End If
				'Ende - Alle kleiner als 5km - delete Zeile
				
				'Start - Täglich gesamt - delete Zeile
					If left(aktuelles_Blatt.getCellByPosition(0, i).string, 7) = "Täglich"  Then
					aktuelles_Blatt.rows.removeByIndex(i, 1)
					End If
				'Ende - - Täglich gesamt - delete Zeile
				
				End With
			Next i 
	
	Next j 'Ende Schleifencode ueber alle Arbeitsblaetter
	MsgBox "Programmcode durchgelaufen."
End Sub

a) Wenn ich das Makro ausführe, dann wird korrekt konvertiert von Uhrzeit nach Decimal - jedoch wenn eine Leerzeile dazwischen ist (und da sind welche) so wird diese mit einer Null "0" aufgefüllt. Wie kann man dies verhindern - also das die Zelle vorhanden und leer bleibt?

b) Punkt 1 wollte ich noch durch eine if-Schleife ergänzen, dass alle Zeilen entfernt werden, deren Wert kleiner 5 ist. Ich weiss aber nicht, wie ich die Schleife korrekt schreibe und den Value auslese.

Wenn möglich möchte ich immer noch, dass hier eine Zählvariable mitwirkt für den Punkt3 aus der Aufgabenliste...
3) Die Anzahl der Zeilen die aus Punkt 1 gelöscht wurden sollen in Zelle A2 unterhalb der Überschrift mit dem Text "Anzahl der gelöschten Zeilen: [variable Anzahl]" geschrieben werden. Darunter dann eine Leerzeile.
Ich danke Euch und ich bin jetzt echt heiss darauf mehr zu lernen und machen....

P.S: @clag: Das ist ja geil! Du hast einen Button gemacht, der das Makro ausführen kann :)
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Makro - Zeile löschen wenn WERT kleiner als

Beitrag von clag »

Hallo MavMan,

deine intellektuelle Selbeinschätzung kennt scheinbar gar keine Höhenangst?
P.S: @clag: Das ist ja geil! Du hast einen Button gemacht, der das Makro ausführen kann :)
dieser dein Kommentar, er lässt nur auf Fluguntauglichkeit schließen.
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Antworten