Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1200to1204
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

Warum funktioniert dieser Code nicht: Datum

Warum funktioniert dieser Code nicht: Datum
Holger,
Hallo,
Nachmittagsproblem, mal wieder das leidige Thema Datum.
Es gibt Jan 10;Feb 10, May 10 etc, also immer MMM YY in Englisch.
Wird von Excel nicht als Datum erkannt.
Versuch, dies mit CDate umzuwaneln scheitert:
Wert von rng.Offset = "Dec 10"
            rngCell.Offset(0, -1).NumberFormat = "mmm yy"
rngCell.Offset(0, -1) = CDate("1." & rngCell.Offset(0, -1).Value)
Wie kann ich die zwölf Schreibweisen in Datum umwandeln?
AW: Warum funktioniert dieser Code nicht: Datum
11.02.2011 14:34:09
Hajo_Zi
Halo Holgr,
man könnte vermuten in der Zelle steht ein Datum Und "1." davor ist kein Datum mehr. Du mußt die Anzeige nicht mit dem Inhalt verwechseln.

"Man könnte vermuten...", du hast gar kein...
11.02.2011 14:42:50
Luc:-?
…englisches Xl, Holger,
bzw keine US-Datumseinstellungen, denn, was Hajo vermutet erschließt sich mir mal wieder nicht so recht… :->
Wenn aber doch, hat das Datum möglicherweise nicht die in diesem Sprachraum verlangte Form, sondern ist so 'ne Art Pidgin-Denglish… ;-)
Gruß Luc :-?
AW: "Man könnte vermuten...", du hast gar kein...
11.02.2011 14:48:14
Holger,
Hi Luc,
was es auch immer für ein Englisch ist, ich kriege es leieder nun mal so.
Also Dec 10, may 10, Oct 10, Mar 10
Wie kriege ich das nun umgewandelt?
Anzeige
Aber ein engl Xl hast du?! owT
11.02.2011 15:00:12
Luc:-?
:-?
...Ansonsten, was hältst du von Evaluierung?! owT
11.02.2011 15:03:07
Evaluierung?!
:-?
AW: ...Ansonsten, was hältst du von Evaluierung?! owT
11.02.2011 15:24:26
Evaluierung?!
Das Excel ist deutsch.
Was nun schon wieder ist Evaluierung?
Ich bastele gerade ein Select case mit den vier unterschiedlichen Monaten
und setze so das Datum neu zusammen.
Wenn es was besseres gibt, bin ich wirklich dankbar für jeden heissen Tip,
denn ich will Code sparen wo es nur geht.
Ansonstebn ein schönes Wochenende!
Code-Sparen ist heutzutage nicht mehr...
11.02.2011 19:47:47
Luc:-?
…unbedingt nötig, Holger,
sieht aber evtl besser aus… ;-)
Ja, du warst schon auf dem richtigen Weg, denn, da du ein dt Xl mit vermutl dt Datumseinstellungen hast wird das auch mit Evaluate nichts, denn die Methode greift auf diese Einstellungen zurück und kennt deshalb kein Dec. Außerdem gehört zwingend Tag und Jahr in das Datum, sonst wird womöglich der Tag als Jahr interpretiert. Die Reihenfolge ist bei Monatskurztext und 4stelliger Jahreszahl genauso egal wie idR das Trennzeichen. Ich schlage Übersetzen der Monatskurztexte und Ergänzen durch das jeweils richtige Jahr (falls 10 in Dec 10 der Tag ist, sonst einen fiktiven Tag verwenden) vor. Das wären ca 4-5 Codezeilen…
Übersetzen: Dazu am besten 1-2 Konstanten u/o ein 2dimensionales Feld (Array) deklarieren…
Const txtMonSprVs As String = "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec;" & _
"Jan Feb Mrz Apr Mai Jun Jul Aug Sep Okt Nov Dez"
Dim MonVs(1) As Variant, MonIdx As Integer
MonVs(0) = Split(Split(txtMonSprVs, ";")(0)): MonVs(1) = Split(Split(txtMonSprVs, ";")(1))
Dann brauchst du anschließend nur noch die 1. 3 Zeichen aus deinem Datum auszulesen und mit WorksheetFunction.Match in MonVs(0) zu suchen und anschließend den gefundenen Indexwert auf MonVs(1) anzuwenden (Fehler abfangen!)…
MonIdx = WorksheetFunction.Match(Left(datum, 3), MonVs(0), 0)
If CBool(MonIdx) Then _
datum = Replace(datum, MonVs(0)(MonIdx - 1), MonVs(1)(MonIdx - 1) Else _
…[Fehlerbehandlung]
Dann muss das Datum ggf nur noch durch Jahr (bzw Tag) ergänzt wdn, dann kannst du CDate darauf anwenden.
Welches Jahr verwendet wdn muss, hängt von deinen Daten ab. Wenn der Abstand zum aktuellen Monat nie größer als 1 Jahr ist, kannst du einen Monatsgrößenvgl vornehmen und das Ergebnis als Absolutzahl vom lfd Jahr abziehen [Year(Now) - Abs(…)] bzw als Integerzahl addieren [Year(Now) + CInt(…)] (Vgl wird so nämlich 0 bzw -1).
Falls die 10 in Dec 10 das Jahr ist, wäre hier nur noch 20 [am besten Leerzeichen und 20 an MonVs(1) angehängt und das vorhandene Leerzeichen gleich mit ersetzt] und ganz an Anfang oder Ende irgendein Tag (bspw "1 " &… bzw …& " 1") zu ergänzen.
Natürlich kannst du auch nur die 4 betroffenen Monate austauschen — glaube aber kaum, dass das eleganter ist… ;-)
Gruß Luc :-?
Anzeige
Neuer Ansatz, der auch nicht klappt:
11.02.2011 14:38:32
Holger,

Sub Klappt auch nicht
strDate = Cells(rngSearchPeriod.Row, rngSearchPeriod.Column + 1).Value
strYear = Right(strDate, 2)
strMonth = Left(strDate, 3)
strDate = Replace(Replace(Replace(Replace( _
Format(DateSerial(strYear, strMonth, 0), "('MMM YY')"), _
"rz", "ar"), "i", "y"), "k", "c"), "z", "c")
End Sub

AW: Neuer Ansatz, der auch nicht klappt:
11.02.2011 18:22:23
firmus
Hi Holger,
das Thema ist mir geläufig.
Englisches Datum + englisches Win7 + englisches XLs2007 + Systemeinstellung Sprache=deutsch.
.
Falls das Attribut einer Zelle nicht explizit angegeben wurde, intepretiert xls den Zelleneinhalt auf mögliches Datum. Grundlage der Prüfung ist die Spracheinstellung
(START - ControlPanels - Regions - Formats)
Sieht das Datum nicht deutsch aus - bei Einstellung "deutsch" - erhält es auch nicht den Type "Date".
-
Den Type der Zelle gilt es m.E. als erstes zu prüfen: Kein "Date" - keine Datumsfunktion.
Dann ist die Zelle als "Text" anzusehen und mit substrings (=Teil,......) zu zerlegen.
Die einzelnen Teile können dann über die Funktion "DATWERT" bzw. "DATUM" zu einem Wert mit
dem Type "date" zusammengesetzt werden. Danach kann auch Datedif u.ä. angewandt werden.
Ein bischen Code ist dazu aber schon nötig.
Viel Erfolg.
Gruß
Firmus
Anzeige
AW: Neuer Ansatz, der auch nicht klappt:
11.02.2011 22:02:43
Peter
Hallo Holger,
noch eine kleine, aber wichtige Korrektur:
Public Sub Umwandeln()
Dim WkSh    As Worksheet
Dim lZeile  As Long
Dim vTemp   As Variant
Dim iIndx   As Integer
vTemp = Array(" ", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", _
"Oct", "Nov", "Dec")
Set WkSh = ThisWorkbook.Worksheets("Tabelle1")
With WkSh
For lZeile = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
For iIndx = LBound(vTemp) To UBound(vTemp)
If Left(.Range("A" & lZeile).Text, 3) = vTemp(iIndx) Then Exit For
Next iIndx
With .Range("B" & lZeile)
.NumberFormat = "dd.mm.yyyy"
.Value = DateSerial(Val(Right(WkSh.Range("A" & lZeile).Value, 2)), iIndx, 1)
End With
Next lZeile
End With
End Sub

Gruß Peter
Anzeige
AW: Neuer Ansatz, der auch nicht klappt:
11.02.2011 21:54:41
Peter
Hallo Holger,
was hältst Du von dieser Lösung, wobei angenommen wurde, Deine Werte Dec 10, Oct 10 usw. stehen in Spalte A und die Ausgabe des Datums erfolgt in Spalte B:
Option Explicit
Public Sub Umwandeln()
Dim lZeile  As Long
Dim vTemp   As Variant
Dim iIndx   As Integer
vTemp = Array(" ", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", _
"Oct", "Nov", "Dec")
With ThisWorkbook.Worksheets("Tabelle1")
For lZeile = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
For iIndx = LBound(vTemp) To UBound(vTemp)
If Left(.Range("A" & lZeile).Text, 3) = vTemp(iIndx) Then Exit For
Next iIndx
With .Range("B" & lZeile)
.NumberFormat = "dd.mm.yyyy"
.Value = DateSerial(Val(Right(.Range("A" & lZeile).Value, 2)), iIndx, 1)
End With
Next lZeile
End With
End Sub
Gruß Peter
Anzeige
AW: Theoretisch hilft nur ausprobieren!
11.02.2011 19:42:07
Gerd
Hi Holger,
teste mal:
Sub auswerten()
Cells(1, 1) = "'" & "Dec 10"
Cells(1, 2).NumberFormat = "mmm yy"
Cells(1, 2).Value = "1/" & Split(Cells(1, 1).Text)(0) & "/" & Split(Cells(1, 1).Text)(1)
End Sub
Gruß Gerd
AW: Warum funktioniert dieser Code nicht: Datum
11.02.2011 19:52:16
Erich
Hi Holger,
probier mal das hier - es wird vorausgesetzt, dass in Spalte A Text steht:
 ABCDEF
1TextDatumVBA   
2Jan 1001.01.201001.01.2010 WAHRFALSCH
3Feb 1101.02.201101.02.2011 FALSCHWAHR
4May 1201.05.201201.05.2012   
5Dec 1301.12.201301.12.2013   
6Oct 1401.10.201401.10.2014   

ZelleFormel
B2=1*(WECHSELN(WECHSELN(WECHSELN(WECHSELN(LINKS(A2;3); "Oc";"Ok"); "ec";"ez"); "y";"i"); "ar";"är")&-RECHTS(A2;2))
C2=AmiKurzDat(A2)
E2=ISTTEXT(A2)
F2=ISTTEXT(B2)
E3=ISTZAHL(A3)
F3=ISTZAHL(B3)

Und hier der Code:

Function AmiKurzDat(strT As String) As Date
' wandelt "Dec 15" in das Datum 01.12.2015 um
AmiKurzDat = CDate(("1." & Replace(Replace(Replace(Replace( _
Left(strT, 3), "Oc", "Ok"), "ec", "ez"), "y", "i"), "ar", "är") & _
" " & (2000 + Right(strT, 2))))
End Function
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
dieser Code funktioniert doch - kürzer
11.02.2011 19:54:38
Erich
Hi Holger,
da war noch eion Klammernpaar zuviel:

Function AmiKurzDat(strT As String) As Date
' wandelt "Dec 15" in das Datum 01.12.2015 um
AmiKurzDat = CDate("1." & Replace(Replace(Replace(Replace( _
Left(strT, 3), "Oc", "Ok"), "ec", "ez"), "y", "i"), "ar", "är") & _
" " & (2000 + Right(strT, 2)))
End Function
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
AW: dieser Code funktioniert doch - kürzer
16.02.2011 14:20:07
Holger,
Hallo Erich,
auch hier habe ich es lieber so gelöst:
Public Sub GetDate(ByVal STRDATE As String, ByVal RNGCELL As Range)
Dim strYear  As String, strMonth As String, strPeriod As String
strPeriod = ""
If Left(STRDATE, 1) = "

Anzeige
Code-Sparen? Das war wohl nichts,...
16.02.2011 19:25:06
Luc:-?
…Holger,
aber warum auch einfach, wenn's doch kompliziert geht…
Const txtMonSprVs As String = "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec;" & _
"01. 02. 03. 04. 05. 06. 07. 08. 09. 10. 11. 12."
…weiter wie in meinem Bsp oder besser ohne dt Teil und nur den entsprechend formatierten Index verwenden Format(index, "00\.").
Luc :-?

302 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige