Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

Löschen von Inhalten

Betrifft: Löschen von Inhalten von: Dominik
Geschrieben am: 28.07.2014 09:34:59

Hallo Excel-Experten,

ich würde gern eine Ja-Nein-Abfrage per MsgBox über die gesamte Arbeitsmappe durchführen, dass, wenn Inhalte (innerhalb eines variablen Bereichs) gefunden werden, diese gelöscht werden. Heißt, der Bereich ist in jedem Arbeitsblatt gleich aufgebaut, nur die Zeilenanzahl kann variieren. Wenn egal auf welchem Arbeitsblatt ein Eintrag innerhalb dieses Bereiches gefunden wird, soll die MsgBox aufpoppen. Meine Lösung erhält immer den "Laufzeitfehler '13': Typen unverträglich" und markert mir das an dieser Stelle gelb an:

Sub ABC()
Dim WkSh As WorkSheet, Lz As Long

For Each WkSh In ThisWorkbook.Worksheets
    Lz = WkSh.Cells(Rows.Count, "A").End(xlUp).Row
    If WkSh.Range("B4" & ":AH" & Lz - 3).Value <> "" Then
        If MsgBox("In den Tabellen wurden Einträge gefunden." & Chr(13) & Chr(13) & _
        "Sollen diese gelöscht werden?", vbYesNo & 32, "Einträge gefunden") = vbYes Then
            With WkSh.Range("B4" & ":AH" & Lz - 3)
                .ClearContents
                .Interior.ColorIndex = xlNone
            End With
        End If
    End If
Next WkSh

End Sub

Helft mir bitte auf die Sprünge ;)

Gruß Dominik

  

Betrifft: AW: Löschen von Inhalten von: Nepumuk
Geschrieben am: 28.07.2014 09:48:09

Hallo,

die Value-Eigenschaft eines Bereiche gibt ein Array zurück. Ein Array kannst du nur Eintrag für Eintrag abfragen aber nicht mit <> "".

In dem Fall könntest du mit der WorksheetFunction.CountA abfragen ob diese 0 zurück gibt, dann ist der Bereich leer.

Gruß
Nepumuk


  

Betrifft: AW: Löschen von Inhalten von: Dominik
Geschrieben am: 28.07.2014 15:24:29

Hallo Nepumuk,

danke für die Antwort, funktioniert jetzt :D
Hab das so realisiert:

Sub ABC()
Dim WkSh As WorkSheet, Lz As Long

For Each WkSh In ThisWorkbook.Worksheets
    Lz = WkSh.Cells(Rows.Count, "A").End(xlUp).Row
    Set Rn = WkSh.Range("B4" & ":AH" & Lz - 3)
    If Application.WorksheetFunction.CountA(Rn) > 0 Then
        If MsgBox("In den Tabellen wurde(n) " & Application.WorksheetFunction.CountA(Rn) & _
                  " Einträge gefunden." & Chr(13) & Chr(13) & "Sollen diese _
                  gelöscht werden?", 52, "Einträge gefunden") = vbYes Then
            With Rn
                .ClearContents
                .Interior.ColorIndex = xlNone
            End With
        End If
    End If
    Set Rn = Nothing
Next WkSh

End Sub
Aber eine Frage noch, wie kann ich erreichen, dass statt einer MsgBox pro Sheet nur eine einzige MsgBox als Sammelmeldung kommt und bei positiver Antwort auch alle gleichzeitig formatiert?

Gruß Dominik


  

Betrifft: AW: Löschen von Inhalten von: Rudi Maintaire
Geschrieben am: 28.07.2014 16:07:58

Hallo,

Sub ABC()
  Dim WkSh As Worksheet, Lz As Long, Rn As Range
  Dim oRange As Object, oItem As Object, lCount As Long
  Set oRange = CreateObject("Scripting.Dictionary")
  For Each WkSh In ThisWorkbook.Worksheets
    With WkSh
      Lz = .Cells(Rows.Count, "A").End(xlUp).Row
      Set Rn = .Range(.Cells(4, 2), .Cells(Lz - 3, 34))
    End With
    If Application.WorksheetFunction.CountA(Rn) > 0 Then
      oRange(Rn) = 0
      lCount = lCount + Application.WorksheetFunction.CountA(Rn)
    End If
    Set Rn = Nothing
  Next
  If oRange.Count Then
    If MsgBox("In den Tabellen wurde(n) " & lCount & _
      " Einträge gefunden." & Chr(13) & Chr(13) _
        & "Sollen diese gelöscht werden?", 52, "Einträge gefunden") = vbYes Then
      For Each oItem In oRange
        With oItem
          .ClearContents
          .Interior.ColorIndex = xlNone
        End With
      Next oItem
    End If
  End If
End Sub

Gruß
Rudi


  

Betrifft: AW: Löschen von Inhalten von: Dominik
Geschrieben am: 28.07.2014 17:58:37

Hi Rudi,

riesiges Dankeschön! Läuft einwandfrei, bin sehr zufrieden :D

Gruß Dominik


  

Betrifft: AW: Löschen von Inhalten von: Dominik
Geschrieben am: 29.07.2014 11:59:07

Hallo nochmal,

ich hab noch eine Sache, von der ich nicht erwartet habe, dass es so große Probleme bereiten würde. Es geht darum, dass wenn im genannten Bereich eine Zelle farbig markiert wurde (von Hand), das diese ebenfalls gelöscht werden, auch wenn kein Inhalt existiert. Die Sache ist nämlich, das nicht immer Text in den Tabellenblättern steht. Ein weiterer Knackpunkt ist, das die Farbe egal ist, dadurch fehlt mir mit meinem Minimalisten-Wissen ein Farbindex (bei "(größer-zeichen) 0" liefert er mir etwas Falsches). Ich bekomme es jedenfalls nicht mal hin, das Makro für 1 Tabellenblatt zum laufen zu bekommen...

Gruß Dominik


  

Betrifft: AW: Löschen von Inhalten von: Rudi Maintaire
Geschrieben am: 29.07.2014 15:02:21

Hallo,
sind die Inhalte feste Werte (keine Formeln)?

        With oItem.Specialcells(xlCellTypeConstants)
          .ClearContents
          .Interior.ColorIndex = xlNone
        End With

Gruß
Rudi


  

Betrifft: AW: Löschen von Inhalten von: Dominik
Geschrieben am: 29.07.2014 16:29:59

Hi Rudi,

Danke für die Antwort, aber das hab ich nicht gemeint. Es ging mir darum, dass es unter Umständen im gesamten Bereich keinen Wert in einer Zelle gibt (weder Konstante noch Formel), aber einige Zellen farbig markiert wurden. Das wollte ich im selben Zug überprüfen und in der MsgBox mit anzeigen lassen. So in der Richtung:

Dim cell As Range, Rn As Range
Dim i As Integer

i = 0
For Each cell In Rn
    If cell.Interior.ColorIndex > 0 Then i = i + 1
Next cell
If MsgBox("In den Tabellen wurde(n) " & lCount + i & " Einträge gefunden." _
          & Chr(13) & Chr(13) & "Sollen diese unwiderruflich gelöscht werden?", _
          52, "Einträge gefunden") = vbYes Then
    With Rn
       .Interior.ColorIndex = xlNone
    End With
End if
Sowas in der Richtung für jedes Arbeitsblatt. Diese "(größer) 0"-Abfrage funktioniert übrigens auch nicht. Geht nur wenn ich einen festen Farbindex vorgebe.

Gruß Dominik


  

Betrifft: AW: Löschen von Inhalten von: Rudi Maintaire
Geschrieben am: 29.07.2014 17:12:39

Hallo,
If cell.Interior.ColorIndex <> xlNone Then

Gruß
Rudi


  

Betrifft: AW: Löschen von Inhalten von: Dominik
Geschrieben am: 30.07.2014 11:40:17

Hallo Rudi,

für ein Tabellenblatt bekomm ichs jetzt hin, aber nur wenn ich die MsgBox nach der Abfrage "cell.Interior.ColorIndex <> xlNone" aufrufe. Dass die MsgBox nur aufpoppt WENN er was findet klappt nicht, zumindest nicht so:

Dim Farbe As Range
Dim n As Integer
n = 0
For Each Farbe In Rn
    If Farbe.Interior.ColorIndex <> xlNone Then n = n + 1
        If MsgBox("In den Tabellen wurde(n) " & n & " Einträge gefunden." & _
                  Chr(13) & Chr(13) & "Sollen diese _gelöscht werden?", _
                  52, "Einträge gefunden") = vbYes Then
            With Rn
                .Interior.ColorIndex = xlNone
            End With
        End If
    End If
Next Farbe

Ich bin außerdem überfragt wie ich diesen Code in den bestehenden einfügen kann, um wie gesagt Zellinhalt-Abfrage und Hintergrundfarbe-Abfrage in einer MsgBox zu kombinieren. Wenn ich im folgenden Code einfach per "Or" eine weitere Bedingung einfüge klappts jedenfalls nicht.
Set oRange = CreateObject("Scripting.Dictionary")
For Each WkSh In ThisWorkbook.Worksheets
    With WkSh
        Ez = 4
        Lz = .Cells(Rows.Count, "A").End(xlUp).Row
        Set Rn = .Range("B" & Ez & ":AH" & Lz - 3)
    End With
    If Application.WorksheetFunction.CountA(Rn) > 0 Then
        oRange(Rn) = 0
        lCount = lCount + Application.WorksheetFunction.CountA(Rn)
    End If
    Set Rn = Nothing
Next WkSh
If oRange.Count = 1 Then
    If MsgBox("In den Tabellen wurde " & lCount & " Eintrag gefunden." & Chr(13) & Chr(13) & _
              "Soll dieser unwiderruflich gelöscht werden?", 52, "Einträge gefunden") = vbYes 
              Then
        For Each oItem In oRange
            With oItem.Cells
                .ClearContents
                .Interior.ColorIndex = xlNone
            End With
        Next oItem
     End If
ElseIf oRange.Count > 1 Then
    If MsgBox("In den Tabellen wurden " & lCount & " Einträge gefunden." & Chr(13) & Chr(13) _
              & "Sollen diese unwiderruflich gelöscht werden?", 52, "Einträge gefunden") _
              = vbYes Then
        For Each oItem In oRange
            With oItem.Cells
                .ClearContents
                .Interior.ColorIndex = xlNone
            End With
        Next oItem
     End If
End If

Und Danke nochmal für deine Hilfe

Gruß Dominik


 

Beiträge aus den Excel-Beispielen zum Thema "Löschen von Inhalten"