Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Zahlenformat ändern mit Array

Forumthread: Zahlenformat ändern mit Array

Zahlenformat ändern mit Array
05.01.2020 17:04:14
Barbara
Hallo
Kann man die Zahlenformate (Numberformat) aller Zellen eines Bereichs mit dem Format "#0" in "General" schneller umwandeln als in meinem Makro?
Ich habe zwei Varianten probiert:
1. Alle Zahlenformate in ein Array geben, die "#0" durch "General" ersetzen, und dann wieder in die Tabelle zurückgeben.
2. Jede Zelle einzeln prüfen und das Zahlenformat ändern.
Das Makro kann mit einer leeren Tabelle ausgeführt werden.

Sub ZahlenformatNeu()
Dim dDauerArr     As Double
Dim dDauerDirekt  As Double
'Zur Auswahl des gewünschten Bereichs
ActiveSheet.Range("A1:E100").Select     'Auswahl 500 Zellen
ActiveSheet.Range("A1:A500").Select     'Auswahl 500 Zellen
ActiveSheet.Range("A1:A10000").Select   'Auswahl 10000 Zellen
'    ActiveSheet.Range("A1:D10000").Select   'Auswahl 40000 Zellen
'Zum Testen der Laufzeit:
With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
End With
'Format ändern
Selection.Cells.NumberFormat = "#0"
dDauerArr = FormatÄndern_mit_Arrays         'Variante mit Arrays
Selection.Cells.NumberFormat = "#0"
dDauerDirekt = FormatÄndern_in_den_Zellen      'Variante Direkt
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = xlCalculationAutomatic
End With
End Sub
Function FormatÄndern_mit_Arrays()
Dim arrFeld()
Dim lZeile      As Long
Dim lSpalte     As Long
Dim dSekunden   As Double
dSekunden = Timer
With Selection
ReDim arrFeld(1 To .Rows.Count, 1 To .Columns.Count)
'Die Zahlenformate aller Zellen in das Feld schaufeln
For lZeile = LBound(arrFeld, 1) To UBound(arrFeld, 1)
For lSpalte = LBound(arrFeld, 2) To UBound(arrFeld, 2)
arrFeld(lZeile, lSpalte) = Selection(lZeile, lSpalte).NumberFormat
Next lSpalte
Next lZeile
'Alle Zahlenformate "#0" in "General" umwandeln
For lZeile = LBound(arrFeld, 1) To UBound(arrFeld, 1)
For lSpalte = LBound(arrFeld, 2) To UBound(arrFeld, 2)
If arrFeld(lZeile, lSpalte) = "#0" Then arrFeld(lZeile, lSpalte) = "General"
Next lSpalte
Next lZeile
'Alle Zahlenformate in die Tabelle zurückstellen
For lZeile = LBound(arrFeld, 1) To UBound(arrFeld, 1)
For lSpalte = LBound(arrFeld, 2) To UBound(arrFeld, 2)
.Cells(lZeile, lSpalte).NumberFormat = arrFeld(lZeile, lSpalte)
Next lSpalte
Next lZeile
End With
FormatÄndern_mit_Arrays = Timer - dSekunden
End Function
Function FormatÄndern_in_den_Zellen()
Dim rZelle      As Range
Dim dSekunden   As Double
dSekunden = Timer
For Each rZelle In Selection.Cells
With rZelle
If .NumberFormat = "#0" Then .NumberFormat = "General"
End With
Next rZelle
FormatÄndern_in_den_Zellen = Timer - dSekunden
End Function
Bei 40.000 Zellen sind beide Varianten ca. gleich schnell.
Kann man vielleicht die Zahlenformate schnell ein ein Array kopieren und wieder zurück stellen?
Etwa so, wie man es auch mit Zellenwerten machen kann. Da sind Arrays ja klar im Vorteil gegenüber der Einzelbearbeitung der Zellen.
LG Barbara
Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zahlenformat ändern mit Array
05.01.2020 17:24:59
Nepumuk
Hallo Barbara,
wenn alle Zellen in dem Bereich das selbe Zahlenformat haben dann liefert dir die NumberFormat-Eigenschaft das Format zurück. Hat nur eine Zelle ein anderes Format, liefert dir die Eigenschaft den Wert Null zurück. Mit anderen Worten, das geht nicht.
Gruß
Nepumuk
AW: Zahlenformat ändern mit Array
05.01.2020 17:47:39
onur
Wieso nicht so:
RangeXY.NumberFormat = "General"

Anzeige
AW: Zahlenformat ändern mit Array
05.01.2020 18:18:16
onur
Wenn sowieso alle Zellen im Bereich haben, warum nicht den ganzen Bereich auf einmal ändern?
Oder war das nur zum Testen gedacht?
Der Code hier braucht bei 40.000 Zellen 3,05 s für Einzelüberprüfung und 0,16 s um den ganzen Bereich zu ändern.
https://www.herber.de/bbs/user/134182.xlsm
Anzeige
AW: Zahlenformat ändern mit Array
06.01.2020 20:00:50
Barbara
Hallo
unglücklicherweise habe ich nicht deutlich genug erwähnt, dass die Zellen unterschiedliche Formate haben können. Denn daraus ergibt sich erst die Problematik.
Mein Beispiel hat diesen Umstand in der Versuchsanordnung nicht berücksichtigt.
Onur, für die Einzelbearbeitung, wo Du 3,05 s brauchst liege ich mit 8 s weit hinten. Aber das liegt vielleicht an meiner lahmen Kiste. Andererseits bin ich mit der Einzelüberprüfung in 0,01 s fertig. Offensichtlich gibt es keine schnellere Methode.
Vielen Dank für Eure Hilfe.
LG, Barbara
PS: Leider funktioniert bei dieser Frage die Email-Benachrichtigung vom Forum bei eingegangener Antwort nicht. Daher habe ich erst jetzt Eure Antworten gefunden.
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Zahlenformat in Excel mit Arrays ändern


Schritt-für-Schritt-Anleitung

  1. Bereich auswählen: Bestimme den Zellbereich, in dem du das Zahlenformat ändern möchtest. Zum Beispiel:

    ActiveSheet.Range("A1:E100").Select
  2. Makro erstellen: Erstelle ein neues Makro in deinem VBA-Editor. Füge den folgenden Code ein, um die Zahlenformate zu ändern:

    Sub ZahlenformatNeu()
       Dim dDauerArr As Double
       Dim dDauerDirekt As Double
       'Bereich auswählen
       ActiveSheet.Range("A1:E100").Select
       'Anwendung optimieren
       With Application
           .ScreenUpdating = False
           .EnableEvents = False
           .Calculation = xlCalculationManual
       End With
       'Format ändern
       Selection.Cells.NumberFormat = "#0"
       dDauerArr = FormatÄndern_mit_Arrays
       Selection.Cells.NumberFormat = "#0"
       dDauerDirekt = FormatÄndern_in_den_Zellen
       'Anwendung zurücksetzen
       With Application
           .ScreenUpdating = True
           .EnableEvents = True
           .Calculation = xlCalculationAutomatic
       End With
    End Sub
  3. Funktionen hinzufügen: Füge die beiden Funktionen hinzu, um das Format mit Arrays und die Einzelbearbeitung zu testen:

    Function FormatÄndern_mit_Arrays() 
       ' Funktion zur Verwendung von Arrays
    End Function
    
    Function FormatÄndern_in_den_Zellen()
       ' Funktion zur Einzelbearbeitung
    End Function
  4. Makro ausführen: Führe das Makro aus, um die Zahlenformate in deinem definierten Bereich zu ändern.


Häufige Fehler und Lösungen

  • Fehler: Das Makro gibt einen Fehler zurück, wenn nicht alle Zellen das gleiche Format haben. Lösung: Stelle sicher, dass du die richtige Logik im Code verwendest, um unterschiedliche Formate zu überprüfen. Das Array-Formatierungssystem kann hier nützlich sein.

  • Fehler: Lange Ausführungszeiten bei großen Datenmengen. Lösung: Verwende die Anwendungseinstellungen (ScreenUpdating, EnableEvents, Calculation), um die Ausführungsgeschwindigkeit zu erhöhen.


Alternative Methoden

Eine Alternative zur Verwendung von Arrays ist die direkte Änderung des Formats des gesamten Bereichs. Wenn alle Zellen im Bereich das gleiche Format haben, kannst du das so tun:

ActiveSheet.Range("A1:E100").NumberFormat = "General"

Dies ist schneller, wenn du sicher bist, dass alle Zellen dasselbe Format haben.


Praktische Beispiele

Hier ist ein Beispiel, wie du die Funktion FormatÄndern_mit_Arrays implementieren kannst:

Function FormatÄndern_mit_Arrays() 
    Dim arrFeld()
    Dim lZeile As Long
    Dim lSpalte As Long
    Dim dSekunden As Double
    dSekunden = Timer
    With Selection
        ReDim arrFeld(1 To .Rows.Count, 1 To .Columns.Count)
        ' Zahlenformate in das Array kopieren
        For lZeile = LBound(arrFeld, 1) To UBound(arrFeld, 1)
            For lSpalte = LBound(arrFeld, 2) To UBound(arrFeld, 2)
                arrFeld(lZeile, lSpalte) = Selection(lZeile, lSpalte).NumberFormat
            Next lSpalte
        Next lZeile
        ' Formate umwandeln
        For lZeile = LBound(arrFeld, 1) To UBound(arrFeld, 1)
            For lSpalte = LBound(arrFeld, 2) To UBound(arrFeld, 2)
                If arrFeld(lZeile, lSpalte) = "#0" Then arrFeld(lZeile, lSpalte) = "General"
            Next lSpalte
        Next lZeile
        ' Zurück in die Tabelle
        For lZeile = LBound(arrFeld, 1) To UBound(arrFeld, 1)
            For lSpalte = LBound(arrFeld, 2) To UBound(arrFeld, 2)
                .Cells(lZeile, lSpalte).NumberFormat = arrFeld(lZeile, lSpalte)
            Next lSpalte
        Next lZeile
    End With
    FormatÄndern_mit_Arrays = Timer - dSekunden
End Function

Tipps für Profis

  • Optimierung: Nutze das Array Formatter-Konzept, um die Effizienz zu steigern. Kopiere die Formate in ein Array und schreibe sie am Ende zurück in die Zellen, um die Anzahl der Schreiboperationen zu minimieren.

  • Profiling: Teste die Ausführungszeiten deiner Makros bei verschiedenen Zellbereichen, um die beste Methode für deine spezifischen Anforderungen zu finden.


FAQ: Häufige Fragen

1. Wie kann ich das Zahlenformat aller Zellen auf einmal ändern? Du kannst den gesamten Bereich mit einer einzigen Zeile ändern, indem du RangeXY.NumberFormat = "General" verwendest, wenn alle Zellen dasselbe Format haben.

2. Ist es notwendig, die Anwendungseinstellungen zurückzusetzen? Ja, das Zurücksetzen der Anwendungseinstellungen ist wichtig, um die Benutzeroberfläche von Excel reaktionsfähig zu halten und die Berechnungen korrekt durchzuführen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige