Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Problem mit Datumsformat

230 views
Skip to first unread message

Harald Friis

unread,
Jan 29, 2016, 9:46:24 AM1/29/16
to
Hallo,

in einem VBA-Code frage ich ein bestimmtes Datum ab mit

Datum = CDate (InputBox "Datum")

In meinem Word-Dokument übernehme ich aus Excel ein Datum mit
{MERGEFIELD "Beginn" \@ "dd.MMMM.yyyy"}

Im weiteren Code kommt der Schnipsel:

If .DataSource.DataFields ("Beginn").Value = Datum Then [mache tolle Sachen]

Irnkwie scheint es ein Problem mit dem Format zu geben. Ich kann Namen,
ein "x", < oder >, leere oder nichtleere Felder abfragen - aber ich
bekomme es nicht hin, die beiden Kalenderdaten zu vergleichen.

Ideen, Tipps, Trost ;-)

Gruß

Harald Friis

Bernhard Sander

unread,
Jan 29, 2016, 10:04:38 AM1/29/16
to
Hallo Harald,
Wie es aussieht, werden die Werte aus Excel als Strings geholt. Kannst Du mit
x = .DataSource.DataFields ("Beginn").Value
im Debugger recht leicht erkennen.

Dann probier mal:
IF CDate(.DataSource.DataFields ("Beginn").Value ) = Datum Then ...

Vergiss die Fehlerbehandlung nicht, falls doch mal was andres als ein Datum in der Excel-Spalte steht.

Gruß
Bernhard Sander

Harald Friis

unread,
Jan 29, 2016, 12:18:34 PM1/29/16
to
Hallo Bernhard,

Am 29.01.2016 um 16:04 schrieb Bernhard Sander:

danke für die schnelle Antwort.

Auf

> Dann probier mal:
> IF CDate(.DataSource.DataFields ("Beginn").Value ) = Datum Then ...

Mist, da hätte ich auch drauf kommen können, ist ja naheliegend. Bin
aber nicht - also ganz herzlichen Dank. Leider funzt es nicht und zeigt
ein sehr merkwürdiges, mir unerklärliches Verhalten:

Einige Daten funktionieren, andere nicht. Ich fing an mit dem
11.01.2016, weil dies so in meiner Mustertabelle stand. Klappte
überhaupt nicht. Neu als Datum formatiert, nochmals eingegeben, neu
gespeichtert ... Nichts.

Das Datum in 18.01.2016 geändert - problemlos. 1.1.15 ging, 2.1.15 ging
nicht. Ich glaube nicht an Verschwörungstherorien, aber vielleicht sind
sie doch schon unter uns?

Irgendeine Idee, woran das liegen könnte? Noch eine andere Formatierung?

Gruß

Harald Friis

Lisa Wilke-Thissen

unread,
Jan 29, 2016, 1:31:05 PM1/29/16
to

Hallo Harald,

"Harald Friis" schrieb

> Das Datum in 18.01.2016 geändert - problemlos. 1.1.15 ging,
> 2.1.15 ging nicht.

> Irgendeine Idee, woran das liegen könnte? Noch eine andere Formatierung?

bedauerlicherweise habe ich keine Lösung parat - zumal es um VBA geht.
Aber könnte es ein Problem sein, dass Excel und Word unterschiedliche
Platzhalter fürs Datumsformat verwenden?
Word: dd.MM.YYYY
Excel: TT.MM.JJJJ

--
Viele Grüße
Lisa

Heiko Rost

unread,
Jan 29, 2016, 4:07:05 PM1/29/16
to
Spekulation: Irgendwie funktioniert die Zuordnung von Tag und Monat
nicht bzw. wird das eingegebene Datum anders als das in der
Excel-Tabelle interpretiert:

11.01.2016 - 11. Januar 2016 oder 1. November 2016
18.01.2016 - 18. Monat gibt es nicht, also 18. Januar 2016
1.1.15 - 1. Januar 2015 oder 1. Januar 2015 ;-)
2.1.15 - 2. Januar 2015 oder 1. Februar 2015.

Du kannst auch unmittelbar vor dem Vergleich mit

Debug.Print Datum
Debug.Print CDate(.DataSource.DataFields ("Beginn").Value )

beide Datumsangaben untereinander anzeigen lassen. Der Logik nach müßten
dann bei den nicht funktionierenden Vergleichen Unterschiede erkennbar
sein.

> Noch eine andere Formatierung?

Zwei Möglichkeiten fallen mir ein:

- an Stelle von cDate jeweils die Funktion DateValue benutzen
- mit der Format-Funktion den eingegebenen Datums-String genauso wie das
Excel-Feld in "dd.MMMM.yyyy" umwandeln

Gruß Heiko
--
Es gibt ein Auge der Seele, mit ihm allein kann man die Wahrheit sehen.
Platon

Harald Friis

unread,
Jan 31, 2016, 8:27:26 AM1/31/16
to
Hallo,

Am 29.01.2016 um 22:06 schrieb Heiko Rost:

> 11.01.2016 - 11. Januar 2016 oder 1. November 2016

so isses tatsächlich. Der 11. Januar aus Excel wird im Serienbrief
korrekt dargestellt. aber in VBA konsequent als 1. November behandelt
(und auch so per MsgBox ausgewiesen)

> - an Stelle von cDate jeweils die Funktion DateValue benutzen

Kein Unterschied im Verhalten.

Die allwissende Tante verlinkte auf einige Foren-Artikel, die ähnliche
Probleme besprachen. Als Tipp wurde dort vorgeschlagen, die Daten per
DDE von Excel zu holen. Das hat tatsächlich dazu geführt, dass auch VBA
den 11. Januar erkannt hat. So weit, so gut.

Allerdings läuft der Serienbrief jetzt nicht mehr. Der erste Datensatz
wird korrekt verarbeitet, dann endet der Lauf.

Hat noch jemand eine andere Idee?

Euch allen, die bis jetzt geholfen haben, schon einmal herzlichen Dank.
Jetzt bin ich schon ein ganzes Stück weiter, wenn auch leider noch nicht
erfolgreich.

Gruß

Harald Friis

Ulrich Möller

unread,
Jan 31, 2016, 10:43:13 AM1/31/16
to
Hallo Harald,

wenn die Datentypen bekannt sind, sollte auch eine passende
Konvertierung für den Vergleich machbar sein. Aus der Inputbox wird mit
CDate() der String in ein Datumstyp konvertiert. Wenn das Mergefeld
jetzt vom Typ String ist und ein Monatsname enthalten ist, muß auch
CDate(Datum) klappen.
Was ist jetzt der reale Datentyp vom Mergefeld "Datum" und kannst du mal
einen Bsp. machen, wo es nicht funktioniert?
Um den Datentyp zu bekommen, einfach mit Debug.Print mit "Typename(
<Mergefeld>) und den Inhalt mit CStr(<Mergefeld>) ausgeben lassen,

Ulrich

Ulrich

Heiko Rost

unread,
Jan 31, 2016, 12:07:17 PM1/31/16
to
Harald Friis schrieb am Sun, 31 Jan 2016 14:27:24 +0100:

> so isses tatsächlich. Der 11. Januar aus Excel wird im Serienbrief
> korrekt dargestellt. aber in VBA konsequent als 1. November behandelt
> (und auch so per MsgBox ausgewiesen)

So wie es aussieht, wird das Datum aus Excel (zumindest in Office 2010,
andere habe ich nicht zum Testen) als String im Format "Monat/Tag/Jahr"
übergeben. Dann bietet es sich an, an Stelle von cDate eine eigene
Umwandlungsfunktion zu benutzen:

Function ExcelDatumToDate(ExcelDatum As String) As Date
'Umwandlung eines Datumstrings in der Form "monat/tag/jahr"
'in den Datentype Date
Dim Pos1 As Integer, Pos2 As Integer
Dim Tag As Integer, Monat As Integer, Jahr As Integer
Pos1 = InStr(ExcelDatum, "/")
Pos2 = InStr(Pos1 + 1, ExcelDatum, "/")
Monat = Val(Left(ExcelDatum, Pos1 - 1))
Tag = Val(Mid(ExcelDatum, Pos1 + 1, Pos2 - Pos1))
Jahr = Val(Mid(ExcelDatum, Pos2 + 1))
ExcelDatumToDate = DateSerial(Jahr, Monat, Tag)
Debug.Print ExcelDatum & " --> " & ExcelDatumToDate
End Function

Gegebenenfalls solltest Du noch die Werte auf Plausibilität testen
(Pos1, Pos2 > 0; Tag, Monat, Jahr im richtigen Bereich), falls in der
Excel-Tabelle im entsprechenden Feld einmal kein Datum steht.

Gruß Heiko
--
So mancher meint, ein gutes Herz zu haben, und hat nur schwache Nerven.
Marie Freifrau von Ebner-Eschenbach

Ulrich Möller

unread,
Jan 31, 2016, 12:38:36 PM1/31/16
to
Hallo Heiko,

das war genau die Information, die noch fehlte. :-)
Unter der Annahme, das immer eine 4 stellige Jahreszahl übermittelt
wird, könnte man dann auch alternativ folgenden Einzeiler nehmen, um
CDate() auf die Sprünge zu helfen:

dteDatum = cdate(right$(ExcelDatum,4) & "/" &
mid$(ExcelDatum,1,len(ExcelDatum)-5))

Ulrich

Harald Friis

unread,
Feb 1, 2016, 12:30:52 PM2/1/16
to
Am 31.01.2016 um 18:39 schrieb Ulrich Möller:
> Am 31.01.2016 um 18:07 schrieb Heiko Rost:
>> Harald Friis schrieb am Sun, 31 Jan 2016 14:27:24 +0100:
>>

>> So wie es aussieht, wird das Datum aus Excel (zumindest in Office 2010,
>> andere habe ich nicht zum Testen) als String im Format "Monat/Tag/Jahr"
>> übergeben. Dann bietet es sich an, an Stelle von cDate eine eigene
>> Umwandlungsfunktion zu benutzen:

Yepp, so ist es wohl. Ich nutze auch 2010, mit Debug.Print kam auch
konsequent der Monat als Tag mit deutscher Schreibweise, also der 01.11.
statt dem 11. 01.

>> Function ExcelDatumToDate(ExcelDatum As String) As Date
>> 'Umwandlung eines Datumstrings in der Form "monat/tag/jahr"
>> 'in den Datentype Date
>> Dim Pos1 As Integer, Pos2 As Integer
>> Dim Tag As Integer, Monat As Integer, Jahr As Integer
>> Pos1 = InStr(ExcelDatum, "/")
>> Pos2 = InStr(Pos1 + 1, ExcelDatum, "/")
>> Monat = Val(Left(ExcelDatum, Pos1 - 1))
>> Tag = Val(Mid(ExcelDatum, Pos1 + 1, Pos2 - Pos1))
>> Jahr = Val(Mid(ExcelDatum, Pos2 + 1))
>> ExcelDatumToDate = DateSerial(Jahr, Monat, Tag)
>> Debug.Print ExcelDatum & " --> " & ExcelDatumToDate
>> End Function

Ist ja irre, was man konstruieren muss, um MS die Arbeit abzunehmen.

> das war genau die Information, die noch fehlte. :-)
> Unter der Annahme, das immer eine 4 stellige Jahreszahl übermittelt
> wird, könnte man dann auch alternativ folgenden Einzeiler nehmen, um
> CDate() auf die Sprünge zu helfen:
>
> dteDatum = cdate(right$(ExcelDatum,4) & "/" &
> mid$(ExcelDatum,1,len(ExcelDatum)-5))

Ich werde beides testen, dauert aber einige Tage, vermutlich nächstes
WE. Als Übergangslösung hatte ich bei mir in Excel einen Textstring
(=Text([Datum] "TT.MM.jjjj") gebildet und den mit meiner Eingabe
verglichen. Eure Lösung gefällt mir viel besser, weil am VBA-Code keiner
rumfummelt und das Excel-Sheet mehreren Menschen zugänglich ist.

Ich danke herzlich für die Mühe.

Gruß

Harald Friis

0 new messages