Excel Tabellenblatt per Input-Abfrage löschen?
Guten Tag,
ich möchte gerne per Input-Abfrage ein Tabellenblatt löschen. Sie Eingabe in der Abfrage entspricht den Namen des Tabellenblatt. Leider komme ich nicht weiter, wie ich den Bezug von der Eingabe zum Tabellenblatt bekommen.
Hilfe wäre sehr nett
Gruß
3 Antworten
Sub Angebot_loeschen2()
Dim myInput
Dim FindData
Dim zelle As Range
Dim WsTabelle As Worksheet
Dim boNumberPresent As Boolean
Const myTab = "Angebotsliste"
myInput = InputBox("Bitte geben Sie die Nummer an.", "Datenpr?fung")
If Information.IsNumeric(myInput) Then
FindData = Conversion.CDec(myInput)
Else
MsgBox "Es wurde keine Zahl eingegeben", vbCritical, "Allg. Hilfe"
Exit Sub
End If
FindData = Application.Match(FindData, Worksheets(myTab).Range("F3:F102"), 0)
If IsError(FindData) Then
MsgBox "Die Angebotsnummer: " & myInput & " wurde nicht gefunden."
Else
boNumberPresent = False 'Annahme dass eine solche nummer nicht existiert VOR der Schleife
For Each WsTabelle In Sheets
If (WsTabelle.Name) = myInput Then
Application.EnableEvents = False
Worksheets(myTab).Range("G" & FindData + 2).Value = "erledigt"
Application.EnableEvents = True
Application.DisplayAlerts = False
Worksheets(myInput).Delete
Application.DisplayAlerts = True
MsgBox "Die Angebotsnummer: " & myInput & " wurde als erledigt gespeichert und gelöscht."
boNumberPresent = True
Exit For
End If
Next WsTabelle
If boNumberPresent = False Then
MsgBox "Das zugehörige Tabellenblatt: " & myInput & " wurde nicht gefunden", vbCritical, "Allg. Hilfe"
Exit Sub 'Eine solche nummer gibt es nicht also Arbeit beenden
End If
End If
'Hier der weitere Code sofern nötig der sich noch um Ding auf "Angebotsliste kümmert
End Sub
Edit: Ich hatte noch etwas geändert und es passt jetzt. Super! Vielen Vielen Dank. :)
Die Range
FindData = Application.Match(FindData, Worksheets(myTab).Range("F3:F102"), 0)
hatte ich auch angepasst, da es A3:A102 ist. Trotzdem bleibt der beschriebene Fehler, dass nichts gefunden wird.
Super, schonmal vielen Dank.
Leider ist es nicht ganz korrekt, aber war mein Fehler. Die Angebotsnummer besteht nicht nur aus Zahlen, sondern auch aus Buchstaben (AN19001 z.b.). Dementsprechend heißt das gesuchte Tabellenblatt AN19001.
If Information.IsNumeric(myInput) Then
FindData = Conversion.CDec(myInput)
Else
MsgBox "Es wurde keine Zahl eingegeben", vbCritical, "Allg. Hilfe"
Exit Sub
End If
habe ich dementsprechend entfernt. Jedoch gibt er dann überall die Meldung " Die Angebotsnummer XXX wurde nicht gefunden" zurück, auch wenn die Tabelle existiert (z.b. AN19001) existiert. Ich weiß der Fehler liegt bei dem o.g. Zitat, aber wie müsste ich Sie anpassen?
Gruß
Bei mir funktioniert dies hier bestens: Ich habe das Tabellenblatt "Angebotsliste" angelegt und ein weiteres Blatt "An123". Auf der Angebotsliste Seite habe ich An123 in die Zeile A12 geschreiben.
Die Inputbox liefert eine Anwort zurück, die VBA als "textstring" interpretiert. Sollte also die Angebots nummer auf dem Excelblatt eine "Zahl" sein finden sich die Dinge nicht. Bei der Überprüfung der zu löschenden Seite kann es ähnlich sein.
In diesem Zusammenhang ist es also wichtig, dass man mit dem richtigen "Datenformat", welches am besten zusammenpasst sucht. Wenn es Misch-Formate Zahlen, Text, Text+Zahl geben kann sollte man jede Zahl zunächst in Text wandeln damit alles ohne Ausnahme funktioniert.
Sub Angebot_loeschen2()
Dim myInput
Dim FindData
Dim zelle As Range
Dim WsTabelle As Worksheet
Dim boNumberPresent As Boolean
Const myTab = "Angebotsliste"
myInput = InputBox("Bitte geben Sie die Nummer an.", "Datenpr?fung")
FindData = Application.Match(myInput, Worksheets(myTab).Range("A3:A102"), 0)
If IsError(FindData) Then
MsgBox "Die Angebotsnummer: " & myInput & " wurde nicht gefunden."
Else
boNumberPresent = False 'Annahme dass eine solche nummer nicht existiert VOR der Schleife
For Each WsTabelle In Sheets
If (WsTabelle.Name) = myInput Then
Worksheets(myTab).Range("B" & FindData + 2).Value = "erledigt"
Application.DisplayAlerts = False
Worksheets(myInput).Delete
Application.DisplayAlerts = True
MsgBox "Die Angebotsnummer: " & myInput & " wurde als erledigt gespeichert und gelöscht."
boNumberPresent = True
Exit For
End If
Next WsTabelle
If boNumberPresent = False Then
MsgBox "Das zugehörige Tabellenblatt: " & myInput & " wurde nicht gefunden", vbCritical, "Allg. Hilfe"
Exit Sub 'Eine solche nummer gibt es nicht also Arbeit beenden
End If
End If
'Hier der weitere Code sofern nötig der sich noch um Ding auf "Angebotsliste kümmert
End Sub
ok ok, dumm gewesen... Habe es mit
sheets("Tabelle1").select umgangen. Manchesmal ist es leichter als man denkt :D
So hab ich es auch, wie schon gesagt funktioniert. :)
Vielen Dank nocheinmal.
Aber eine kleine Frage noch. Wie verhindere ich, dass beim erstellen vom Tabellenblatt nicht darauf gesprungen wird. Hab es mit
Application.ScreenUpdating = False
Application.ScreenUpdating = True
versucht. Das erstellte Blatt wird direkt ausgeblendet und trotzdem springt Excel an die letzte Tabelle.
Gruß
'Achtung keine Fehlerbehandlung dabei. Stimmt der BlattName nicht stürzt das Makro ab.
==============
Public Sub myTest()
Dim myInput
myInput = InputBox("Lösche Blatt..", "Tabellenblatt löschen")
Application.DisplayAlerts = False 'Verhindert die exceleigene Nachfrage "Wirklich löschen?"
Worksheets(myInput).Delete
Application.DisplayAlerts = True
End Sub
For i = 0 to Worksheets.Count
If Worksheets(i).Name = myInput then
'Hier den Löschbefehl
Exit for
end if
end if
Schonmal vielen Dank, nur leider bin ich was dies angeht etwas blöd. Kannst du dies mal korrigieren?
Sub Angebot_loeschen()
Dim myInput
Dim FindData
Dim zelle As Range
Const myTab = "Angebotsliste"
myInput = InputBox("Bitte geben Sie die Nummer an.", "Datenpr?fung")
If myInput <> "" Then
FindData = Application.Match(myInput, Worksheets(myTab).Range("A3:A102"), 0)
If IsError(FindData) Then
MsgBox "Die Angebotsnummer: " & myInput & " wurde nicht gefunden."
Else
Worksheets(myTab).Range("F" & FindData + 2).Value = "erledigt"
For i = 0 To Worksheets.Count
If Worksheets(i).Name = myInput Then
Application.DisplayAlerts = False
Worksheets(myInput).Delete
Application.DisplayAlerts = True
Exit For
MsgBox "Die Angebotsnummer: " & myInput & " wurde als erledigt gespeichert und geloescht. "
End If
End If
Set wsNew = Nothing
End Sub
Vielen Dank :)
Nach "Exit For" darf nichts mehr stehen.
myInput ist ein "Blattname". Ich denke mal keine Angebotsnummer.
Die Aufgabe begann damit "ein Blatt zu löschen" nun versuchst du die Angebotsnummer zu löschen:
Worksheets(myInput).Delete 'Hier sind wohl CopyPaste fehler passiert.
Die Angebotsnummer ist mit dem Namen des Tabellenblattes identisch. Ich möchte, dass wenn man die Angebotsnummer in der Input eingibt, dieses in der Liste als erledigt markiert wird und das Tabellenblatt mit der Angebotsnummer gelöscht wird.
Leider bekomme ich es auch mit der Änderung von "Exit For" nicht hin.
mmhh OK.
Diese Zeile macht dann wohl aber wenig Sinn:
Worksheets(myTab).Range("F" & FindData + 2).Value = "erledigt"
Erst was in die Zelle schreiben und anschließend das ganze Blatt löschen ?!
Nein, myTab ist eine andere Zelle.
Z.B.: Ich schreibe beim Input in Tabelle 1 die Angebotsnummer. Dabei wird in Tabelle 2 das Wort erledigt geschrieben und Tabelle 3 (Angebot) wird gelöscht.
Es macht schon Sinn :) nur leider hilft mir das nicht bei der Antwort :)
Test mal nur dies. Achte darauf, dass ein Blatt und auch die Auftragnummers vorhanden ist. Um Fehlertorleranz kpümmert man sich im Anschluss an die "positive" Funktion.
Sub Angebot_loeschen()
Dim myInput
Dim FindData
Dim zelle As Range
Const myTab = "Angebotsliste"
myInput = InputBox("Bitte geben Sie die Nummer an.", "Datenprüfung")
If myInput <> "" Then
FindData = Application.Match(myInput, Worksheets(myTab).Range("A3:A102"), 0)
If IsError(FindData) Then
MsgBox "Die Angebotsnummer: " & myInput & " wurde nicht gefunden."
Else
Worksheets(myTab).Range("F" & FindData + 2).Value = "erledigt"
Application.DisplayAlerts = False
Worksheets(myInput).Delete
Application.DisplayAlerts = True
End If
End Sub
In dem Code sagt er, dass ein If ohne If End ist. Habe daher ein End If gesetzt.
Application.DisplayAlerts = True
End If
End If
End Sub
Dann funktioniert die Löschung des Tabellenblattes und auf es wird "erledigt" angezeigt.
@IchMalWiderXY Wenn du magst, können wir uns nun um
Um Fehlertorleranz kpümmert man sich im Anschluss an die "positive" Funktion.
kümmern. :)
Zwei Dinge müssen überprüft werden. Die Eingabe im Input Feld. Dies muss einem wirklich vorhandenen Tabellenblattnamen entsprechen.
Google: VBA Sheets iterieren
Als zweites ist in deinem dynamischen Range ggf keine Zahl in dieser "G9" Zelle.
Hier musst du also zunächst prüfen, ob es wirklich eine Zahl ist.
If Worksheetfunction.Isnumeric(Zelle)=true then
else
'Hier die Fehlerbehandlung. Ggf MsgBox.
end if
Kann ich denn die Prüfung, ob das Tabellenblatt existiert nach der Prüfung (ob der gesuchte Wert in der Range ist) einfügen.
If IsError(FindData) Then
MsgBox "Die Angebotsnummer: " & myInput & " wurde nicht gefunden."
Else
Sprich nach dem Else. So hätte ich ja zwei Abfragen. "Ob es in der Range ist und wenn ja, ob es existiert. " Jedoch müsste in der "VBA Sheets iterieren auch ein Else sein, oder?
Aber der Zelleninhalt von G9 bzw. G10 ist doch für dieses Makro unrelevant.
Gruß
Im ersten Schritt sollte
On Error goto MyExeptionHandler
am Beginn erstellt werden.
Schau dir hier mal VBA Beispiele (Google) an.
Dieses Error Handling kann sich um alles kümmern was man nicht bedacht hat.
Für die Eingaben und Daten in deinem Sheet die Einfluss auf den Ablauf haben, der immer stabil funktionieren soll musst du dich kümmern, damit der Anwender einen Hinweis bekommt.
Stelle sicher, dass nach einem erkannten Fehler in Nachgang NICHTS mehr ausgeführt wird, was ggf zum rest des Makro Ablaufes gehört.
Also ein "Exit Sub" (oder Exit Function) ist häufig zusätzlich angebracht .
Ich habe anhand von Google etwas zusammengebastelt.
Sub Angebot_loeschen2()
Dim myInput
Dim FindData
Dim zelle As Range
Dim tbl As TableDef
Const myTab = "Angebotsliste"
myInput = InputBox("Bitte geben Sie die Nummer an.", "Datenpr?fung")
If myInput <> "" Then
For Each tbl In CurrentDB.TabeleDefs
If tbl.Name = myInput Then
Worksheets(myTab).Range("F" & FindData + 2).Value = "erledigt"
Application.DisplayAlerts = False
Worksheets(myInput).Delete
Application.DisplayAlerts = True
Else
MsgBox "Die Angebotsnummer: " & myInput & " wurde nicht gefunden."
End If
End If
Next tbl
End Sub
Leider gibt er den Fehler "Benutzerdefinierter Typ nicht definiert" wieder.
Wäre alternativ eine andere Funktion besser oder kann man die obige noch überarbeiten? Oder ist es ein komplett falscher Ansatz?
Hier z.B. alternativ die andere?
Dim i As Integer
For i = 1 To Worksheets.Count
If Worksheets(i).Name =myInput Then .....
Next i
End Sub
Gruß
Bitte mache dies so: "Herber" Seite ist im übrigen eine gute Hilfe für viele typischen Implementierungen.
https://www.herber.de/forum/archiv/1176to1180/1178668_Alle_Tabellenblaetter_mit_Schleife_durchlaufen.html
Dies hatte ich auch schon gesehen, Dankeschön. Ich habe es jetzt wie folgt gemacht. Es gibt zwar kein Abbruch bzw. Fehler aber die Abbruch MSGBox wird öfter abgespielt (So häufig wie es Tabellenblätter gibt). Dieser Fehler passiert wenn die Tabelle nicht existiert aber auch wenn Sie existiert. Ich habe schon versucht den "Else"Pfad und die "Next WsTabelle" umzustellen, aber dann gibt es Fehler beim Debuggen.
Zudem wird auch nicht mehr "erledigt" unter der Tabelle Angebotsliste eingetragen.
//Edit: Muss für das Problem mit dem Erledigen "finddate" durch "WsTabelle" ersetzt werden?
Gruß
Sub Angebot_loeschen2()
Dim myInput
Dim FindData
Dim zelle As Range
Dim WsTabelle As Worksheet
Const myTab = "Angebotsliste"
myInput = InputBox("Bitte geben Sie die Nummer an.", "Datenpr?fung")
For Each WsTabelle In Sheets
If (WsTabelle.Name) = myInput Then
Worksheets(myTab).Range("F" & FindData + 2).Value = "erledigt"
Application.DisplayAlerts = False
Worksheets(myInput).Delete
Application.DisplayAlerts = True
MsgBox "Die Angebotsnummer: " & myInput & " wurde als erledigt gespeichert und gel?scht."
Else
MsgBox "Es wurde kein Angebot mit der Angebotsnummer: " & myInput & " gefunden."
End If
Next WsTabelle
End Sub
Den else Pfad würde ich bleiben lassen. Ganz am Ende kommst du doch zum Löschen (oder nicht) Merke Dir einfach, dass Du
Dim ErrorHappened as boolean
ErrorHappened = True 'VOR der Schleife
Im Positiven IF Fall:
ErrorHappened = FALSE.
Nach der Schleifen prüfen
If ErrorHappened = TRUE then
Es ist hier nach wie vor auf TRUE, wenn das Blatt nicht existiert hat.
End if
Vielen Dank für deine Hilfe aber ich verstehe es alles nicht und das ist mir auch zu blöd. Es ist hier verschwendete Zeit. Das ist es schon gar nicht mehr wert und macht kein Spaß.
Wieviel Aufwand man in das Error Management einbringt hängt auch davon a wie viele mögliche Nutzer es gibt und ob diese solche Anwendungsfehler überhaupt machen würden. Wenn nur du selbst es verwendest dann braucht es normalerweise keine Fehlerbehandlung. Damit ggf jedes Programm mit der positiven Funktionalität so einfach wie möglich lassen. Ansonsten noch viel Erfolg beim erweitern deiner VBA Kenntnisse. Wir haben alle mal angefangen ;-)
Vielen Dank für deine bisherige Hilfe und ich weiß es auch wirklich sehr zu schätzen. Aber es ist wirklich sehr frustrierend, wenn man nicht weiter kommt. Die Tabelle ist lediglich für mein Stiefvater, jedoch weil er absolut keine Ahnung hat möchte ich es idiotensicher machen.
Es ist sicherlich nur eine kleine Änderung, aber du machst es mir wirklich schwer :/
Es muss ja lediglich geprüft werden, ob das Blatt existiert
ah, super. Ich hatte: Worksheets("myInput").Delete, daher ging es nicht. Vielen Dank. Die Abfrage, ob die Eingabe stimmt passiert schon :)
Ich hatte gerade noch einen kleinen Fehler bemerkt. Wie würde ich denn abfragen, ob die Tabelle existiert?