habe schon wieder ein Problem.
Ich habe ein Sheet mit mehreren tausend Datensätzen,
die im Ausschnitt so aussehen:
A B
1 10.02.2006 Februar
2 02.10.2006 Februar
3 12.02.2006 Februar
4 15.02.2006 Februar
5 02.26.2006 Februar
... März
...
In A2 und A5 sind Monat und Tag vertauscht. Wie kann ich ihm sagen,
daß er Monat und Tag tauschen soll, wenn im Februar (z.B.) der
02.10.2006 steht statt 10.02.2006?
Ich hoffe, ich habe es halbwegs verständlich ausgedrückt.
A B
1 10.02.2006 Februar
2 02.10.2006 Februar
3 12.02.2006 Februar
4 15.02.2006 Februar
5 02.26.2006 Februar
… März
…
In A2 und A5 sind Monat und Tag vertauscht. Wie kann ich ihm
sagen,
daß er Monat und Tag tauschen soll, wenn im Februar (z.B.) der
02.10.2006 steht statt 10.02.2006?
Hi Rolf,
„falsche“ Daten wie in A5 sind mit
=wenn(istfehler(monat(A5);…
o.ä. korrigierbar.
Aber wie soll Excel wissen dass 02.10.2006 „falsch“ ist?
Gruß
Reinhard
A B
1 10.02.2006 Februar
2 02.10.2006 Februar
3 12.02.2006 Februar
4 15.02.2006 Februar
5 02.26.2006 Februar
… März
…
In A2 und A5 sind Monat und Tag vertauscht. Wie kann ich ihm
sagen,
daß er Monat und Tag tauschen soll, wenn im Februar (z.B.) der
02.10.2006 steht statt 10.02.2006?
Hi Rolf,
„falsche“ Daten wie in A5 sind mit
=wenn(istfehler(monat(A5);…
o.ä. korrigierbar.
Aber wie soll Excel wissen dass 02.10.2006 „falsch“ ist?
Hallo Reinhard,
danke für die schnelle Reaktion,
ich dachte an eine Lösung wie (einfach mal in die Tüte):
Wenn B1 = „Februar“ UND Monat in A1 ist NICHT 02, dann tausche
Tag und Monat, sonst „laß es wie es ist“
Für März, April… müßte ich die Formel dann umschreiben (aber wo
schreibe ich sie rein?).
Geht sowas, oder hab ich jetzt Blödsinn „in der Tüte“?
Hallo Rolf
Es ist ja elegant, wenn man so etwas mit einer Formel lösen kann. In diesem Fall scheint mir dies aber unpraktisch bis fast unmöglich, da du ja in dieslebe Zelle schreiben willst, wo der „falsche“ Wert steht. Du müsstest zu diesem Zweck neue Spalten benutzen etc…
Ich schlage dir vor, die ganze Liste mit einem Makro abzuklappern; das hat den Vorteil, dass keine Hilfsspalten angelegt werden müssen und dass dann in der Spalte A die richtigen Datumangaben stehen.
Ein Makro prüft dann von Zelle zu Zelle, ob
in A ein gültiges Datum steht (nicht etwas wie 25.25.2025). Falls nicht, Meldung …
der Monat im gültigen Datum dem Text in B entspricht. Wenn nicht, wird Monat mit Tag vertauscht und das Resultat eingetragen.
Falls du es möchtest, kann ich dir so ein Makro stricken.
Erich
Wenn B1 = „Februar“ UND Monat in A1 ist NICHT 02, dann tausche
Tag und Monat, sonst „laß es wie es ist“
Für März, April… müßte ich die Formel dann umschreiben (aber
wo
schreibe ich sie rein?).
Hi Rolf,
schreibe in z.B. C1 rein:
=pruef(A1)
und kopiere das nach unten.
Dann die C-Spalte nach A kopieren mit Bearbeiten—InhalteEnfügen—Werte
Oder wie schon gesagt ein Makro was die A-Spalte „abklappert“
Option Explicit
Function pruef(Zelle As Range)
Application.Volatile
Dim dat
On Error GoTo wechsel
dat = Split(Zelle, „.“)
If MonthName(dat(1)) Range(„B“ & Zelle.Row) Then GoTo wechsel
pruef = DateValue(dat(2) & „.“ & dat(1) & „.“ & dat(0))
Exit Function
wechsel:
pruef = DateValue(dat(2) & „.“ & dat(0) & „.“ & dat(1))
End Function
Wenn B1 = „Februar“ UND Monat in A1 ist NICHT 02, dann tausche
Tag und Monat, sonst „laß es wie es ist“
Für März, April… müßte ich die Formel dann umschreiben (aber
wo
schreibe ich sie rein?).
Hi Rolf,
schreibe in z.B. C1 rein:
=pruef(A1)
und kopiere das nach unten.
Dann die C-Spalte nach A kopieren mit
Bearbeiten—InhalteEnfügen—Werte
Oder wie schon gesagt ein Makro was die A-Spalte „abklappert“
Option Explicit
Function pruef(Zelle As Range)
Application.Volatile
Dim dat
On Error GoTo wechsel
dat = Split(Zelle, „.“)
If MonthName(dat(1)) Range(„B“ & Zelle.Row) Then GoTo
wechsel
pruef = DateValue(dat(2) & „.“ & dat(1) & „.“ & dat(0))
Exit Function
wechsel:
pruef = DateValue(dat(2) & „.“ & dat(0) & „.“ & dat(1))
End Function
Hallo Reinhard,
vielen Dank für Deine Mühe. Aber ich steh grad wieder
auf der Leitung:
Wenn ich in C1 =pruef(A1) schreibe, bekomme ich als
Ergebnis #NAME?
Zum Makro:
ALT+F11
Doppelklick auf „Diese Arbeitsmappe“, Makro aus
Zwischenablage einfügen. Schließen, Zurück zum
Excel-Blatt, ALT+F8 - da steht aber nix…
Wohin muß ich denn dieses Makro schreiben,
damit ich es starten kann?
danke für das Angebot, Du beschreibst genau das, was ich
„in die Tüte“ gesprochen hatte. Reinhard hat schon was
gestrickt. Vielleicht komm ich damit weiter,
dann müßt Ihr Euch nicht beide Arbeit machen.
Vielleicht komm ich drauf zurück.
Gruß
Rolf
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Hallo Rolf
Hier mein nicht sehr eleganter, aber funktionierender Versuch:
Option Explicit
Sub testen()
Dim Monat, Text, Wert, TestNr
Range("A1").Select
While ActiveCell.Value \> ""
Los:
Wert = ActiveCell.Value
'Mit der Formel "Monat = Month(ActiveCell.Value)"
'geht es nicht, weil diese Funktion auch
'die amerikanischen Formate automatisch erkennt!
'deshalb Monat selber "herausschälen":
Monat = Mid(Wert, 4, 2)
' mit Trim mögliche Leerschläge in Spalte B entfernen
Text = Trim(ActiveCell.Offset(0, 1).Value)
If (Monat = 1 And Text = "Januar") Then GoTo weiter
If (Monat = 2 And Text = "Februar") Then GoTo weiter
If (Monat = 3 And Text = "März") Then GoTo weiter
If (Monat = 4 And Text = "April") Then GoTo weiter
If (Monat = 5 And Text = "Mai") Then GoTo weiter
If (Monat = 6 And Text = "Juni") Then GoTo weiter
If (Monat = 7 And Text = "Juli") Then GoTo weiter
If (Monat = 8 And Text = "August") Then GoTo weiter
If (Monat = 9 And Text = "September") Then GoTo weiter
If (Monat = 10 And Text = "Oktober") Then GoTo weiter
If (Monat = 10 And Text = "November") Then GoTo weiter
If (Monat = 12 And Text = "Dezember") Then GoTo weiter
'keiner hat gepasst. Tag/Monat tauschen:
ActiveCell.Value = Mid(Wert, 4, 2) & "." & Mid(Wert, 1, 2) & "." & Mid(Wert, 7, 4)
'neuenEintrag prüfen
TestNr = TestNr + 1
'Geduld ist zu Ende !!
If TestNr = 2 Then
ActiveCell.Offset(0, 2).Value = "Da steht kein Datum!"
GoTo weiter
End If
GoTo Los
weiter:
ActiveCell.Offset(1, 0).Activate
Wend
End Sub
ALT+F11
Doppelklick auf „Diese Arbeitsmappe“, Makro aus
Zwischenablage einfügen. Schließen, Zurück zum
Excel-Blatt, ALT+F8 - da steht aber nix…
Wohin muß ich denn dieses Makro schreiben,
damit ich es starten kann?
Hallo Rolf,
Einfügen–Modul, da gehört normaler Makrocode rein.
In DieseArbeitsmappe sollte nur Specialcode für Ereignismakros rein. (Das öffnen , schliessen einer Mappe usw. ist ein Ereignis der Arbeitsmappe).
Tabellenbblätter haben auch Ereignisse wie Change, Selectionchange usw.
Gruß
Reinhard
das ist ja genial, herzlichen Dank für Deine Mühe.
Frage:
Ich hatte in A6 den 06.02.06 stehen und er hat’s artig
nach 06.02.06 geändert.
Warum schreibt er mir denn in C6 „Da steht kein Datum“?
Ich habe die Zeile im Makro zwar gefunden, ich kanns aber
nicht interpretieren.
Gruß
Rolf
Hallo Rolf
Hier mein nicht sehr eleganter, aber funktionierender Versuch:
Option Explicit
Sub testen()
Dim Monat, Text, Wert, TestNr
Range(„A1“).Select
While ActiveCell.Value > „“
Los:
Wert = ActiveCell.Value
'Mit der Formel „Monat = Month(ActiveCell.Value)“
'geht es nicht, weil diese Funktion auch
'die amerikanischen Formate automatisch erkennt!
'deshalb Monat selber „herausschälen“:
Monat = Mid(Wert, 4, 2)
’ mit Trim mögliche Leerschläge in Spalte B entfernen
Text = Trim(ActiveCell.Offset(0, 1).Value)
If (Monat = 1 And Text = „Januar“) Then GoTo weiter
If (Monat = 2 And Text = „Februar“) Then GoTo weiter
If (Monat = 3 And Text = „März“) Then GoTo weiter
If (Monat = 4 And Text = „April“) Then GoTo weiter
If (Monat = 5 And Text = „Mai“) Then GoTo weiter
If (Monat = 6 And Text = „Juni“) Then GoTo weiter
If (Monat = 7 And Text = „Juli“) Then GoTo weiter
If (Monat = 8 And Text = „August“) Then GoTo weiter
If (Monat = 9 And Text = „September“) Then GoTo weiter
If (Monat = 10 And Text = „Oktober“) Then GoTo weiter
If (Monat = 10 And Text = „November“) Then GoTo weiter
If (Monat = 12 And Text = „Dezember“) Then GoTo weiter
'keiner hat gepasst. Tag/Monat tauschen:
ActiveCell.Value = Mid(Wert, 4, 2) & „.“ & Mid(Wert, 1, 2) &
„.“ & Mid(Wert, 7, 4)
'neuenEintrag prüfen
TestNr = TestNr + 1
'Geduld ist zu Ende !!
If TestNr = 2 Then
ActiveCell.Offset(0, 2).Value = „Da steht kein Datum!“
GoTo weiter
End If
GoTo Los
weiter:
ActiveCell.Offset(1, 0).Activate
Wend
End Sub
ALT+F11
Doppelklick auf „Diese Arbeitsmappe“, Makro aus
Zwischenablage einfügen. Schließen, Zurück zum
Excel-Blatt, ALT+F8 - da steht aber nix…
Wohin muß ich denn dieses Makro schreiben,
damit ich es starten kann?
Einfügen–Modul, da gehört normaler Makrocode rein.
In DieseArbeitsmappe sollte nur Specialcode für Ereignismakros
rein. (Das öffnen , schliessen einer Mappe usw. ist ein
Ereignis der Arbeitsmappe).
Tabellenbblätter haben auch Ereignisse wie Change,
Selectionchange usw.
Hallo Reinhard,
danke für die Info, da habe ich wohl schon etliche Makros
an den falschen Ort geschoben…
danke für die Info, da habe ich wohl schon etliche Makros
an den falschen Ort geschoben…
Hallo Rolf,
Makros laufen grundsätzlich egal wo sie stehen, aber es ist besser sie gleich richtig zu positionieren.
Sorry , habe das vorhin zu flüchtig gelesen. Ich hatte dir eine Funktion geschrieben, kein Makro, deshalb konntest du es nach ctrl+F8 nicht sehen. Funktionen und Makros mit Parametern werden nicht gelistet.
Das ist jetzt ein Makro:
Option Explicit
Sub Korrektur()
Dim dat, n As Long, merker As String
For n = 1 To ActiveSheet.Range("A65536").End(xlUp).Row
dat = Split(Cells(n, 1), ".")
If CInt(dat(1)) \> 12 Then
merker = dat(0)
dat(0) = dat(1)
dat(1) = merker
End If
If CInt(dat(1)) \> 12 Then
MsgBox "Das gibts ja nich in Zelle A" & n
Exit Sub
End If
If MonthName(dat(1)) Range("B" & n) Then dat(1) = "02"
Cells(n, 1) = DateValue(dat(2) & "." & dat(1) & "." & dat(0))
Next n
End Sub
Option Explicit
Sub Korrektur()
Dim dat, n As Long, merker As String
For n = 1 To ActiveSheet.Range(„A65536“).End(xlUp).Row
dat = Split(Cells(n, 1), „.“)
If CInt(dat(1)) > 12 Then
merker = dat(0)
dat(0) = dat(1)
dat(1) = merker
End If
If CInt(dat(1)) > 12 Then
MsgBox „Das gibts ja nich in Zelle A“ & n
Exit Sub
End If
If MonthName(dat(1)) Range(„B“ & n) Then dat(1) =
„02“
Cells(n, 1) = DateValue(dat(2) & „.“ & dat(1) & „.“ &
dat(0))
Next n
End Sub
Hallo Reinhard,
Da bekomme ich eine Fehlermeldung: Fehler beim Kompillieren,
Sub oder Function nicht definiert.
dat = Split(Cells(n, 1), „.“) „split“ hat er markiert.
das ist ja genial, herzlichen Dank für Deine Mühe.
Danke für die Blumen
Warum schreibt er mir denn in C6 „Da steht kein Datum“?
Ich habe die Zeile im Makro zwar gefunden, ich kanns aber
nicht interpretieren.
Wenn in einer Zelle ein „verkehrtes“ Datum steht, kehrt er es umd. Dann kann es aber immer noch falsch sein (z.B. 15.15.2006). Deshalb dr Prüfdurchgang. Wenn es dann immer noch kein Datum ist, ist es eben keins!
ABER: Ich habe vergessen, die Variable wieder auf Null zu stellen!!!
Füge ein:
...
Los:
TestNr = 0
Wert = ActiveCell.Value
...
Jetzt sollte es laufen.
(Wenn du die Meldung nicht in Spalte C schreiben willst, musst du einfach den Wert 3 im offset vergrössern.)
Gruss
Erich
Hallo Rolf
Sorry, meine letzte Meldung war nicht korrekt!
Die Variable muss am richtigen Ort zurückgestellt werden
November ist nicht 10, sondern 11
Der Text „kein Datum“ ist ungenau: „kein erlaubtes Datum“ ist besser, da nicht nur 15.15.2006, sondern auch z.B. 08.12.2006 nicht erlaubt, wegen Spalte B=Februar.
Offset 2 ergibt Spalte C (A+2), Wenn du in F schreiben willst, wäre offset = 5
der Einfachheit halber hier mein ganzer korrigierter Code:
Option Explicit
Sub testen()
Dim Monat, Text, Wert, TestNr
Range("A1").Select
While ActiveCell.Value \> ""
TestNr = 0
Los:
Wert = ActiveCell.Value
'Mit der Formel "Monat = Month(ActiveCell.Value)"
'geht es nicht, weil diese Funktion auch
'die amerikanischen Formate automatisch erkennt!
'deshalb Monat selber "herausschälen":
Monat = Mid(Wert, 4, 2)
' mit Trim mögliche Leerschläge in Spalte B entfernen
Text = Trim(ActiveCell.Offset(0, 1).Value)
If (Monat = 1 And Text = "Januar") Then GoTo weiter
If (Monat = 2 And Text = "Februar") Then GoTo weiter
If (Monat = 3 And Text = "März") Then GoTo weiter
If (Monat = 4 And Text = "April") Then GoTo weiter
If (Monat = 5 And Text = "Mai") Then GoTo weiter
If (Monat = 6 And Text = "Juni") Then GoTo weiter
If (Monat = 7 And Text = "Juli") Then GoTo weiter
If (Monat = 8 And Text = "August") Then GoTo weiter
If (Monat = 9 And Text = "September") Then GoTo weiter
If (Monat = 10 And Text = "Oktober") Then GoTo weiter
If (Monat = 11 And Text = "November") Then GoTo weiter
If (Monat = 12 And Text = "Dezember") Then GoTo weiter
'keiner hat gepasst. Tag/Monat tauschen:
ActiveCell.Value = Mid(Wert, 4, 2) & "." & Mid(Wert, 1, 2) & "." & Mid(Wert, 7, 4)
'neuenEintrag prüfen
TestNr = TestNr + 1
'Geduld ist zu Ende !!
If TestNr = 2 Then
ActiveCell.Offset(0, 2).Value = "Da steht kein erlaubtes Datum!"
GoTo weiter
End If
GoTo Los
weiter:
ActiveCell.Offset(1, 0).Activate
Wend
End Sub
Warum schreibt er mir denn in C6 „Da steht kein Datum“?
Ich habe die Zeile im Makro zwar gefunden, ich kanns aber
nicht interpretieren.
Wenn in einer Zelle ein „verkehrtes“ Datum steht, kehrt er es
umd. Dann kann es aber immer noch falsch sein (z.B.
15.15.2006). Deshalb dr Prüfdurchgang. Wenn es dann immer noch
kein Datum ist, ist es eben keins!
ABER: Ich habe vergessen, die Variable wieder auf Null zu
stellen!!!
Füge ein:
…
Los:
TestNr = 0
Wert = ActiveCell.Value
…
Jetzt sollte es laufen.
(Wenn du die Meldung nicht in Spalte C schreiben willst, musst
du einfach den Wert 3 im offset vergrössern.)
Jetzt läuft es prima. Vielen Dank nochmal, Du hast mir
sehr geholfen.
Du warst schon wieder 2 Minuten schneller als ich
Alles klar - Bis denn.
Rolf
Sorry, meine letzte Meldung war nicht korrekt!
Die Variable muss am richtigen Ort zurückgestellt werden
November ist nicht 10, sondern 11
Der Text „kein Datum“ ist ungenau: „kein erlaubtes Datum“
ist besser, da nicht nur 15.15.2006, sondern auch z.B.
08.12.2006 nicht erlaubt, wegen Spalte B=Februar.
Offset 2 ergibt Spalte C (A+2), Wenn du in F schreiben
willst, wäre offset = 5
der Einfachheit halber hier mein ganzer korrigierter Code:
Option Explicit
Sub testen()
Dim Monat, Text, Wert, TestNr
Range(„A1“).Select
While ActiveCell.Value > „“
TestNr = 0
Los:
Wert = ActiveCell.Value
'Mit der Formel „Monat = Month(ActiveCell.Value)“
'geht es nicht, weil diese Funktion auch
'die amerikanischen Formate automatisch erkennt!
'deshalb Monat selber „herausschälen“:
Monat = Mid(Wert, 4, 2)
’ mit Trim mögliche Leerschläge in Spalte B entfernen
Text = Trim(ActiveCell.Offset(0, 1).Value)
If (Monat = 1 And Text = „Januar“) Then GoTo weiter
If (Monat = 2 And Text = „Februar“) Then GoTo weiter
If (Monat = 3 And Text = „März“) Then GoTo weiter
If (Monat = 4 And Text = „April“) Then GoTo weiter
If (Monat = 5 And Text = „Mai“) Then GoTo weiter
If (Monat = 6 And Text = „Juni“) Then GoTo weiter
If (Monat = 7 And Text = „Juli“) Then GoTo weiter
If (Monat = 8 And Text = „August“) Then GoTo weiter
If (Monat = 9 And Text = „September“) Then GoTo weiter
If (Monat = 10 And Text = „Oktober“) Then GoTo weiter
If (Monat = 11 And Text = „November“) Then GoTo weiter
If (Monat = 12 And Text = „Dezember“) Then GoTo weiter
'keiner hat gepasst. Tag/Monat tauschen:
ActiveCell.Value = Mid(Wert, 4, 2) & „.“ & Mid(Wert, 1, 2) &
„.“ & Mid(Wert, 7, 4)
'neuenEintrag prüfen
TestNr = TestNr + 1
'Geduld ist zu Ende !!
If TestNr = 2 Then
ActiveCell.Offset(0, 2).Value = „Da steht kein erlaubtes
Datum!“
GoTo weiter
End If
GoTo Los
weiter:
ActiveCell.Offset(1, 0).Activate
Wend
End Sub