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