VBA in Excel - Zellen löschen

  • #1
K

keithy

Guest
Hallo!

???

Ich habe ein sehr umfangreiches Excel-Dokument als Druckversion und daher sind sehr viele leer Zellen in diesem Dokument. Wie kann ich mit einem Makro feststellen, welche Zellen leer sind und sie dann löschen? (würde es gerne per ButtonClick machen)?

Würde mich reisig :D freuen, wenn mir da einer weiter helfen könnte!

Greetings,

Keithy
 
  • #2
Hi keithy,

etwas nähere Angaben sind noch notwendig.
Meinst Du leere Zellen oder leereZeilen ?
Wenn Du leere Zellen meinst, wie sollen die Nachbarzellen verschoben werden ? Nach links oder nach oben aufrücken ?

Soll das Makro nur auf das aktive Blatt (im Vordergrund) oder alle wirken ?

Gruß Matjes :)
 
  • #3
Hi Matjes!

Es sind leere Spalten (senkrecht), die gelöscht werden sollen und die Spalten rechts daneben, sollen nach links verschoben werden.
Und das Makro soll auf alle Blätter wirken (9Stück).
Des weiteren sollen auch Zeilen, die leer sind, gelöscht werden und die Zeilen darunter nach oben verschoben werden.

(Wenn dann noch Spalten da sind, die nur über 10 Zeilen gehen, sollen diese auch gelöscht werden, das ist aber erst mal zweitrangig)

Gruß Keithy :)
 
  • #4
Hi keithy,

der erste Wurf ist fertig. :D

Bevor Du den Makro ausprobierst, mache bitte ein Kopie von deiner Datei. Dann kannst Du immer wieder darauf zurückgreifen. :)

Text hab ich zu den einzelnen Zeilen dazugeschrieben, so dass Du erkennen kannst, was die einzelnen Zeilen bedeuten und gegebenfalls eigene Anpassungen machen kannst.

Probiers erst mal aus. Die Sache mit dem Knopf in der zweiten Runde.

Gruß Matjes :)

Code:
Option Explicit

'----------------------------------------------------------------------
Sub LeerSpaltenUndZeilenAufraeumen()
'In der aktiven Arbeitsmappe alle Blätter aufraeumen:
'- leere Spalten löschen
'- Spalten mit weniger als 10 Einträgen löschen
'- leere Zeilen loeschen

Dim ws As Worksheet

Application.ScreenUpdating = False 'Bildschirm-Aktuallisierung ausschalten

'Für alle Blaetter in der aktiven Mappe
 For Each ws In Worksheets
  ws.Activate
  Call SpaltenLoeschenBeiKleinerWerteanzahl
  Call LeereSpaltenLoeschen
  Call LeereZeilenLoeschen
 Next
 
Worksheets(1).Activate
Application.ScreenUpdating = True 'Bildschirm-Aktuallisierung einschalten
End Sub
'----------------------------------------------------------------------
Private Sub LeereSpaltenLoeschen()
'löscht auf dem aktiven Blatt leere Spalten

'(Fehler 91 bei leerem Tabellenblatt)
On Error GoTo ErrorHandler
 
Dim x As Integer, actColNo As Integer
 'Spaltenanzahl
 actColNo = ActiveSheet.Cells.Find(*, [A1], , , xlByColumns, xlPrevious).Column
 'Fuer alle Spalten
 For x = actColNo To 1 Step -1
  'Wenn keine Zellen mit Wert in der Spalte vorhanden ist -> Spalte loeschen
  If (Application.CountA(Columns(x)) = 0) Then Columns(x).Delete
 Next
Exit Sub
ErrorHandler:
If Err.Number <> 91 Then MsgBox (Unerwarteter Fehler bei 'LeereSpaltenLoeschen')
End Sub
'----------------------------------------------------------------------
Private Sub SpaltenLoeschenBeiKleinerWerteanzahl()
'löscht auf dem aktiven Blatt Spalten,
'die weniger als c_minAnzahlWerte Werte enthalten

'bei weniger als ... Werten in der Spalte wird diese gelöscht
Const c_minAnzahlWerte = 10

'(Fehler 91 bei leerem Tabellenblatt)
On Error GoTo ErrorHandler

Dim x As Integer, WerteAnzahlImBereich As Integer
Dim actColNo As Integer, actRowNo As Integer
 
 actColNo = Cells.Find(*, [A1], , , xlByColumns, xlPrevious).Column
 actRowNo = Cells.Find(*, [A1], , , xlByRows, xlPrevious).Row
 For x = actColNo To 1 Step -1
 WerteAnzahlImBereich = Application.CountA(Range(Cells(1, x), Cells(actRowNo, x)))
  'Wenn keine Zellen mit Wert in der Spalte vorhanden ist -> Spalte loeschen
  If (WerteAnzahlImBereich < c_minAnzahlWerte) Then Columns(x).Delete
 Next
Exit Sub
ErrorHandler:
If Err.Number <> 91 Then MsgBox (Unerwarteter Fehler bei 'SpaltenLoeschenBeiKleinerWerteanzahl')
End Sub
'----------------------------------------------------------------------
Private Sub LeereZeilenLoeschen()
'löscht auf dem aktiven Blatt leere Zeilen

'(Fehler 91 bei leerem Tabellenblatt)
On Error GoTo ErrorHandler

Dim x As Integer, actRowNo As Integer
 
 'Zeilenanzahl
 actRowNo = Cells.Find(*, [A1], , , xlByRows, xlPrevious).Row
 'Fuer alle Zeilen
 For x = actRowNo To 1 Step -1
  'Wenn keine Zelle mit Wert in der Zeile vorhanden ist -> Zeile loeschen
  If (Application.CountA(Rows(x)) = 0) Then Rows(x).Delete
 Next
Exit Sub
ErrorHandler:
If Err.Number <> 91 Then MsgBox (Unerwarteter Fehler bei 'LeereZeilenLoeschen')
End Sub
 
  • #5
Hey Matjes! ;D

Ich danke dir vielmals :-*

Es funktionierte zwar nicht direkt so, wie du es mir geschickt hast, waren noch ein paar kleine Änderungen zu machen, aber es funktioniert jetzt auch auf Buttonklick in einer UserForm.

Sag mal, wie beseitige ich denn, dass die letzten leeren Zeilen da bleiben und nicht gelöscht werden? ???

Gruß Keithy
 
  • #6
Hi keithy,

tausch mal in der Sub LeereZeilenLoeschen
Code:
 actRowNo = Cells.Find(*, [A1], , , xlByRows, xlPrevious).Row
gegen
Code:
 actRowNo = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row
Dann klappts auch mit den letzten leeren Zeilen. :D

Hast Du Lust mir die User-Form zu mailen? Dann kann ich sie mir mal daraufhin anschauen, welche Änderungen notwendig waren.

Gruß Matjes :)
 
  • #7
Hey matjes,

da funktioniert auch so leider nicht. Die letzten Zeieln bleiben leider immer noch bestehen.

???

Wüsstest du vielleicht noch eine andere Lösung?

::)

Würde mich freuen!

Gruß Keithy

:)
 
  • #8
Hi keithy,

das müßte eigentlich funktionieren.

Kannst Du mir eine Beispieldatei mit deiner From/Makro schicken, damit ich das mal genauer verfolgen kann ?

Gruß Matjes :)
 
  • #9
Hi keithy,

hat etwas gedauert bis ich drauf gekommen bin, was falsch läuft. ???

Das Problem mit diesen Phantom-Zellen tritt auf, wenn man spaltenweise Rahmen formatiert und irgendwann eine leere Zelle unterhalb des benutzten Bereiches anklickt. Dann erscheinen beim Ausdruck am Ende der Seite leere umrahmte Zellen. Auch wenn man diese Zeilen löscht, rutschen sie von unten wieder nach (ist halt die ganze Spalte formatiert).

Abhilfe ist den Druckbereich auf die benutzten Zellen festzulegen.

Ich hab das Makro so erweitert, das der Druckbereich automatisch auf den benutzten Bereich reduziert wird.

Gruß Matjes :)

Code:
Option Explicit

'----------------------------------------------------------------------
Sub LeerSpaltenUndZeilenAufraeumen()
'In der aktiven Arbeitsmappe alle Blätter aufraeumen:
'- leere Spalten löschen
'- Spalten mit weniger als 10 Einträgen löschen
'- leere Zeilen loeschen

Dim ws As Worksheet

Application.ScreenUpdating = False 'Bildschirm-Aktuallisierung ausschalten

'Für alle Blaetter in der aktiven Mappe
 For Each ws In Worksheets
  ws.Activate
  Call SpaltenLoeschenBeiKleinerWerteanzahl
  Call LeereSpaltenLoeschen
  Call LeereZeilenLoeschen
  Call DruckbereichAufBenutzteZellenFestlegen
 Next
 
Worksheets(1).Activate
Application.ScreenUpdating = True 'Bildschirm-Aktuallisierung einschalten
End Sub
'----------------------------------------------------------------------
Private Sub DruckbereichAufBenutzteZellenFestlegen()
'legt den Druckbereich für das aktive Blatt auf den Bereich der benutzten Zellen fest
'
'Abhilfe für:
' Sind in einem Excelblatt Rahmen bei markierter Spalte(n) bzw. Zeile(n) angelegt
'(Zellen formatieren -> Rahmen)und danach Zellen unter/neben dem benutzten Bereich
' auf diesen Spale(n)/Zeile(n) angeklickt worden, werden beim Drucken am Ende bzw.
' neben des/dem benutzten Bereich leere umrahmte Zellen ausgedruckt.
'
'(Fehler 91 bei leerem Tabellenblatt)
On Error GoTo ErrorHandler

Dim actColNo As Integer, actRowNo As Integer

 actColNo = ActiveSheet.Cells.Find(*, [A1], , , xlByColumns, xlPrevious).Column
 actRowNo = ActiveSheet.Cells.Find(*, [A1], , , xlByRows, xlPrevious).Row
 Range(Cells(1, 1), Cells(actRowNo, actColNo)).Select
 ActiveSheet.PageSetup.PrintArea = ActiveCell.CurrentRegion.Address

Exit Sub
ErrorHandler:
If Err.Number <> 91 Then MsgBox (Unerwarteter Fehler  & Err.Number & _
              bei 'DruckbereichAufBenutzteZellenFestlegen')
End Sub
'----------------------------------------------------------------------
Private Sub LeereSpaltenLoeschen()
'löscht auf dem aktiven Blatt leere Spalten

'(Fehler 91 bei leerem Tabellenblatt)
On Error GoTo ErrorHandler
 
Dim x As Integer, actColNo As Integer
 'Spaltenanzahl
 actColNo = ActiveSheet.Cells.Find(*, [A1], , , xlByColumns, xlPrevious).Column
 'Fuer alle Spalten
 For x = actColNo To 1 Step -1
  'Wenn keine Zellen mit Wert in der Spalte vorhanden ist -> Spalte loeschen
  If (Application.CountA(Columns(x)) = 0) Then Columns(x).Delete
 Next
Exit Sub
ErrorHandler:
If Err.Number <> 91 Then MsgBox (Unerwarteter Fehler  & Err.Number & _
              bei 'LeereSpaltenLoeschen')
End Sub
'----------------------------------------------------------------------
Private Sub SpaltenLoeschenBeiKleinerWerteanzahl()
'löscht auf dem aktiven Blatt Spalten,
'die weniger als c_minAnzahlWerte Werte enthalten

'bei weniger als ... Werten in der Spalte wird diese gelöscht
Const c_minAnzahlWerte = 10

'(Fehler 91 bei leerem Tabellenblatt)
On Error GoTo ErrorHandler

Dim x As Integer, WerteAnzahlImBereich As Integer
Dim actColNo As Integer, actRowNo As Integer
 
 actColNo = Cells.Find(*, [A1], , , xlByColumns, xlPrevious).Column
 actRowNo = Cells.Find(*, [A1], , , xlByRows, xlPrevious).Row
 For x = actColNo To 1 Step -1
 WerteAnzahlImBereich = Application.CountA(Range(Cells(1, x), Cells(actRowNo, x)))
  'Wenn keine Zellen mit Wert in der Spalte vorhanden ist -> Spalte loeschen
  If (WerteAnzahlImBereich < c_minAnzahlWerte) Then Columns(x).Delete
 Next
Exit Sub
ErrorHandler:
If Err.Number <> 91 Then MsgBox (Unerwarteter Fehler  & Err.Number & _
              bei 'SpaltenLoeschenBeiKleinerWerteanzahl')
End Sub
'----------------------------------------------------------------------
Private Sub LeereZeilenLoeschen()
'löscht auf dem aktiven Blatt leere Zeilen

'(Fehler 91 bei leerem Tabellenblatt)
On Error GoTo ErrorHandler

Dim x As Integer, actRowNo As Integer
 
 'Zeilenanzahl
 actRowNo = Cells.Find(*, [A1], , , xlByRows, xlPrevious).Row
 actRowNo = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row
 'Fuer alle Zeilen
 For x = actRowNo To 1 Step -1
  'Wenn keine Zelle mit Wert in der Zeile vorhanden ist -> Zeile loeschen
  If (Application.CountA(Rows(x)) = 0) Then Rows(x).Delete
 Next
Exit Sub
ErrorHandler:
If Err.Number <> 91 Then MsgBox (Unerwarteter Fehler  & Err.Number & _
              bei 'LeereZeilenLoeschen')
End Sub
 
  • #10
Guten Morgen matjes!

Es ist alles so lieb von dir, dass du dich hinsetzt und dir die Mühe machst, dass so für mich zu programmieren, aber nun, mit dem neuen Quelltext löscht er leider zuviel des Guten, vor allem zu viele Spalten. :-(

Gruß Keithy
 

Anhänge

  • Desktop.jpg
    Desktop.jpg
    181,8 KB · Aufrufe: 34
  • #11
So sieht nun mein Quelltext aus und es funktioniert einfandfrei außer dass es sehr langsam ist, hättest du noch Verbesserungsvorschläge?

Option Explicit

'----------------------------------------------------------------------
Sub LeerSpaltenUndZeilenAufraeumen()
'In der aktiven Arbeitsmappe alle Blätter aufraeumen:
'- leere Spalten löschen
'- Spalten mit weniger als 10 Einträgen löschen
'- leere Zeilen loeschen

Dim ws As Worksheet

'Für alle Blaetter in der aktiven Mappe
For Each ws In Worksheets
ws.Activate
Call SpaltenLoeschenBeiKleinerWerteanzahl
Call LeereSpaltenLoeschen
Call LeereZeilenLoeschen
Next

Worksheets(1).Activate
End Sub
'----------------------------------------------------------------------
Private Sub LeereSpaltenLoeschen()
'löscht auf dem aktiven Blatt leere Spalten

'(Fehler 91 bei leerem Tabellenblatt)
On Error GoTo ErrorHandler

Dim x As Integer, actColNo As Integer
'Spaltenanzahl
actColNo = ActiveSheet.Cells.Find(*, [A1], , , xlByColumns, xlPrevious).Column
'Fuer alle Spalten
For x = actColNo To 1 Step -1
'Wenn keine Zellen mit Wert in der Spalte vorhanden ist -> Spalte loeschen
If (Application.CountA(Columns(x)) = 0) Then Columns(x).Delete
Next
Exit Sub
ErrorHandler:
If Err.Number <> 91 Then MsgBox (Unerwarteter Fehler bei 'LeereSpaltenLoeschen')
End Sub
'----------------------------------------------------------------------
Private Sub SpaltenLoeschenBeiKleinerWerteanzahl()

'löscht auf dem aktiven Blatt Spalten,
'die weniger als c_minAnzahlWerte Werte enthalten

'bei weniger als ... Werten in der Spalte wird diese gelöscht
Const c_minAnzahlWerte = 10

'(Fehler 91 bei leerem Tabellenblatt)
On Error GoTo ErrorHandler

Dim x As Integer, WerteAnzahlImBereich As Integer
Dim actColNo As Integer, actRowNo As Integer

actColNo = Cells.Find(*, [A1], , , xlByColumns, xlPrevious).Column
actRowNo = Cells.Find(*, [A1], , , xlByRows, xlPrevious).Row
For x = actColNo + 10 To 1 Step -1
WerteAnzahlImBereich = Application.CountA(Range(Cells(1, x), Cells(actRowNo, x)))
'Wenn keine Zellen mit Wert in der Spalte vorhanden ist -> Spalte loeschen
Dim i As Integer
Dim del As Boolean
del = False
For i = 1 To actRowNo + 10
If Not Cells(i, x).Value = And Not Cells(i, x).Value = Then
del = False
Exit For
End If
del = True
Next i
If del Then Columns(x).Delete
Next
Exit Sub
ErrorHandler:
If Err.Number <> 91 Then MsgBox (Unerwarteter Fehler bei 'SpaltenLoeschenBeiKleinerWerteanzahl')
End Sub

'----------------------------------------------------------------------
Private Sub LeereZeilenLoeschen()
'löscht auf dem aktiven Blatt leere Zeilen

'(Fehler 91 bei leerem Tabellenblatt)
On Error GoTo ErrorHandler

Dim x As Integer, actRowNo As Integer

'Zeilenanzahl
actRowNo = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row
'Fuer alle Zeilen
For x = actRowNo + 10 To 1 Step -1
'Wenn keine Zelle mit Wert in der Zeile vorhanden ist -> Zeile loeschen
Dim i As Integer
Dim del As Boolean
del = False
For i = 1 To 256
If Not Cells(x, i).Value = And Not Cells(x, i).Value = Then
del = False
Exit For
End If
del = True
Next i
If del Then Rows(x).Delete
'If (Application.CountA(Rows(x)) = 0) Then Rows(x).Delete
Next x
Exit Sub
ErrorHandler:
If Err.Number <> 91 Then MsgBox (Unerwarteter Fehler bei 'LeereZeilenLoeschen')
End Sub
 
  • #12
Hi keithy,

ich lern ja auch etwas ;D - z.B. das mit den leeren Zeilen am Ende - so was sehe ich nicht ??? , da ich für meine Tabellen immer den Druckbereich definiere.

zu deiner Makroversion:
a)
langsam ist sie deshalb, weil Du sehr viele Zellen untersuchst, die keinen Wert enthalten, z.B. 256 Spalten in 'LeereZeilenLoeschen'.
b)
'actRowNo + 10 ' ist ein Notnagel um am Ende der Tabelle leere Zeilen zu löschen, die die Funktion 'Cells.SpecialCells(xlCellTypeLastCell)' nicht erfasst. Besser ist den Druckbereich auf die Zeilen mit Inhalt zu beschränken (siehe DruckbereichAufBenutzteZellenFestlegen). Außerdem verlängert diese Art die Schleifen um 10 Zeilen.


Ich hab noch einen Vorbrenner 'ZellenMitNurBlancsLeeren3' eingefügt. Dieser löscht den Zellinhalt, wenn die Zelle nur Leerzeichen (max. 5) enthält. Dieser läuft am Anfang, so dass man nachfolgend keine Zellen mehr berücksichtigen muß, die nur Leezeichen beinhalten.

'LeereSpaltenLoeschen3' löscht nur wirklich leere Spalten.
In 'SpaltenLoeschenBeiKleinerWerteanzahl' kannst Du über die Konstante 'c_minAnzahlWerte' definieren, wieviel Werte eine Spalte inklusiv Überschrift enthalten muß, damit sie nicht gelöscht wird. Wenn Du Spalten löschen willst, die nur die Überschrift enthalten, gibst Du die Anzahl der Überschriftszeilen an. Wenn Spalten mit weniger als 10 Inhaltszellen (z.B. 1 Überschrift und 9 Werte) gelöscht werden sollen, setzt Du den Wert auf 10. Die Spalten mit 'nur überschrift' bleiben erhalten, wenn man den Wert auf 0 setzt.
Ich habe den Wert auf 1 gesetzt, in der Annahme, dass Du nur Spalten mit 'nur Überschrift' löschen möchtest (In deiner Version von SpaltenLoeschenBeiKleinerWerteanzahl ist kein Zähler für Werte enthalten).
Damit sollte behoben sein, daß der Makro zuviel Spalten löscht. Wenn er immer noch zu viele Spalten löscht, teile mir bitte mit was für Inhalte diese Spalten haben, am besten mit einem Beispiel.


Gruß Matjes ;)

Code:
Option Explicit

'----------------------------------------------------------------------
Sub LeerSpaltenUndZeilenAufraeumen3()
'In der aktiven Arbeitsmappe alle Blätter aufraeumen:
'- leere Spalten löschen
'- Spalten mit weniger als 10 Einträgen löschen
'- leere Zeilen loeschen

Dim ws As Worksheet

Application.ScreenUpdating = False 'Bildschirm-Aktuallisierung ausschalten

'Für alle Blaetter in der aktiven Mappe
 For Each ws In Worksheets
  ws.Activate
  Call ZellenMitNurBlancsLeeren3
  Call LeereSpaltenLoeschen3
  Call SpaltenLoeschenBeiKleinerWerteanzahl3
  Call LeereZeilenLoeschen3
  Call DruckbereichAufBenutzteZellenFestlegen3
 Next
 
Worksheets(1).Activate
Application.ScreenUpdating = True 'Bildschirm-Aktuallisierung einschalten
End Sub
Private Sub ZellenMitNurBlancsLeeren3()
'Zellen finden, die nur 1-5 Leerzeichen enthalten
'und deren Zellinhalt löschen
'
'(Fehler 91 bei leerem Tabellenblatt)
On Error GoTo ErrorHandler

Dim actColNo As Integer, actRowNo As Integer
Dim zelle As Object
Dim ersteAdresse As Variant
 actColNo = ActiveSheet.Cells.Find(*, [A1], , , xlByColumns, xlPrevious).Column
 actRowNo = ActiveSheet.Cells.Find(*, [A1], , , xlByRows, xlPrevious).Row
 With ActiveSheet.Range(Cells(1, 1), Cells(actRowNo, actColNo))
  Set zelle = .Find( , LookIn:=xlValues)
  If Not zelle Is Nothing Then
   ersteAdresse = zelle.Address
   Do
    If ( _
      (zelle.Value =  ) Or _
      (zelle.Value =  ) Or _
      (zelle.Value =   ) Or _
      (zelle.Value =   ) Or _
      (zelle.Value =    ) _
      ) Then
     zelle.Value = 
    End If
    Set zelle = .FindNext(zelle)
   Loop While Not zelle Is Nothing And zelle.Address <> ersteAdresse
  End If
End With
Exit Sub
ErrorHandler:
If Err.Number <> 91 Then MsgBox (Unerwarteter Fehler  & Err.Number & _
              bei 'ZellenMitNurBlancsLeeren')
End Sub
'----------------------------------------------------------------------
Private Sub DruckbereichAufBenutzteZellenFestlegen3()
'legt den Druckbereich für das aktive Blatt auf den Bereich der benutzten Zellen fest
'
'Abhilfe für:
' Sind in einem Excelblatt Rahmen bei markierter Spalte(n) bzw. Zeile(n) angelegt
'(Zellen formatieren -> Rahmen)und danach Zellen unter/neben dem benutzten Bereich
' auf diesen Spale(n)/Zeile(n) angeklickt worden, werden beim Drucken am Ende bzw.
' neben des/dem benutzten Bereich leere umrahmte Zellen ausgedruckt.
'
'(Fehler 91 bei leerem Tabellenblatt)
On Error GoTo ErrorHandler

Dim actColNo As Integer, actRowNo As Integer

 actColNo = ActiveSheet.Cells.Find(*, [A1], , , xlByColumns, xlPrevious).Column
 actRowNo = ActiveSheet.Cells.Find(*, [A1], , , xlByRows, xlPrevious).Row
 Range(Cells(1, 1), Cells(actRowNo, actColNo)).Select
 ActiveSheet.PageSetup.PrintArea = ActiveCell.CurrentRegion.Address

Exit Sub
ErrorHandler:
If Err.Number <> 91 Then MsgBox (Unerwarteter Fehler  & Err.Number & _
              bei 'DruckbereichAufBenutzteZellenFestlegen')
End Sub
'----------------------------------------------------------------------
Private Sub LeereSpaltenLoeschen3()
'löscht auf dem aktiven Blatt leere Spalten

'(Fehler 91 bei leerem Tabellenblatt)
On Error GoTo ErrorHandler
 
Dim x As Integer, actColNo As Integer
 'Spaltenanzahl
 actColNo = ActiveSheet.Cells.Find(*, [A1], , , xlByColumns, xlPrevious).Column
 'Fuer alle Spalten
 For x = actColNo To 1 Step -1
  'Wenn keine Zellen mit Wert in der Spalte vorhanden ist -> Spalte loeschen
  If (Application.CountA(Columns(x)) = 0) Then Columns(x).Delete
 Next
Exit Sub
ErrorHandler:
If Err.Number <> 91 Then MsgBox (Unerwarteter Fehler  & Err.Number & _
              bei 'LeereSpaltenLoeschen')
End Sub
'----------------------------------------------------------------------
Private Sub SpaltenLoeschenBeiKleinerWerteanzahl3()
'löscht auf dem aktiven Blatt Spalten,
'die weniger als c_minAnzahlWerte Werte enthalten

'bei weniger als ... Werten in der Spalte wird diese gelöscht
'(inklusiv Überschrift)
Const c_minAnzahlWerte = 1

'(Fehler 91 bei leerem Tabellenblatt)
On Error GoTo ErrorHandler

Dim x As Integer, WerteAnzahlImBereich As Integer
Dim actColNo As Integer, actRowNo As Integer
 
 actColNo = Cells.Find(*, [A1], , , xlByColumns, xlPrevious).Column
 actRowNo = Cells.Find(*, [A1], , , xlByRows, xlPrevious).Row
 For x = actColNo To 1 Step -1
 WerteAnzahlImBereich = Application.CountA(Range(Cells(1, x), Cells(actRowNo, x)))
  'Wenn keine Zellen mit Wert in der Spalte vorhanden ist -> Spalte loeschen
  If (WerteAnzahlImBereich < c_minAnzahlWerte) Then Columns(x).Delete
 Next
Exit Sub
ErrorHandler:
If Err.Number <> 91 Then MsgBox (Unerwarteter Fehler  & Err.Number & _
              bei 'SpaltenLoeschenBeiKleinerWerteanzahl')
End Sub
'----------------------------------------------------------------------
Private Sub LeereZeilenLoeschen3()
'löscht auf dem aktiven Blatt leere Zeilen

'(Fehler 91 bei leerem Tabellenblatt)
On Error GoTo ErrorHandler

Dim x As Integer, actRowNo As Integer
 
 'Zeilenanzahl
 actRowNo = Cells.Find(*, [A1], , , xlByRows, xlPrevious).Row
 actRowNo = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row
 'Fuer alle Zeilen
 For x = actRowNo To 1 Step -1
  'Wenn keine Zelle mit Wert in der Zeile vorhanden ist -> Zeile loeschen
  If (Application.CountA(Rows(x)) = 0) Then Rows(x).Delete
 Next
Exit Sub
ErrorHandler:
If Err.Number <> 91 Then MsgBox (Unerwarteter Fehler  & Err.Number & _
              bei 'LeereZeilenLoeschen')
End Sub
 
  • #13
That is too much. :mad:

Das Makro löscht zuviele Spalten! Aber warum? ???
 
  • #14
Hi keithy,

mal sehen, ob wir das Problem eingrenzen können.

Als ersten Schritt schlage ich vor in 'LeerSpaltenUndZeilenAufraeumen3' die Funktion 'SpaltenLoeschenBeiKleinerWerteanzahl3' auszukommentieren.
(einfach ein ' vor Call SpaltenLoeschenBeiKleinerWerteanzahl3).

Makro auf der Kopie der Zieldatei ablaufen lassen.
Zuviel Spalten gelöscht?

Wenn ja, mach doch bitte eine Kopie einer der zuviel gelöschten Spalten in eine neu Excel-Datei und schick sie mir per mail. Kannst Sie auch bis auf einen Wert und Überschrift reduzieren. Hauptsache der Makro hat das gleiche Verhalten wie bei deiner ursprünglichen Datei und löscht die Spalte.

Gruß Matjes :)
 
  • #15
Guten Morgen matjes,

ich würde sehr viel davon halten, wenn du mir helfen könntest, mein Makro zu abzuändern, dass es nicht so lange dauert, wie du schon sagtest mit der PrintArea.

Wäre das möglich? ::)
 
  • #16
Hi keithy,

ich habe deinen Makro genommen und bzgl. PrintArea und Zellen mit Leerzeichen modifiziert.

Änderungen sind mit - '### geändert - gekennzeichnet.

Bin gespannt auf das Ergebnis.

Gruß Matjes :)

Code:
Option Explicit
 
'----------------------------------------------------------------------
Sub LeerSpaltenUndZeilenAufraeumen()
'In der aktiven Arbeitsmappe alle Blätter aufraeumen:
'- leere Spalten löschen
'- Spalten mit weniger als 10 Einträgen löschen
'- leere Zeilen loeschen
 
Dim ws As Worksheet
 
'Für alle Blaetter in der aktiven Mappe
 For Each ws In Worksheets
  ws.Activate
  Call ZellenMitNurBlancsLeeren3 '### geändert
  Call LeereSpaltenLoeschen
  Call SpaltenLoeschenBeiKleinerWerteanzahl
  Call LeereZeilenLoeschen
  Call DruckbereichAufBenutzteZellenFestlegen3 '### geändert

 Next
  
Worksheets(1).Activate
End Sub
'----------------------------------------------------------------------
Private Sub LeereSpaltenLoeschen()
'löscht auf dem aktiven Blatt leere Spalten
 
'(Fehler 91 bei leerem Tabellenblatt)
On Error GoTo ErrorHandler
  
Dim x As Integer, actColNo As Integer
 'Spaltenanzahl
 actColNo = ActiveSheet.Cells.Find(*, [A1], , , xlByColumns, xlPrevious).Column
 'Fuer alle Spalten
 For x = actColNo To 1 Step -1
  'Wenn keine Zellen mit Wert in der Spalte vorhanden ist -> Spalte loeschen
  If (Application.CountA(Columns(x)) = 0) Then Columns(x).Delete
 Next
Exit Sub
ErrorHandler:
If Err.Number <> 91 Then MsgBox (Unerwarteter Fehler bei 'LeereSpaltenLoeschen')
End Sub
'----------------------------------------------------------------------
Private Sub SpaltenLoeschenBeiKleinerWerteanzahl()
 
'löscht auf dem aktiven Blatt Spalten,
'die weniger als c_minAnzahlWerte Werte enthalten
 
'bei weniger als ... Werten in der Spalte wird diese gelöscht
Const c_minAnzahlWerte = 10
 
'(Fehler 91 bei leerem Tabellenblatt)
On Error GoTo ErrorHandler
 
Dim x As Integer, WerteAnzahlImBereich As Integer
Dim actColNo As Integer, actRowNo As Integer
  
 actColNo = Cells.Find(*, [A1], , , xlByColumns, xlPrevious).Column
 actRowNo = Cells.Find(*, [A1], , , xlByRows, xlPrevious).Row
 For x = actColNo To 1 Step -1 '### geänder
 WerteAnzahlImBereich = Application.CountA(Range(Cells(1, x), Cells(actRowNo, x)))
  'Wenn keine Zellen mit Wert in der Spalte vorhanden ist -> Spalte loeschen
  Dim i As Integer
  Dim del As Boolean
  del = False
  For i = 1 To actRowNo 'geändert
  If Not Cells(i, x).Value =  Then '### geändert
 del = False
 Exit For
  End If
  del = True
  Next i
  If del Then Columns(x).Delete
 Next
Exit Sub
ErrorHandler:
If Err.Number <> 91 Then MsgBox (Unerwarteter Fehler bei 'SpaltenLoeschenBeiKleinerWerteanzahl')
End Sub
 
'----------------------------------------------------------------------
Private Sub LeereZeilenLoeschen()
'löscht auf dem aktiven Blatt leere Zeilen
 
'(Fehler 91 bei leerem Tabellenblatt)
On Error GoTo ErrorHandler
 
Dim x As Integer, actRowNo As Integer, actColNo As Integer
  
 'Zeilenanzahl
 actRowNo = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row
 'Fuer alle Zeilen
 For x = actRowNo To 1 Step -1 '### geändert
  'Wenn keine Zelle mit Wert in der Zeile vorhanden ist -> Zeile loeschen
  Dim i As Integer
  Dim del As Boolean
  del = False
  
  actColNo = Cells.Find(*, [A1], , , xlByColumns, xlPrevious).Column

  For i = 1 To actColNo '### geändert
  If Not Cells(x, i).Value =  Then '### geändert
 del = False
 Exit For
  End If
  del = True
  Next i
  If del Then Rows(x).Delete
  'If (Application.CountA(Rows(x)) = 0) Then Rows(x).Delete
 Next x
Exit Sub
ErrorHandler:
If Err.Number <> 91 Then MsgBox (Unerwarteter Fehler bei 'LeereZeilenLoeschen')
End Sub
 
 '----### geändert------------------------------------------------------------------
Private Sub ZellenMitNurBlancsLeeren3()
'Zellen finden, die nur 1-5 Leerzeichen enthalten
'und deren Zellinhalt löschen
'
'(Fehler 91 bei leerem Tabellenblatt)
On Error GoTo ErrorHandler
 
Dim actColNo As Integer, actRowNo As Integer
Dim zelle As Object
Dim ersteAdresse As Variant
 actColNo = ActiveSheet.Cells.Find(*, [A1], , , xlByColumns, xlPrevious).Column
 actRowNo = ActiveSheet.Cells.Find(*, [A1], , , xlByRows, xlPrevious).Row
 With ActiveSheet.Range(Cells(1, 1), Cells(actRowNo, actColNo))
  Set zelle = .Find( , LookIn:=xlValues)
  If Not zelle Is Nothing Then
 ersteAdresse = zelle.Address
 Do
  If ( _
 (zelle.Value =  ) Or _
 (zelle.Value =  ) Or _
 (zelle.Value =   ) Or _
 (zelle.Value =   ) Or _
 (zelle.Value =    ) _
 ) Then
   zelle.Value = 
  End If
  Set zelle = .FindNext(zelle)
 Loop While Not zelle Is Nothing And zelle.Address <> ersteAdresse
  End If
End With
Exit Sub
ErrorHandler:
If Err.Number <> 91 Then MsgBox (Unerwarteter Fehler  & Err.Number & _
    bei 'ZellenMitNurBlancsLeeren')
End Sub
'-------### geändert---------------------------------------------------------------
Private Sub DruckbereichAufBenutzteZellenFestlegen3()
'legt den Druckbereich für das aktive Blatt auf den Bereich der benutzten Zellen fest
'
'Abhilfe für:
' Sind in einem Excelblatt Rahmen bei markierter Spalte(n) bzw. Zeile(n) angelegt
'(Zellen formatieren -> Rahmen)und danach Zellen unter/neben dem benutzten Bereich
' auf diesen Spale(n)/Zeile(n) angeklickt worden, werden beim Drucken am Ende bzw.
' neben des/dem benutzten Bereich leere umrahmte Zellen ausgedruckt.
'
'(Fehler 91 bei leerem Tabellenblatt)
On Error GoTo ErrorHandler
 
Dim actColNo As Integer, actRowNo As Integer
 
 actColNo = ActiveSheet.Cells.Find(*, [A1], , , xlByColumns, xlPrevious).Column
 actRowNo = ActiveSheet.Cells.Find(*, [A1], , , xlByRows, xlPrevious).Row
 Range(Cells(1, 1), Cells(actRowNo, actColNo)).Select
 ActiveSheet.PageSetup.PrintArea = Selection.Address
 
Exit Sub
ErrorHandler:
If Err.Number <> 91 Then MsgBox (Unerwarteter Fehler  & Err.Number & _
    bei 'DruckbereichAufBenutzteZellenFestlegen')
End Sub
 
  • #17
:'(

Tja, funktionieren tut das auch nicht so einwandfrei, am besten funktioniert noch meins, außer, dass es sehr lange dauert. Du hast wesentliche Änderungen an meinem Makro gemacht, die nicht hätten sein dürfen. Aber ich bin mit meinem ganz zufrieden, außer der Zeit, aber darüber kann man hinwegsehen.

Aber ich glaube solche Änderungen hätten nicht sein müssen, oder?

For x = actColNo To 1 Step -1 '### geändert
p.S.: Sorry, dass ich nichts von mir hören lassen habe, aber ich war krank und ab Freitag diese Woche habe ich Urlaub!
 
  • #18
Hallo
auch ich habe ein Problem als Newbie.

Habe eine neuen Computer jetzt drei Wochen laufen mit Windows 7 Professional 64 bit.

Habe den Combuter herunter gefahren und es wurden 13 Upadate´s installiert.
Nach dem Neustart kommt nun folgende Ansage:

All settings were reset to default values.
The previos overclock settings have failled, system has been restored to its default settings.
Press F1 to run setup.
Press F2 to load default valuesw and run setup.

Ist ja alles schön und gut ab die Tasten F1 bzw. F2 zeigen keine Reaktion. Habe eine Funk Tastatur aber andere Tasten funktionieren, wie Alt Strg Enf => Computer startet neu. Auch keine Reaktion bei F8.
Ich komme auch nicht an die Bios ran um den Computer über die Windows DVD zu starten.

Vieleicht weiß ja jemand Rat.
Vielen Dank im voraus

vieregge
 
  • #19
Enf Taste drücken und Computer einschalten. Dann das Bios auf Default setzen.
Der Computer startet dann neu. Was für ein Board hast du ?
 
  • #20
Hallo,

Was fuer einen Anschluß hat dein Tastatur? PS/2? USB?

Gruß
 
Thema:

VBA in Excel - Zellen löschen

ANGEBOTE & SPONSOREN

Statistik des Forums

Themen
113.838
Beiträge
707.961
Mitglieder
51.491
Neuestes Mitglied
haraldmuc
Oben