125 Aufrufe
Gefragt in Tabellenkalkulation von revanchist Mitglied (210 Punkte)
Hallo in die Expertenrunde

vorhanden ist ein Exceldatei mit einem Exceltabellenblatt benannt Sheets("0-bereinigt").
In Zeile 1 - 3 sind Informationen in den Spaltenköpfen, welche hier nicht von Bedeutung sind. Diese Informationen gibt es auch nur dort, wo in den Zeilen 4 bis 500 auch tatsächlich Daten stehen.
Die Spaltenanzahl kann variieren von 1 bis max 365. Die Zeilenanzahl ist auch in jeder Spalte unterschiedlich mit Werten belegt.
Es sind ausschließlich Zahlenwerte  von 0 bis max 50 vorhanden.
Die VBA-Routine soll jetzt folgende Aufgabe(n) erledigen:
Alle Zellinhalte mit Wert 0 (also nicht 10, 20, 30, 40 oder 50 und auch nicht nut leer) sollen gelöscht werden.   
Ansschließend soll in der jeweiligen Spalte (wo 0-Werte gelöscht wurden) die verbleibenden Zellen lückenlos nach oben zusammengeschoben werden.

die Routine möchte ich über einen CommandButton auslösen
==>>
Private Sub CommandButton1_Click()
?
?
?
End Sub

8 Antworten

0 Punkte
Beantwortet von beverly_ Experte (3.4k Punkte)
Hi,

Rückfrage: kommen die 0-Werte in den einzelnen Spalten mehrfach vor oder jeweils nur einmalig?

Bis später, Karin
0 Punkte
Beantwortet von
Guten Morgen,

ich würde es in etwa so versuchen, das die Zeilen von unten nach oben durchlaufen werden ist Absicht, denn so sind eventtuell durch das löschen verschobene Zellen schon abgearbeitet und fallen nicht aus dem Raster

Sub Zero()
Dim anzzeilen As Long, anzspalten As Long
Dim i As Long, j As Long

anzzeilen = 20
anzspalten = 10

For j = 1 To anzspalten
    For i = anzzeilen To 5 Step -1
        If Cells(i, j).Value = 0 And Cells(i, j).Value <> "" Then
            Cells(i, j).Select
            Selection.Delete Shift:=xlUp
        End If
    Next
Next

End Sub
0 Punkte
Beantwortet von revanchist Mitglied (210 Punkte)
Hallo Karin

Danke für die schnelle Rückfrage.
Ja in den einzelnen Spalten können mehrfach 0 Einträge stehen. Manchmal direkt untereinander, direkt am Anfang, am Ende oder auch mit größeren Abständen.

Ich habe mal eine Beispiel konstruiert, weiß aber nicht wie ich das Beispiel hier im Forum posten kann.
Entweder als Exceldatei oder als Screenshot - beides möglich.

Ciao der Revanchist
0 Punkte
Beantwortet von beverly_ Experte (3.4k Punkte)
Hi,

gehe auf "Link einfügen" -> Reiter: "Hochladen" - dort kannst du dann eine Datei anhängen. Eine bereitgestellte Beispielmappe ist immer besser als ein Screenshot.

Bis später, Karin
0 Punkte
Beantwortet von revanchist Mitglied (210 Punkte)

Hallo Karin

anbei die Exceldatei zur Veranschaulichung (hoffe dass das mit dem Hochladen klappt)

https://uploadnow.io/files/fWmT8Bx

Ciao der Revanchist

0 Punkte
Beantwortet von beverly_ Experte (3.4k Punkte)
ausgewählt von revanchist
 
Beste Antwort

Hi,

das ist aber nicht der Forums-interne Upload und von fremden Anbietern lade ich keine Dateien herunter, also kann ich nur allgemein antworten - du kannst es mit folgendem Code versuchen (eventuell musst du ihn an deine Bedingungen anpassen):

    Dim lngLetzte As Long
    Dim intLetzte As Long
    Dim lngZeile As Long
    Dim intSpalte As Integer
    Dim rngBereich As Range
    intLetzte = ActiveSheet.Cells.Find(What:="*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
    ' Schleife von Spalte 1 bis zur letzten belegten Spalte
    For intSpalte = 1 To intLetzte
        ' letzte belegte Zeile in laufender Spalte
        lngLetzte = Columns(intSpalte).Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
        ' Schleife von Zeile 4 bis zur letzten belegten Zeile der laufenden Spalte
        For lngZeile = 4 To lngLetzte
            ' in laufender Zelle stehe der wert 0
            If Cells(lngZeile, intSpalte).Text = 0 Then
                ' Bereichs-Variable ist noch leer
                If rngBereich Is Nothing Then
                    ' laufende Zelle in Variable schreiben
                    Set rngBereich = Cells(lngZeile, intSpalte)
                ' Bereichs-Variable ist bereits belegt
                Else
                    ' laufende Zelle zum Bereich hinzufügen
                    Set rngBereich = Union(rngBereich, Cells(lngZeile, intSpalte))
                End If
            End If
        Next lngZeile
        ' Bereichs-Variable ist nicht leer
        If Not rngBereich Is Nothing Then
            ' Zellen in der Spalte löschen
            rngBereich.Delete Shift:=xlUp
            ' Bereichs-Variable leeren
            Set rngBereich = Nothing
        End If
    Next intSpalte

Bis später, Karin

0 Punkte
Beantwortet von
Hallo LET

ich habe die Zeile:  For i = anzzeilen To 5 Step -1 geändert
auf  For i = anzzeilen To 4 Step -1

dann funktioniert das Ganz gut, wenn man sich an die von dir eingetragenen Beschränkungen hinsichtlich Zeilen- und Spaltenanzahl hält - oder diese entsprechend selbst anpasst.

Vielen Dank für deine Bemühungen

Ciao der Revanchist
0 Punkte
Beantwortet von revanchist Mitglied (210 Punkte)
Bearbeitet von revanchist
Hallo Karin

vielen Dank für deinen VBA-Code.
Funktioniert einwandfrei.

Hinweis falls noch jemand die Lösung von Karin benutzen will::
mit Klick auf den Commandbutton wird des öfteren nur eine Spalte bereinigt.
Tipp: Doppelklick auf den CB  und dann saust die Routine durch alle Spalten (bei mir bis zu 365) ohne Anzuhalten !

Das mit dem Hochladen der Beispieldatei ging bei mir nur über diesen Weg.
Egal - deine Routine passt und das Thema konnte so elegant gelöst werden.

Bis zur nächsten Problemlösung

Ciao der Revanchist
...