2017-03-03 4 views
0

Ich verwende den folgenden VBA-Code, um den Wochentag eines Datums zu erhalten.vba Wochentag Name des Datums erhalten? UK Datumsformat Ausgabe

Dim strDate 
strDate = "01/06/2017" 
wStemplaTE.Range("C25").value = WeekdayName(Weekday(DateValue(strDate))) 

Dies sollte produzieren: Donnerstag, aber ich bekomme Freitag. Ich denke, das ist, weil Excel denkt, mein Datum ist US-Format. Bu Es ist UK-Format.

Kann mir bitte jemand zeigen, wo ich falsch liege?

+0

Haben Sie darüber nachgedacht, die Zeichenfolge in '01-Jun-2017' zu ändern, um Verwirrung zu vermeiden? – Jeeped

+0

@Jeeped in diesem Beispiel StrDate ist definiert als "01/06/2017", aber StrDate ist tatsächlich mit einer anderen Arbeitsmappe verbunden, die das Format wie "01/06/2017" hat – user7415328

+0

Wenn es ein echtes Datum in einem ist reale Zelle in einem echten Arbeitsblatt, dann benutze 'Range (...). Value2' und entferne' DateValue'. – Jeeped

Antwort

2

Trotz der auf einem MDY-Regiona; l-System, legte ich 01-Jun-2017 in A1 auf Sheet2 und verwendet ein benutzerdefiniertes Zahlenformat von dd/mm/yyyy. Jede von diesen erzeugt den korrekten Wochentagsnamen (z. B. Donnerstag).

Debug.Print WeekdayName(Weekday(Worksheets("Sheet2").Range("A1").Value2)) 
Debug.Print Format(Worksheets("Sheet2").Range("A1").Value2, "dddd") 

Dies funktioniert, weil ein Datum als eine rohe Zahl betrachtet werden kann. 01-Jun-2017 passiert zufällig 42,887.

2
Dim strDate 

von ungarischen Notation Standards sind Sie es ein String, aber es wird erklärt als [n implizit] Variant aufrufen.

Dim theDate As Date 

Dies erklärt theDate als Date.

Für eine eindeutige Datumsverarbeitung, behandeln Sie Daten als Daten, nicht als Zeichenfolgen - und versuchen Sie, Variant zu vermeiden, wann immer Sie können.

Dann nutzen Sie die ISO-Norm yyyy-MM-dd Format, wenn Sie ein Datumsliteral zuweisen möchten (mit # Begrenzungszeichen):

theDate = #2017-06-01# 

Auf diese Weise brauchen Sie nicht Ihre Variant/String zu nehmen und es in eine Kurve Date - es ist bereits ein Datum.

wStemplaTE.Range("C25").value = WeekdayName(Weekday(theDate)) 

Gibt Ihnen Donnerstag wie es sollte.

Dies würde auch:

wStemplaTE.Range("C25").value = Format(theDate, "dddd") 

Edit: nur die Kommentare unter der Frage gelesen - geht nach vorn bitte die alle entscheidend selbst in der Frage relevanten Informationen stellen. @Jeeped's answer funktioniert, wenn kein Datum, Literal, Variante oder String beteiligt ist.

Da das Datum tatsächlich in einer Zelle ist, und du bist in einer anderen Zelle den Wochentag Namen zu schreiben, würde ich einen All-Excel Ansatz vorschlagen:

=TEXT([theDate],"dddd") 

Gibt den Wochentag am langen Datum Format, als Text.

Es gibt andere Ansätze auch, wenn Sie wirklich wollen, um die WEEKDAY - z. eine Nachschlagtabelle:

index/match lookup using a lookup table

einen Tisch irgendwo Stellen (hier nannte ich es wkDays) und den Rückgabewert der WEEKDAY Funktion den Wochentag zum Nachschlagen.

=WEEKDAY([thedate],1) 

Gibt 5 für Donnerstag zurück.

=INDEX(wkDays[Name],MATCH(WEEKDAY([thedate],1),wkDays[WkDay],0)) 

Returns Thursday weil die wkDays Tabelle Thursday auf den Wert 5 abbildet.