Anzeige
Archiv - Navigation
1824to1828
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

alle leeren Zellen der Spalte löschen

alle leeren Zellen der Spalte löschen
21.04.2021 09:53:56
Sandra
Hallo zusammen,
ein Teil von dem Makro, bei dem mir vor einiger Zeit geholfen wurde hängt aktuell bei: .SpecialCells(xlCellTypeBlanks).EntireRow.Delete shift:=xlShiftUp
Der Code funktioniert einwandfrei, es hängt sich nur in dem Moment nachdem es die Zellen gelöscht hat (die nicht dem vorgegebenem Wert entsprechen) und dann auch die gesamte Zeile dazu löschen soll.
Kann mir jemand dabei helfen?
Oder hat vielleicht einen anderen Lösungsansatz, dass es dann auf einmal alle leeren Zeilen mit dieser leeren Zelle (Filter ist schon vorhanden) löscht - würde wahrscheinlich auch zeitlich schneller durchlaufen?

Sub CleanUp_Protokoll(wks As Worksheet, ByVal strSuch As String)
Dim Zeile As Long, Zeile_1 As Long, Zeile_L As Long
Dim bolLoeschen As Boolean
Zeile_1 = 2 '3 als erste Zeile mit Name ggf. anpassen
Application.ScreenUpdating = False
With wks
Zeile_L = .Cells(.Rows.Count, 3).End(xlUp).Row
.Unprotect Password:="Test"  'erforderlich falls Blatt geschützt ist
'abweichende Namen in den Zellen in Spalte C löschen
For Zeile = Zeile_1 To Zeile_L
If .Cells(Zeile, 3)  strSuch Then
.Cells(Zeile, 3).ClearContents
bolLoeschen = True
End If
Next
If bolLoeschen = True Then
With .Range(.Cells(Zeile_1, 3), .Cells(Zeile_L, 3))
.SpecialCells(xlCellTypeBlanks).EntireRow.Delete shift:=xlShiftUp
End With
End If
.Protect Password:="Test"  'erforderlich falls Blatt geschützt war
End With
Application.ScreenUpdating = True
End Sub
Ich würde mich über eure Hilfe freuen!
Vielen Dank!

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: alle leeren Zellen der Spalte löschen
21.04.2021 12:16:17
Daniel
HI
Zeilen löschen mit Bedinung mach ich immer so:
1. kennzeichne mit einer Formel am Tabellenende alle Zeilen die gelöscht werden müssen mit 0 und die die stehenbleiben müssen mit der Zeilennummer
2. schreibe in die Überschriftenzeile der Hilfsspalte ebenfalls die 0
3. entferne dann die Zeilen mit 0 unterhalb der Überschrift mit der Menüfunktion DATEN - DATENTOOLS - DUPLIKATE ENTFERNEN mit der Hilfsspalte als Kriterium und der Einstellung "keine Überschrift"
damit würde dein Makro so aussehen:

with wks.UsedRange
with .Columns(.Columns.Count + 1)
.FormulaR1C1 = "=IF(RC3=""" & suchStr & """,Row(),0)"
.Cells(1, 1).Value = 0
.EntireRow.RemoveDuplicates .Column, xlno
.ClearContents
end with
end with
das funktioniert sehr schnell auch mit größeren Datenmengen.
Gruß Daniel
Anzeige
bei leerer Zelle Zeile löschen
21.04.2021 13:51:25
Sandra
Hallo Daniel,
vielen Dank für deine Antwort. Bei mir funktioniert es noch nicht... wo muss ich denn dein Code in mein Makro einfügen?
Vorher wird ja ein Wert bestimmt, und alle anderen soll es löschen, allerdings bleibt es bei mir der gewünschte Wert übrig und viele leere Zellen, genau diese möchte samt ganzer Zeile entfernen.
AW: bei leerer Zelle Zeile löschen
21.04.2021 14:00:24
Daniel
naja anstelle des bisherigen Codes.
den Blattschutz ein/aus musst du ggf übernehmen.
ich nutze ja auch die Übergabevariablen wks und suchstr.
Gruß Daniel
AW: bei leerer Zelle Zeile löschen
21.04.2021 14:18:57
Sandra
Funktioniert leider nicht.
hier hängt es:
.EntireRow.RemoveDuplicates .Column, xlNo
Anzeige
AW: bei leerer Zelle Zeile löschen
21.04.2021 14:38:07
Daniel
"Funktioniert nicht" ist jetzt nicht besonders aussgagekräftig.
normalerweise gibts ne Fehlermeldung mit Text und Nummer. das wäre das mindeste an Information, was du mitliefern könntest.
wenns keine Fehlermeldung gibt, solltest du zurückmelden, wie sich das "nicht funktionieren" äußert.
der von dir gezeigte Code ist syntaktisch richtig.
also müsste es funktionieren.
Wenn nicht, liegts nicht an dieser Codezeile sondern an was anderem.
was das ist, kann ich dir so aber nicht sagen, weil ich kein Hellseher bin und auch keinen Zugriff auf deinen Rechner habe, um mir dort deine Datei anschauen zu können.
Ist dein Tabellenblatt geschützt und wenn ja, hast du den Schutz aufgehoben?
Gruß Daniel
Anzeige
AW: bei leerer Zelle Zeile löschen
21.04.2021 14:53:20
Sandra
Das stimmt.
Also hier nochmal das ganze Problem:

Sub C_MA_Dateien_speichern_Prot_clean()
Dim strName As String, varOrdner, varDatei, strExt As String
Dim Zeile As Long
Dim wkb As Workbook
Dim wkbMA As Workbook
Set wkb = ActiveWorkbook
strExt = Mid(wkb.Name, InStrRev(wkb.Name, "."))
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "Bitte Ordner für zu erstellende Dateien auswählen/erstellen"
If .Show = -1 Then
varOrdner = .SelectedItems(1)
Else
Exit Sub
End If
End With
With wkb.Worksheets("A")
'Kürzel-Liste abarbeiten
For Zeile = 5 To 5 ' .Cells(.Rows.Count, 6).End(xlUp).Row  'Startzeile ggf. anpassen.
strName = .Cells(Zeile, 6).Text
varDatei = varOrdner & Application.PathSeparator & "Test" & strName & strExt
wkb.SaveCopyAs varDatei
Set wkbMA = Application.Workbooks.Open(varDatei)
With wkbMA.Worksheets("Eingabe")
.Unprotect Password:="Test" 'Wenn Blatt in Mappe per Passwort geschützt ist, sonst Passwort weglassen
With .Range("D2")
.Value = strName
'   .Locked = True
End With
.Calculate
.Protect Password:="Test"
End With
Call CleanUp_Protokoll(wks:=wkbMA.Worksheets("Protokoll"), strSuch:=strName)
wkbMA.Close savechanges:=True
Next
End With
End Sub

Sub CleanUp_Protokoll(wks As Worksheet, ByVal strSuch As String)
Dim Zeile As Long, Zeile_1 As Long, Zeile_L As Long
Dim bolLoeschen As Boolean
Zeile_1 = 2 '3 als erste Zeile mit Name ggf. anpassen
Application.ScreenUpdating = False
With wks
Zeile_L = .Cells(.Rows.Count, 3).End(xlUp).Row
.Unprotect Password:="Test"  'erforderlich falls Blatt geschützt ist
'abweichende Namen in den Zellen in Spalte C löschen
For Zeile = Zeile_1 To Zeile_L
If .Cells(Zeile, 3)  strSuch Then
.Cells(Zeile, 3).ClearContents
bolLoeschen = True
End If
Next
' Sheets("Protokoll").ListObjects("tab_protokoll").TableStyle = ""
If bolLoeschen = True Then
With .Range(.Cells(Zeile_1, 3), .Cells(Zeile_L, 3))
.SpecialCells(xlCellTypeBlanks).EntireRow.Delete shift:=xlShiftUp
End With
End If
.Protect Password:="Test"  'erforderlich falls Blatt geschützt war
End With
Application.ScreenUpdating = True
End Sub
Und hier hängt es bei .SpecialCells(xlCellTypeBlanks).EntireRow.Delete shift:=xlShiftUp
Anzeige
AW: bei leerer Zelle Zeile löschen
21.04.2021 15:13:29
Daniel
sorry, aber über was reden wir jetzt?
dein altes Makro zum löschen der Zeilen oder mein neues?
du sagtest doch, der Code hängt in der Zeile ".EntireRow.RemoveDuplicates .Column, xlNo"
diese kommt aber in diesen beiden Makros nicht vor.
Gruß Daniel
AW: bei leerer Zelle Zeile löschen
21.04.2021 15:19:33
Yal
Hallo zusammen,
um die Verwirrung vollständig zu machen, bringe ich mein Senf rein ;-)
@Daniel: trotz ausführlichem Code ist der "VBA nur mit Recorder" hier vorhanden.
@Sandra: viel zu aufwändig. Warum markieren und dann löschen?
Der wichtige Trick: beim Löschen immer hinten anfangen, also von unten nach oben oder von rechts nach links. Sonst verhaspelt sich die For-Schleife.
Dein Code würde dann so aussehen:

Sub CleanUp_Protokoll(wks As Worksheet, ByVal strSuch As String)
Dim r ' r für Row
Application.ScreenUpdating = False
wks.Unprotect Password:="Test"
For r = wks.Cells(wks.Rows.Count, 3).End(xlUp).Row To 2 Step -1
If wks.Cells(r, 3)  strSuch Then wks.Cells(r, 3).EntireRow.Delete
Next
wks.Protect Password:="Test"
Application.ScreenUpdating = True
End Sub
Viel Erfolg
Yal
Anzeige
AW: bei leerer Zelle Zeile löschen
21.04.2021 15:26:01
Daniel
naja, wenn "VBA nur mit Recorder", dann erwarte ich eigentlich auch entsprechenden Code.
Wenn der Code aufwendiger ist, dann ist die Selbsteinschätzung als zu niedrig einzustufen.
Ich gehe hier eingentilich davon aus, dass die gezeigten Codes immer vom Fragesteller selbst geschrieben wurden und auch das entsprechende Wissen vorhanden sein muss diesen Code zu verfassen.
Wäre der Code von einer dritten Person verfasst worden, dann wäre ja diese dritte Person der erste Ansprechpartner und nicht ein Forum.
und wenn die angeblich fehlerverursachende Zeile gar nicht im Code vorkommt, dann ist schon was sehr seltsam.
Gruß Daniel
Anzeige
AW: bei leerer Zelle Zeile löschen
21.04.2021 16:28:40
Sandra
Vielen lieben Dank! Jetzt klappt alles, vielen Dank für den Tipp :)
AW: bei leerer Zelle Zeile löschen
21.04.2021 16:40:03
Daniel
RemoveDuplicates lässt sich hervorragend mit dem Recorder aufzeichen, ebenso das Einfügen der Formeln.
die For-Next-Schleife hingegen kann man nicht aufzeichen.
von daher gesehen ist mein Code eigentlich viel besser an den geforderten Level angepasst als deiner.
Gruß Daniel
AW: bei leerer Zelle Zeile löschen
21.04.2021 18:00:13
Yal
Hallo Daniel,
ja, da hast Du recht. So hatte ich es nicht gesehen.
Ich bin meinerseits die Strategie gegangen, den gelieferten Code als Basis zu nehmen, um auf einem "Heimatgefühl" aufzubauen.
Mein erster Ziel: es klappt, zweiter Ziel: der Fragende erweitert seine Fähigkeit. Aber es kommt manchmal vor, dass auf die andere Seite nur das erste zählt.
VG
Yal
Anzeige
AW: bei leerer Zelle Zeile löschen
21.04.2021 20:52:30
Daniel
Im Prinzip hatte ich ja auch den vollständigen Code gepostet, nur halt ohne die Kopfzeilen.
Der hätte auch nur kopiert und anstatt des alten Codes eingefügt werden müssen.
Wenn dann die erste Rückfrage kommt: "Zeile XYZ verursacht ein Problem" und im zweiten Schritt dann der ganze Code gezeigt wird, dann sollte doch der vollständige Code diese Zeile enthalten.
Gruß Daniel

311 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige