Excel Tabellenblatt per Input-Abfrage löschen?

3 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet
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

RobinM66 
Beitragsersteller
 12.11.2019, 18:35

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ß

0
RobinM66 
Beitragsersteller
 12.11.2019, 18:42

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.

0
RobinM66 
Beitragsersteller
 12.11.2019, 18:52

Edit: Ich hatte noch etwas geändert und es passt jetzt. Super! Vielen Vielen Dank. :)

0

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

RobinM66 
Beitragsersteller
 12.11.2019, 19:08

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ß

0
RobinM66 
Beitragsersteller
 12.11.2019, 19:14

ok ok, dumm gewesen... Habe es mit

sheets("Tabelle1").select umgangen. Manchesmal ist es leichter als man denkt :D

1

'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


RobinM66 
Beitragsersteller
 03.11.2019, 11:35

ah, super. Ich hatte: Worksheets("myInput").Delete, daher ging es nicht. Vielen Dank. Die Abfrage, ob die Eingabe stimmt passiert schon :)

1
RobinM66 
Beitragsersteller
 03.11.2019, 12:07

Ich hatte gerade noch einen kleinen Fehler bemerkt. Wie würde ich denn abfragen, ob die Tabelle existiert?

1
IchMalWiederXY  03.11.2019, 17:56
@RobinM66

For i = 0 to Worksheets.Count
  If Worksheets(i).Name = myInput then
       'Hier den Löschbefehl 
      Exit for
  end if
 end if 

0
RobinM66 
Beitragsersteller
 03.11.2019, 18:09
@IchMalWiederXY

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 :)

0
IchMalWiederXY  03.11.2019, 18:14
@RobinM66

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.

0
RobinM66 
Beitragsersteller
 03.11.2019, 18:20
@IchMalWiederXY

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.

0
IchMalWiederXY  04.11.2019, 12:55
@RobinM66

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 ?! 

0
RobinM66 
Beitragsersteller
 04.11.2019, 16:05
@IchMalWiederXY

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 :)

0
IchMalWiederXY  04.11.2019, 17:45
@RobinM66

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

0
RobinM66 
Beitragsersteller
 04.11.2019, 18:50
@IchMalWiederXY

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.

0
RobinM66 
Beitragsersteller
 07.11.2019, 16:29
@IchMalWiederXY

@IchMalWiderXY Wenn du magst, können wir uns nun um

Um Fehlertorleranz kpümmert man sich im Anschluss an die "positive" Funktion.

kümmern. :)

0
IchMalWiederXY  07.11.2019, 20:57
@RobinM66

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 

0
RobinM66 
Beitragsersteller
 07.11.2019, 23:22
@IchMalWiederXY

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ß

0
IchMalWiederXY  08.11.2019, 09:31
@RobinM66

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 .

0
RobinM66 
Beitragsersteller
 08.11.2019, 12:42
@IchMalWiederXY

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ß

0
RobinM66 
Beitragsersteller
 08.11.2019, 14:16
@IchMalWiederXY

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
0
IchMalWiederXY  08.11.2019, 17:50
@RobinM66

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       

0
RobinM66 
Beitragsersteller
 09.11.2019, 13:01
@IchMalWiederXY

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ß.

0
IchMalWiederXY  11.11.2019, 21:39
@RobinM66

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 ;-)

0
RobinM66 
Beitragsersteller
 12.11.2019, 16:18
@IchMalWiederXY

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

0