Suche Wert in Spalte, lösche Zeile

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

Moderator: Moderatoren

Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: Suche Wert in Spalte, lösche Zeile

Beitrag von Karolus »

Hallo
'Stosse' besser auf →Daten→Filter→Standardfilter:
SpalteA <> <trag hier den Inhalt aus C4 ein

mit [x]Ausgabe <in andere Tabelle.A1>
drück die OK-taste und entferne die Ausgangstabelle

____
Warum werden hier eigentlich ständig Übersetzunghelfer für VBA-krimskrams gesucht - obwohl die Aufgabenstellung in einer Minute mit den 'Bordmitteln' jeder Tabellenkalkulation lösbar ist??
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: Suche Wert in Spalte, lösche Zeile

Beitrag von Karolus »

Hallo
finger12 hat geschrieben:Danke Karolus

Suche dennoch nach einem Makro, zwecks weiterführender Makros.
http://www.dannenhoefer.de/faqstarbasic/index.html

Karolus
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Benutzeravatar
lorbass
********
Beiträge: 4116
Registriert: Mo, 01.05.2006 21:29
Wohnort: Bonn

Re: Suche Wert in Spalte, lösche Zeile

Beitrag von lorbass »

finger12 hat geschrieben:Hab mir was zusammengeschuster was funktionert
Lässt du uns und zukünftige Leser an deiner Schuster-Lösung teilhaben?

Gruß
lorbass
juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

Re: Suche Wert in Spalte, lösche Zeile

Beitrag von juetho »

Nur zwei kleine Anmerkungen.

Elemente, die mehrfach verwendet werden, sollten als eigene Variable deklariert werden. Das gilt dafür:

Code: Alles auswählen

DIM oSheet AS Object
oSheet = thisComponent.Sheets.GetByName("Offerten")
Der folgende Abschnitt ist in zweifacher Hinsicht "schlecht" definiert:
finger12 hat geschrieben:

Code: Alles auswählen

     If ThisComponent.Sheets.GetByName("Offerten").Rows(x).isVisible = False Then
       ThisComponent.Sheets.GetByName("Offerten").Rows(x).isVisible = True
     Else
       ThisComponent.Sheets.GetByName("Offerten").Rows(x).isVisible = False
     End if
Statt "if = false" ist besser "if not" zu schreiben. Warum sollte ein logischer Wert erst noch verglichen werden, wenn sowieso dieser Wert genommen wird? Aber es geht sowieso einfacher und kürzer (unter Berücksichtigung der ersten Anmerkung):

Code: Alles auswählen

oSheet.Rows(x).isVisible = NOT oSheet.Rows(x).isVisible
Wenn ein logischer Wert "umgekehrt" werden soll, ist das immer das sinnvollste Verfahren.

Gruß Jürgen
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
bst
*****
Beiträge: 222
Registriert: Mo, 18.01.2010 16:14
Wohnort: Ilsfeld

Re: Suche Wert in Spalte, lösche Zeile

Beitrag von bst »

Auch Hallo,

löschen solltest Du M.E. von Unten nach Oben. Auch kannst Du Dir das Markieren via 'Visible' sparen.

Oder greifst Du da etwa auf zwei unterschiedliche Blätter zu??

cu, Bernd
--

Code: Alles auswählen

Option Explicit

Sub Main
	dim oSheet, oUsedCells, iMax As Integer, i As Integer, sSearch as String

	oSheet = ThisComponent.currentController.ActiveSheet
	oUsedCells = oSheet.Columns(0).queryContentCells(23)
	iMax = oUsedCells.RangeAddresses(oUsedCells.Count-1).endRow

	sSearch = oSheet.getCellRangeByName("C4").String
	for i = iMax To 0 Step -1
		if oSheet.getCellByPosition(0,i).String = sSearch then
			oSheet.getRows.removeByIndex(i,1)
		endif
	next
End Sub
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: Suche Wert in Spalte, lösche Zeile

Beitrag von Karolus »

Hallo
Das ist ein gutes Beispiel wie man es nicht machen sollte

Zuerst definierst du das Tabellenblatt fix über den Index.
Dann blendest du zunächst nur die Zeilen aus für die deine Bedingung zutrifft

Jetzt beginnst du nochmal von vorne mit neuen Variablenzuweisungen ( völlig sinnfrei )
im Falle von ...ActiveSheet wechselst du uU. sogar das Tabellenblatt !!! ( →evtl. Datenverlust )

um danach nochmal über die Bedingung 'not Row.isvisible' die Zeilen tatsächlich zu löschen.
umständlicher gehts nicht

Überarbeitet:

Code: Alles auswählen

Sub LOESCHEN


Dok = ThisComponent
sheet = Dok.CurrentSelection.Spreadsheet
startrow = 20


refstring = sheet.getCellByPosition(3,0).String 'inhalt aus D1

Cursor = sheet.createCursor()
Cursor.goToEndOfUsedArea(false)
endrow = Cursor.getRangeAddress().Endrow
if startrow >= endrow then exit sub 'Vermeidung einer Endlosschleife

For rowindex = endrow to startrow step -1 'rückwärts iterieren

If sheet.getCellByPosition(0, rowindex ).String = refstring then
    sheet.rows.removeByIndex( rowindex, 1)
endif
next

msgbox ("Offerte - " & refString & " - wurde gelöscht")

end sub
Edit: Bernd war schneller
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Antworten