Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
840to844
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
840to844
840to844
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Anstatt Zelle für Zelle ganzen Bereich bearbeiten

Anstatt Zelle für Zelle ganzen Bereich bearbeiten
31.01.2007 08:57:45
Peter
Guten Tag
Mit nachfolgendem Code stelle ich sicher, dass alle Einträge in der Spalte A (immer ein Datum) ein Datumsformat und nicht ein Textformat hat.
Bei Abarbeitung von rund 12'000 Zellen dauert das eine Weile. Deshalb meine Frage:
Gäbe es nicht eine bessere Lösung, z.B. den ganzen Range in den Zwischenspeicher nehmen, dann den Bereich korrekt formatieren und die Daten wieder zurückschreiben?
Kann mir jemand eine Hilfestellung geben?
Danke, Peter

Sub ConvertToDate()
Dim rngCell As Range
Dim lngLastA As Long
With Sheets("Journal") 'Tabellenname anpassen!
lngLastA = .Cells(Rows.Count, 1).End(xlUp).Row
End With
On Error Resume Next
For Each rngCell In Worksheets("Journal").Range("A1:A" & lngLastA)
If IsDate(rngCell.Value) Then
rngCell.Value = DateValue(rngCell.Value)
End If
Next rngCell
On Error GoTo 0
End Sub

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Anstatt Zelle für Zelle ganzen Bereich bearbeiten
31.01.2007 12:27:57
Rudi
Hallo,
Application.screenupdating=false an den Anfang des Makros.
Gruß
Rudi
Eine Kuh macht Muh, viele Kühe machen Mühe
AW: Anstatt Zelle für Zelle ganzen Bereich bearbeiten
31.01.2007 14:31:21
Peter
Hallo Rudi
Danke für die Rückmeldung.
Eigentlich meinte ich eine Beschleunigung, indem nicht jede Zelle einzeln angesprochen wird, sondern ein ganzer Range.
Ist das nicht möglich?
Gruss, Peter
For Each rngCell In Worksheets("Journal").Range("A1:A" & lngLastA)
If IsDate(rngCell.Value) Then
rngCell.Value = DateValue(rngCell.Value)
End If
Next rngCell
AW: Anstatt Zelle für Zelle ganzen Bereich bearbeiten
31.01.2007 17:55:44
Rudi
Hallo,
nein, das geht nicht. Du kannst aber erst den Bereich in ein Array einlesen, dort umwandeln und wieder zurückschreiben.

Sub tt()
Dim rng As Range, vntRng, i As Long
With Sheets(1)
Set rng = .Range(.Cells(1, 1), .Cells(Rows.Count, 1).End(xlUp))
End With
vntRng = rng
For i = 1 To UBound(vntRng, 1)
vntRng(i, 1) = Format(CDate(vntRng(i, 1)), "DD.MM.YYYY")
Next
rng = vntRng
End Sub

Bleibt auch bei 30.000 Zeilen unter 1 Sekunde.
Gruß
Rudi
Eine Kuh macht Muh, viele Kühe machen Mühe
Anzeige
AW: Anstatt Zelle für Zelle ganzen Bereich bearbeiten
31.01.2007 18:37:27
Peter
Hallo Rudi
Vielen Dank. Das werde ich morgen im Office umsetzen.
Ich möchte den Code gerne verstehen. Habe ich richtig verstanden, dass vntRng als Long dimensioniert wird?
Könntest du mir den Code kurz erläutern? Wäre super!
Danke, Peter
AW: Anstatt Zelle für Zelle ganzen Bereich bearbeiten
31.01.2007 19:19:50
Horst
vntRng ist als Variant deklariert und das muss auch so sein, weil nur ein
Variant-Array einen Zellbereich auf einen Rutsch aufnehmen kann.
Der Code ist dennoch suboptimal, da er Texte erzeugt.
mfg Horst
AW: Anstatt Zelle für Zelle ganzen Bereich bearbeiten
31.01.2007 20:58:52
Peter
Hallo Horst
Vielen Dank für die Erklärung.
Die Anmerkung, dass der Code suboptimal ist, führt mich zur Frage, was denn hier optimaler wäre. Nach meinem Verständnis werden nicht Texte geschaffen, sondern allfällige Texte in das jeweilige Datum umgewandelt.
Gruss, Peter
Anzeige
AW: Anstatt Zelle für Zelle ganzen Bereich bearbeiten
31.01.2007 22:50:43
Horst
Hi,
wenn es seinen Zweck erfüllt, ist es doch ok.
Normaler Weise erzeugt das
vntRng(i, 1) = Format(CDate(vntRng(i, 1)), "DD.MM.YYYY")
aber Text.
mfg Horst
AW: Anstatt Zelle für Zelle ganzen Bereich bearbeiten
01.02.2007 10:40:51
Peter
Hallo Rudi
Ich habe nun den Code ausprobiert und es funktioniert "grundsätzlich". Das einzige Problem ist, dass die Zellen nun zwar ein Datumsformat haben, jedoch bei jeder einzelnen in die Bearbeitungszeile eingestiegen werden und mit Enter bestätigt werden muss, damit aus dem Textformat tatsächlich ein Datumsformat wird. Wenn ich das nicht mache, gibt die nachfolgend (zuunterst) dargestellte Formel mit min und max überhaupt keinen Wert raus.
Wie kann das gelöst werden?
Danke für ein Feedback.
Peter
PS.: Das mit den Textformaten hat's in sich - habe auch in einem anderen Fall so ein Problem, das ich ins Forum stellen werde.

Sub tt()
Dim rng As Range, vntRng, i As Long
With Sheets(1)
Set rng = .Range(.Cells(1, 1), .Cells(Rows.Count, 1).End(xlUp))
End With
vntRng = rng
For i = 1 To UBound(vntRng, 1)
vntRng(i, 1) = Format(CDate(vntRng(i, 1)), "DD.MM.YYYY")
Next
rng = vntRng
End Sub

=WENN(MAX(Journal!A:A)=0;"Im Journal sind keine Daten enthalten.";"Es haben vom "&TEXT(MIN(Journal!A:A);"TT. MMMM JJJJ")&" bis am "&TEXT(MAX(Journal!A:A);"TT. MMMM JJJJ")&" Transaktionen stattgefunden.")
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige