Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: VBA Kalenderwoche - welche Fnkt stimmt denn nun?

VBA Kalenderwoche - welche Fnkt stimmt denn nun?
Christian
Hi Leute,
1: um die Kalenderwoche in VBA zu bestimmen habe ich bislang verwendet:

Function udfCW(datDate As Date) As Long
Dim datTmp As Date
datTmp = DateSerial(Year(datDate + (8 - Weekday(datDate)) Mod 7 - 3), 1, 1)
udfCW = ((datDate - datTmp - 3 + (Weekday(datTmp) + 1) Mod 7)) \ 7 + 1
End Function
Aus der Erinnerung ist das die VBA-Funktion, die auch sämtliche Sonderfälle erschlägt.
Ich habe aber eben festgestellt, dass diese Funktion bei Übergabe eines Zeitstempels mit Uhrzeit am Sonntagmittag um 12:00Uhr auf die nächste KW umschaltet. Nach DIN beginnt die KW aber am Montag um 00:00 Uhr.
Bsp: 25.09.2011 ist ein Sonntag:
- 25.09.2011 11:59:59 ergibt KW38
- 25.09.2011 12:00:00 ergibt KW39 - ist falsch, denn die KW39 beginnt erst am 26.09.11 um 00:00 Uhr.
Klar, denn Fehler kann man umgehen, indem man der Funktion das Datum als "Ganzzahl" übergibt, bzw. mit "datDate = Int(datDate)" in Ganzzahl umwandelt.
2: Eine andere Variante z.Bsp. von Ramses aus http://www.online-excel.de/excel/singsel_vba.php?f=48:

Function DIN_KW(DasDatum As Date) As Byte
Dim KW As Date
KW = 4 + DasDatum - Weekday(DasDatum, 2)
DIN_KW = (KW - DateSerial(Year(KW), 1, -6)) \ 7
End Function
Die stimmt für den 25.09.2011 auch mit Uhrzeiten, aber stimmt die auch für alle Datumsangaben und Sonderfälle?
Welche stimmt den nun?
Vielen Dank vorab
Grüße
Christian
Anzeige
AW: VBA Kalenderwoche - welche Fnkt stimmt denn nun?
24.09.2011 09:29:34
Hajo_Zi
Hallo Christian
Bei Ramses wurde ich davon ausgehen das die für alle Daten geht. Ab Version 2010 würde ich in der Tabelle den Schalter 21 benutzen.

AW: VBA Kalenderwoche - welche Fnkt stimmt denn nun?
24.09.2011 11:33:08
Christian
hallo Hajo,
hab's eben mal für ca. 3 Mio Tage (ohne Uhrzeiten) durchlaufen lassen und verglichen.
Beide Funktionen liefern das gleiche Ergebnis. Insofern werde ich zukünftig den Code von Ramses verwenden.
Gruß
Christian
Anzeige
AW: VBA Kalenderwoche - welche Fnkt stimmt denn nun?
24.09.2011 10:29:20
Luschi
Hallo Christian,
habe mal die udfCW-Funktion ein bischen auseinanergemommen. dabei kommt
heraus, daß der Funktionsterm
datDate - datTmp - 3 + (Weekday(datTmp) + 1) Mod 7 folgende Zwischenwerte
berechnet:
bei 25.09.2011 11:59:59 --> 265.499988425923
bei 25.09.2011 12:00:00 --> 265.5
Die nachfolgende Rechenoperation ergibt bei

265.499988425923 \ 7  --> 37
265.5 \ 7                      --> 38

Und dagenau liegt der Hase im Pfeffer. Der Divisionsoperator rundet und zwar so, wie es in der _ Excel-2010 Vba-Hilfe steht:

Vor der Division werden die numerischen Ausdrücke in Ausdrücke der Typen Byte, Integer oder Long gerundet.
Gru0 von Luschi
aus klein-Paris
PS: so sollte die Funktion klappen:

Function udfCW(datDate As Date) As Long
Dim datTmp As Date
datTmp = DateSerial(Year(datDate + (8 - Weekday(datDate)) Mod 7 - 3), 1, 1)
udfCW = (Fix(datDate - datTmp - 3 + (Weekday(datTmp) + 1) Mod 7) \ 7) + 1
End Function

Anzeige
AW: VBA Kalenderwoche - welche Fnkt stimmt denn nun?
24.09.2011 11:48:45
Christian
Hi Luschi,
Danke für Hilfe!
siehe auch meine Antwort an Hajo. Die Funktion von Ramses kann allerdings Datumsangaben vor" 03.01.101" nicht verarbeiten, aber Datumsangaben vor 1976 sind bei DIN-KW eh Makulatur.
viele Grüße
Christian
AW: VBA Kalenderwoche - welche Fnkt stimmt denn nun?
24.09.2011 11:59:42
Hajo_Zi
Hallo Christian,
Excel kann erst Daten ab 1.1.1900 verarbeiten bzw. mit ein weng Aufwand. Siehe Excelformeln.de
Gruß Hajo
Anzeige
schön, aber der Datentyp "Date" in VBA ...
24.09.2011 12:05:12
Christian
... kann ein Datum im Bereich vom 01. Januar 100 bis zum 31. Dezember 9999 speichern, Hajo.
Tabelle interessiert mich hier nicht.
Grruß
Christian
Im Prinzip ist das alles ja richtig, aber es...
24.09.2011 18:15:53
Luc:-?
…gibt ein Wiederholungsintervall, mit dem man theoretisch jedes Datum vom Urknall bis zum Kollaps darstellen könnte (auch in der Tabelle), falls dabei die Schaltsekunden vernachlässigt wdn können.
Gruß + schöWE, Luc :-?
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

VBA-Funktionen zur Ermittlung der Kalenderwoche


Schritt-für-Schritt-Anleitung

Um die Kalenderwoche in Excel VBA zu ermitteln, kannst Du die folgenden Schritte befolgen:

  1. VBA-Editor öffnen: Drücke ALT + F11, um den VBA-Editor zu öffnen.

  2. Modul erstellen: Klicke mit der rechten Maustaste auf "VBAProject (DeineDatei.xlsx)" > Einfügen > Modul.

  3. Funktion einfügen: Kopiere eine der folgenden Funktionen in das Modul:

    Function udfCW(datDate As Date) As Long
       Dim datTmp As Date
       datTmp = DateSerial(Year(datDate + (8 - Weekday(datDate)) Mod 7 - 3), 1, 1)
       udfCW = (Fix(datDate - datTmp - 3 + (Weekday(datTmp) + 1) Mod 7) \ 7) + 1
    End Function

    oder

    Function DIN_KW(DasDatum As Date) As Byte
       Dim KW As Date
       KW = 4 + DasDatum - Weekday(DasDatum, 2)
       DIN_KW = (KW - DateSerial(Year(KW), 1, -6)) \ 7
    End Function
  4. Funktion verwenden: Du kannst die Funktion in einer Zelle verwenden, indem Du =udfCW(A1) oder =DIN_KW(A1) eingibst, wobei A1 das Datum enthält.


Häufige Fehler und Lösungen

  • Problem: Die Funktion gibt falsche Kalenderwochen zurück, wenn ein Zeitstempel am Sonntag übergeben wird.

    • Lösung: Übergebe das Datum als Ganzzahl oder verwende datDate = Int(datDate) in Deiner Funktion, um die Uhrzeit zu entfernen.
  • Problem: Die Funktion unterstützt keine Daten vor dem 03.01.1900.

    • Lösung: Beachte, dass Excel nur Daten ab dem 01.01.1900 verarbeiten kann. Für historische Daten sind andere Ansätze erforderlich.

Alternative Methoden

Falls Du nicht mit VBA arbeiten möchtest, kannst Du die folgende Excel-Formel verwenden, um die Kalenderwoche zu ermitteln:

=WEEKNUM(A1; 2)

Hierbei ist A1 die Zelle, die das Datum enthält. Der zweite Parameter 2 gibt an, dass die Woche am Montag beginnt, was der DIN-Norm entspricht.


Praktische Beispiele

  1. Kalenderwoche für ein bestimmtes Datum:

    • Wenn Du das Datum 25.09.2011 in Zelle A1 hast, gib in eine andere Zelle ein:
      =udfCW(A1) 
    • Dies gibt Dir die korrekte Kalenderwoche zurück.
  2. Verwendung der DIN-KW Funktion:

    • Für das gleiche Datum kannst Du auch:
      =DIN_KW(A1) 

Tipps für Profis

  • Achte darauf, dass die udfCW Funktion bei Zeitstempeln eine Rundung vornimmt. Es ist ratsam, die Zeit zu entfernen, bevor Du das Datum übergibst.
  • Verwende die Funktion WEEKNUM, wenn Du eine schnelle Lösung ohne VBA benötigst. Diese ist in Excel ab Version 2010 verfügbar.
  • Nutze die Funktionen in Kombination mit bedingten Formatierungen, um Kalenderwochen visuell hervorzuheben.

FAQ: Häufige Fragen

1. Wie kann ich die aktuelle Kalenderwoche ermitteln?
Du kannst die aktuelle Kalenderwoche mit der Funktion =udfCW(HEUTE()) oder =DIN_KW(HEUTE()) ermitteln.

2. Welche Funktion ist besser, udfCW oder DIN_KW?
Beide Funktionen liefern ähnliche Ergebnisse, jedoch kann DIN_KW in einigen Fällen genauer sein, insbesondere bei der Berücksichtigung von Sonderfällen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige