Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1044to1048
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

Deinitialisierung leerer numerischer Zellen

Deinitialisierung leerer numerischer Zellen
01.02.2009 07:14:00
Werner
mein VBA-Level: befriedigend
Hallo Freunde,
die Zellen einer Spalte im UsedRange einer Tabelle von mir sind als numerisch formatiert. Wenn dort
schon einmal Werte eingetragen waren und anschließend gelöscht wurden, ergibt eine Prüfung mit
dem Programm

Public Sub ZellenPruefen()
MsgBox IsEmpty(ActiveCell.Value)
End Sub


den Booleschen Wert "FALSE". Zellen, die noch nie initialisiert wurden, z.B. solche außerhalb des
UsedRange, liefern dagegen das Ergebnis "TRUE".
Nun hatte ich früher einmal folgendes Programm geschrieben, mit dem man initialisierte Zellen
deinitialisieren kann, wenn sie für das Auge leer sind:
For Each c In ActiveSheet.UsedRange
If c.Value = Chr(32) or c.Value = "" Then
c.Value = NULL
End If
Next c
Das funktioniert aber offenbar nicht bei für das Auge leeren (d.h. auf dem Bildschirm weiß erscheinenden)
numerischen Zellen.
Frage: Wie muss ich obigen Makro ändern, damit auch optisch leere numerische Zellen mit
deinitialisiert werden können?
Vielleicht weiß jemand von euch Rat. Dank!! Werner R.

16
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Deinitialisierung leerer numerischer Zellen
01.02.2009 08:45:00
Tino
Hallo,
meinst Du so?

Sub Test()
Dim Bereich As Range
With Sheets("Tabelle1")
Set Bereich = .UsedRange.SpecialCells(xlCellTypeBlanks)
Bereich.Clear
End With
End Sub


Gruß Tino

Sehr zufrieden!
01.02.2009 09:10:17
Werner
Hallo Tino,
herzlichen Dank!!
Das ist offenbar eine weit bessere Lösung als die in meinem Programm.
Das reservierte Wort "xlCellTypeBlanks" kannte ich gar nicht.
Man kann also innerhalb des UsedRange sogar einen nicht-zusammenhängenden Bereich
bilden und dann bearbeiten. Toll!
Die leeren Zellen haben es manchmal in sich: Sie sehen alle gleich aus, sind aber nicht immer gleich.
Werner R.
Anzeige
AW: Deinitialisierung leerer numerischer Zellen
01.02.2009 08:55:22
Josef
Hallo Werner,
wenn sich sonst nur Zahlen in der Spalte befinden, dann versuch es mal so.
Sub EmptyCells()
    Dim rng As Range
    
    On Error Resume Next
    With ActiveSheet.Columns(1)
        Set rng = .SpecialCells(xlCellTypeFormulas, 2)
        If Not rng Is Nothing Then rng.ClearContents
        Set rng = .SpecialCells(xlCellTypeConstants, 2)
        If Not rng Is Nothing Then rng.ClearContents
    End With
    On Error GoTo 0
    
    Set rng = Nothing
End Sub

Gruß Sepp

Anzeige
Was bedeutet eigentlich "leer"?
01.02.2009 09:26:14
Werner
Hallo Josef,
dein Programm löscht offenbar Formeln und Konstanten aber auch sonstige leere Zellen?
Was ist mit numerischen Zellen, die schon einmal einen Eintrag gehabt haben und
dann manuell gelöscht worden sind?
Eine numerische Zelle bleibt anscheinend, nachdem sie manuell gelöscht ist, "leer", ist aber weder null
noch deinitialisiert.
Bedeutet "leer" hier so viel wie "schon initilisiert, numerisch, aber nicht null"?
Grüße und Dank! Werner R.
AW: Was bedeutet eigentlich "leer"?
01.02.2009 09:32:32
Josef
Hallo Werner,
also bei mir ergibt IsEmpty() auch bei befüllten und anschliesend gelöschten Zellen WAHR.
Gruß Sepp

Anzeige
Rätselhaft!
01.02.2009 09:40:00
Werner
Hallo Sepp,
sehr merkwürdig. Ich spreche hier ausdrücklich nur von numerischen Zellen.
Bei mir ergab ein Test optisch leerer numerischer Zellen außerhalb des UsedRange mit dem Makro

Public Sub  Testen()
MsgBox IsEmpty(ActiveCell.Value)
End Sub


ein "TRUE", wenn diese ausserhalb des UsedRange lagen und noch nie initialisiert waren, aber
ein "FALSE", wenn diese einen Wert enthalten hatten, aber manuell gelöscht worden waren.
In welchem Zustand sich solche manuell gelöschten numerischen Zellen befinden, verstehe ich
gar nicht mehr. Werner R.

Anzeige
ich habe es auch mal getestet ...
01.02.2009 10:43:00
Matthias
Hallo
auch bei mir ergibt IsEmpty() bei befüllten und anschliesend wieder gelöschten Zellen immer WAHR.
Userbild


Userbild
getestet in XL2000 und XL2007
Gruß Matthias
AW: Rätsel-Lektüre
02.02.2009 10:47:00
Werner
Hallo Gerd,
Dank auch f. den Link! Die Erklärung in diesem Link ist auf Excel 2003 abgestellt, ich verwende aber Excel
2007. Weißt du, wie die Anweisung "Menü - Bearbeiten - Zellen löschen in Excel 2007" lautet?
Werner R.
Anzeige
AW: Rätsel-Lektüre
02.02.2009 11:12:56
Werner
Hallo Gerd,
Dank auch f. den Link! Die Erklärung in diesem Link ist auf Excel 2003 abgestellt, ich verwende aber Excel
2007. Weißt du, wie die Anweisung "Menü - Bearbeiten - Zellen löschen in Excel 2007" lautet?
Werner R.
liegt wohl an meiner Datei
02.02.2009 10:05:06
Werner
Hallo zusammen,
Dank für eure Hinweise!! Ich glaube, es liegt z.B. auch an meiner Datei, die vielleicht nicht ganz
in Ordnung ist. So bekomme ich, wenn ich in der numerischen Spalte einen Wert lösche,
bei der Funktion IsNumeric() ein FALSE und bei der Funktion IsEmpty() ebenfalls ein False. Die numeri-
sche Formatierung dürfte im Normalfall, da gebe ich euch recht, nicht verloren gehen.
Werner .
Anzeige
AW: Rätselhaft!
01.02.2009 11:12:56
Tino
Hallo,
habe hier mal was mit VBA zusammengebaut.
Es wird die zuerst nach der letzten benutzen Zelle gesucht, Formel bzw. Wert.
Der Bereich darunter wird gelöscht.
Funktioniert aber nur für den unteren Bereich, für den rechten müsste man es noch erweitern.
Die Änderung wird erst nach dem speichern, schließen und erneuten öffnen wirksam.
Option Explicit

Sub TestEmpty()
Dim Bereich As Range
Dim rFormelZelle As Range, rValueZelle As Range, rZelle As Range
Dim booLauf As Boolean
Dim LRow As Long

With Sheets("Tabelle1")

     'UsedRange 
     Set Bereich = .UsedRange
     'Suche letzte Zelle mit Formel 
     Set rFormelZelle = Bereich.Find("*", , xlFormulas, 2, 1, 2, False, False)
     'letzte Zelle mit Wert 
     Set rValueZelle = Bereich.Find("*", , xlValues, 2, 1, 2, False, False)
     
     'Prüfe welche davon die letzte ist 
     If rFormelZelle.Row <= rValueZelle.Row Then
       Set rZelle = rValueZelle
     ElseIf rFormelZelle.Column <= rValueZelle.Column Then
       Set rZelle = rValueZelle
     Else
      Set rZelle = rFormelZelle
     End If
     
     'Den Bereich bestimmen nach der letzten benutzten Zelle 
     Set Bereich = .Range(rZelle, .Cells.SpecialCells(xlCellTypeLastCell))
    
    'Schleife über diesen Bereich 
    For Each Bereich In Bereich
     'prüfe ob gleiche Zeile wie letzte, ohne die letzte 
     '= nicht gleiche Zeile, kann der Rest gelöscht werden. 
     If Bereich.Row > LRow And booLauf = True Then
      Set Bereich = .Range(.Cells(Bereich.Row, 1), .Cells(.Rows.Count, .Columns.Count))
      Bereich.Clear: Exit For
     End If
      booLauf = True: LRow = Bereich.Row
    Next Bereich
End With


End Sub


Gruß Tino

Anzeige
so ist es einfacher.
01.02.2009 11:25:00
Tino
Sub TestEmpty()
Dim Bereich As Range
Dim rFormelZelle As Range, rValueZelle As Range, rZelle As Range
Dim booLauf As Boolean
Dim LRow As Long

With Sheets("Tabelle1")

     'UsedRange 
     Set Bereich = .UsedRange
     'Suche letzte Zelle mit Formel 
     Set rFormelZelle = Bereich.Find("*", , xlFormulas, 2, 1, 2, False, False)
     'letzte Zelle mit Wert 
     Set rValueZelle = Bereich.Find("*", , xlValues, 2, 1, 2, False, False)
     
     'Prüfe welche davon die letzte ist 
     If rFormelZelle.Row <= rValueZelle.Row Then
       Set rZelle = rValueZelle
     Else
      Set rZelle = rFormelZelle
     End If

    If rZelle.Row < .Rows.Count Then
     Set Bereich = .Range(.Cells(rZelle.Row + 1, 1), .Cells(.Rows.Count, .Columns.Count))
     Bereich.Clear
    End If
End With


End Sub


Anzeige
Dank!
02.02.2009 10:37:00
Werner
Hallo Tino,
dank auch f. diesen Makro. Muss ihn noch testen. Die Syntax der Find-Anweisung mit den vielen Para-
metern ist mir nicht ganz geläufig (muss ich noch irgendwo nachschlagen)
Sollte es statt ".Bereich.Clear" nicht besser ".Bereich.ClearContents" heißen, damit die Formatierung erhalten bleibt? Werner R.
AW: Dank!
02.02.2009 10:49:26
Tino
Hallo,
bei ClearContents brauchst Du dieses Makro nicht verwenden,
ClearContents verändert nicht Deinen Usedrange.
Mit ClearContents gilt die Zelle weiterhin als verwendet, man muss schon Clear verwenden.
Gruß Tino
AW: Dank!
02.02.2009 11:14:00
Werner
Hallo Tino,
alles klar. Dank! Werner R.
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige