Seite 1 von 1

Re: Suche Wert in Spalte, lösche Zeile

Verfasst: Mi, 06.02.2013 16:56
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??

Re: Suche Wert in Spalte, lösche Zeile

Verfasst: Mi, 06.02.2013 17:19
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

Re: Suche Wert in Spalte, lösche Zeile

Verfasst: Do, 07.02.2013 17:25
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

Re: Suche Wert in Spalte, lösche Zeile

Verfasst: Fr, 08.02.2013 09:12
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

Re: Suche Wert in Spalte, lösche Zeile

Verfasst: Fr, 08.02.2013 09:39
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

Re: Suche Wert in Spalte, lösche Zeile

Verfasst: Fr, 08.02.2013 09:50
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