VBA in Excel - Zellen löschen

Dieses Thema VBA in Excel - Zellen löschen im Forum "Webentwicklung, Hosting & Programmierung" wurde erstellt von keithy, 7. Nov. 2002.

Thema: VBA in Excel - Zellen löschen Hallo! ??? Ich habe ein sehr umfangreiches Excel-Dokument als Druckversion und daher sind sehr viele leer Zellen...

  1. 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:

Die Seite wird geladen...

VBA in Excel - Zellen löschen - Ähnliche Themen

Forum Datum
Zellen in Excel ziehen Ergänzung des vorhandenen Makors Microsoft Office Suite 10. Juli 2011
Excel 2003 Kann man bestimmte Zellen im Listenbereich schützen? Microsoft Office Suite 24. Feb. 2011
Excel: Summe beliebiger Anzahl Zellen (also nicht die Werte) ? Microsoft Office Suite 2. Dez. 2010
Excel: Zellen verbinden Windows XP Forum 25. Juni 2010
Excel - Anfänger - Zelle soll nur durch best. Anzahl der Zellen teilen Windows XP Forum 5. Feb. 2010