Supportnet / Forum / Tabellenkalkulation
finde Zellenwert
Frage
Hallo,
habe mal wieder eine Frage, und zwar will ich über ein Makro eine Zeile aus einem Tabellenblatt löschen. Allerdings muss die Zeile ersteinmal lokalisiert werden und dazu muß eine Spalte mit dem eingegebenen Wert (string) verglichen werden.
Mein erster Ansatz sieht so aus:
Abfrage "Name"
Schleife 1 bis 1000
vergleiche Name mit Zelle Bx (es muß nur Spalte B vergleichen)
wenn Name gleich Zellenwert dann
Zeile der Zelle ausgeben
und Zeile löschen
wenn nicht gleich
Schleifenwert um 1 erhöhen
solange durchführen bis gleich oder 1000 erreicht
Ist mein Ansatz richtig, wie würde das ungefähr in vba aussehen oder gibt es noch eine viel schöne und einfachere Lösung.
Vielen Dank strongé
Antwort 1 von Ahnan
Hallo,
so ähnlich gestrikt, wie von dir beschrieben:
Dim i As Integer, erg As String, strMsg As String
Sub Suchen()
erg = InputBox("Bitte den Namen eingeben:")
If erg = "" Then Exit Sub
For i = 1 To 1000
If ActiveSheet.Cells(i, 2).Value = erg Then
strMsg = strMsg & ActiveSheet.Cells(i, 2).Address(False, False) & vbCrLf
ActiveSheet.Rows(i).Delete
End If
Next i
MsgBox "Hier gefunden u. gelöscht:" & vbNewLine & strMsg, vbOKOnly + vbInformation, "In den Zeilen wurde gefunden u. gelöscht !"
End Sub
Dabei wird der zu suchende Name in eine Inputbox eingegeben !
Gruss
so ähnlich gestrikt, wie von dir beschrieben:
Dim i As Integer, erg As String, strMsg As String
Sub Suchen()
erg = InputBox("Bitte den Namen eingeben:")
If erg = "" Then Exit Sub
For i = 1 To 1000
If ActiveSheet.Cells(i, 2).Value = erg Then
strMsg = strMsg & ActiveSheet.Cells(i, 2).Address(False, False) & vbCrLf
ActiveSheet.Rows(i).Delete
End If
Next i
MsgBox "Hier gefunden u. gelöscht:" & vbNewLine & strMsg, vbOKOnly + vbInformation, "In den Zeilen wurde gefunden u. gelöscht !"
End Sub
Dabei wird der zu suchende Name in eine Inputbox eingegeben !
Gruss
Antwort 2 von stronge
Hallo Ahnan,
vielen Dank, sieht so aus als würde es funktionieren. Leider ist mir ein Problem für meinen Anwendungsfall aufgefallen. Und zwar bei dem Vergleich mit der Zelle (i,2). Mein Eintrag ist ein automatischer Verweis auf ein Datenblatt. Sieht so aus: =Name!Z(x)S(y)
Bei der Abfrage gibt der Benutzer natürlich nur den Namen ein und die Zeile muss trotzdem gefunden werden. Eine Idee wie man das macht?
Kann man quasi mit dem Vergleichen, was in der Zelle angezeigt wird?
Vielen Dank erstmal, gruß strongé
vielen Dank, sieht so aus als würde es funktionieren. Leider ist mir ein Problem für meinen Anwendungsfall aufgefallen. Und zwar bei dem Vergleich mit der Zelle (i,2). Mein Eintrag ist ein automatischer Verweis auf ein Datenblatt. Sieht so aus: =Name!Z(x)S(y)
Bei der Abfrage gibt der Benutzer natürlich nur den Namen ein und die Zeile muss trotzdem gefunden werden. Eine Idee wie man das macht?
Kann man quasi mit dem Vergleichen, was in der Zelle angezeigt wird?
Vielen Dank erstmal, gruß strongé
Antwort 3 von Ahnan
Hallo,
meinst du Namen die über eine Formel "eingelesen" werden ? Ob diese mit einer Formel (Verweis) oder händisch eingelesen/eingegeben wurden, spielt keine Rolle. Beide werden gefunden. Oder meinst du, dass dann "das Finden" und Löschen in dem entsprechenden Tabellenblatt passieren soll. Also in dem Fall im Blatt "Namen" ?
Gruss
meinst du Namen die über eine Formel "eingelesen" werden ? Ob diese mit einer Formel (Verweis) oder händisch eingelesen/eingegeben wurden, spielt keine Rolle. Beide werden gefunden. Oder meinst du, dass dann "das Finden" und Löschen in dem entsprechenden Tabellenblatt passieren soll. Also in dem Fall im Blatt "Namen" ?
Gruss
Antwort 4 von stronge
Das erste Tabellenblatt fungiert als eine Übersicht. Dort habe ich zwei Makros installiert. Mit dem einen Makro erstellt man auomatisch nach einer von mir abgelegten Vorlage ein neus Datenblatt. Dieses Datenblatt erhält einen durch den Benutzer eingegebenen Namen und wird dann in der Arbeitsmappe abgelegt. Ausserdem wird auf der Übersicht eine Zeile mit Links, die auf das Datenblatt zugreifen, eingefügt.
Das zweite Makro soll nun, nach Eingabe des Datenblattnamens 1. das entsprechende Datenblatt aus der Arbeitsmappe löschen und 2. die Zeile auf der Übersichtsseite löschen, da dort die Bezüge ja eh nicht mehr funktionieren.
Eigentlich ist alles fast zufriedenstellend gelöst, außer das die richtige Zeile auf dem Übersichtsblatt gelöscht wird. Da aber die Zeile nur aus Links besteht, findet deine erste Lösung nicht die richtige zeile. (siehe oben) "Name" ist eben nicht gleich "=Name!Z(x)S(y)"
Hoffe du verstehst jetzt was ich meine.
Das zweite Makro soll nun, nach Eingabe des Datenblattnamens 1. das entsprechende Datenblatt aus der Arbeitsmappe löschen und 2. die Zeile auf der Übersichtsseite löschen, da dort die Bezüge ja eh nicht mehr funktionieren.
Eigentlich ist alles fast zufriedenstellend gelöst, außer das die richtige Zeile auf dem Übersichtsblatt gelöscht wird. Da aber die Zeile nur aus Links besteht, findet deine erste Lösung nicht die richtige zeile. (siehe oben) "Name" ist eben nicht gleich "=Name!Z(x)S(y)"
Hoffe du verstehst jetzt was ich meine.
Antwort 5 von Ahnan
Wenn ich es richtig verstanden habe, dann möchtest du das Blatt, von dem die Verknüpfung (Link) stammt, löschen. Anschließend auch die entsprechende Zeile deiner Übersichtstabelle, oder ?!
Was heißt bei dir eigentlich Link ? Ist das nur ein Formelverweis, oder steckt da tatsächlich ein Hyperlink dahinter ?
Falls, das "nur" Formelverweise sind (also keine Hyperlinks), dann ist mir nichts "dümmeres" eingefallen, als Hyperlinks von den gefundenen Namen zu erstellen. Anschließend dem Hyperlink folgen u. das aktive Blatt u löschen. Dann zurück in die Übersichtsliste u. die markierte Zeile löschen !
Sub Suchen()
Dim i As Long, erg As String
On Error Resume Next
erg = InputBox("Bitte den Namen eingeben:")
Application.ScreenUpdating = False
If erg = "" Then Exit Sub
For i = 1 To 1000
If ActiveSheet.Cells(i, 2).Value = erg Then
Cells(i, 2).Select
ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", SubAddress:=ActiveCell.Formula
Selection.Hyperlinks(1).Follow
Application.DisplayAlerts = False
ActiveSheet.Delete
Sheets("Tabelle1").Activate
Selection.EntireRow.Delete
End If
Next i
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
Das Makro funktioniert genau wie von mir beschrieben. Diese Zeile:
Sheets("Tabelle1").Activate
musst du entsprechend deiner Übersichtstabelle ändern. Also, anstelle Tabelle1 den Namen der Übersichtstabelle eintragen !
Gruss
Was heißt bei dir eigentlich Link ? Ist das nur ein Formelverweis, oder steckt da tatsächlich ein Hyperlink dahinter ?
Falls, das "nur" Formelverweise sind (also keine Hyperlinks), dann ist mir nichts "dümmeres" eingefallen, als Hyperlinks von den gefundenen Namen zu erstellen. Anschließend dem Hyperlink folgen u. das aktive Blatt u löschen. Dann zurück in die Übersichtsliste u. die markierte Zeile löschen !
Sub Suchen()
Dim i As Long, erg As String
On Error Resume Next
erg = InputBox("Bitte den Namen eingeben:")
Application.ScreenUpdating = False
If erg = "" Then Exit Sub
For i = 1 To 1000
If ActiveSheet.Cells(i, 2).Value = erg Then
Cells(i, 2).Select
ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", SubAddress:=ActiveCell.Formula
Selection.Hyperlinks(1).Follow
Application.DisplayAlerts = False
ActiveSheet.Delete
Sheets("Tabelle1").Activate
Selection.EntireRow.Delete
End If
Next i
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
Das Makro funktioniert genau wie von mir beschrieben. Diese Zeile:
Sheets("Tabelle1").Activate
musst du entsprechend deiner Übersichtstabelle ändern. Also, anstelle Tabelle1 den Namen der Übersichtstabelle eintragen !
Gruss
Antwort 6 von stronge
Hallo Ahnan,
hab es jetzt hinbekommen. Auch wenn ich jetzt eine etwas andere Lösung hinbekommen habe, hast du mir auf jeden Fall sehr geholfen. Danke
Falls es dich interessiert, hab ich den Code gepostet:
Sub Blatt_loeschen()
´On Error GoTo Err_Blatt_loeschen
Dim Name_SG, DelName_SG As String
Dim i As Integer
´Namen einlesen
Name_SG = InputBox("Bitte gewünschtes SG eingeben, welches aus der Datenbank gelöscht werden soll!", "SG Datenblatt löschen")
´Namen vergleichen und richtige Zeile auf Übersicht löschen
If Name_SG = "" Then
Exit Sub
End If
For i = 7 To 1000
DelName_SG = ActiveWorkbook.Sheets(1).Range("B" & i).Value
If DelName_SG = Name_SG Then
ActiveSheet.Rows(i).Delete
End If
Next i
´Blatt mit Namen löschen
ActiveWorkbook.Sheets(Name_SG).Delete
MsgBox "SG wurde gefunden und gelöscht."
Exit_Blatt_loeschen:
Exit Sub
Err_Blatt_loeschen:
MsgBox "Kein Datenblatt mit diesem Namen gefunden", 16, "Fehlermeldung"
Resume Exit_Blatt_loeschen
End Sub
hab es jetzt hinbekommen. Auch wenn ich jetzt eine etwas andere Lösung hinbekommen habe, hast du mir auf jeden Fall sehr geholfen. Danke
Falls es dich interessiert, hab ich den Code gepostet:
Sub Blatt_loeschen()
´On Error GoTo Err_Blatt_loeschen
Dim Name_SG, DelName_SG As String
Dim i As Integer
´Namen einlesen
Name_SG = InputBox("Bitte gewünschtes SG eingeben, welches aus der Datenbank gelöscht werden soll!", "SG Datenblatt löschen")
´Namen vergleichen und richtige Zeile auf Übersicht löschen
If Name_SG = "" Then
Exit Sub
End If
For i = 7 To 1000
DelName_SG = ActiveWorkbook.Sheets(1).Range("B" & i).Value
If DelName_SG = Name_SG Then
ActiveSheet.Rows(i).Delete
End If
Next i
´Blatt mit Namen löschen
ActiveWorkbook.Sheets(Name_SG).Delete
MsgBox "SG wurde gefunden und gelöscht."
Exit_Blatt_loeschen:
Exit Sub
Err_Blatt_loeschen:
MsgBox "Kein Datenblatt mit diesem Namen gefunden", 16, "Fehlermeldung"
Resume Exit_Blatt_loeschen
End Sub
Antwort 7 von Ahnan
Hallo,
in deinem Fall vergleichst ja nun doch das eigentliche Value der entsprechenden Zelle mit der Eingabe der Inputbox ! Das ist doch mein Lösungsansatz aus 1. Wobei dort noch nicht die Funktion zum Blatt suchen u. ebenfalls löschen gegeben war.
Das:
"Name" ist eben nicht gleich "=Name!..."
bekommst du mit deinem Code so nicht hin.
Naja, hauptsache es geht nun nach deinen Vorstellungen.
Gruss
in deinem Fall vergleichst ja nun doch das eigentliche Value der entsprechenden Zelle mit der Eingabe der Inputbox ! Das ist doch mein Lösungsansatz aus 1. Wobei dort noch nicht die Funktion zum Blatt suchen u. ebenfalls löschen gegeben war.
Das:
"Name" ist eben nicht gleich "=Name!..."
bekommst du mit deinem Code so nicht hin.
Naja, hauptsache es geht nun nach deinen Vorstellungen.
Gruss

