Discussion:
Funktion KW-Ermittlung - Wert bei leeren Zellen unterdrücken
(zu alt für eine Antwort)
Stefan Theobald
2010-01-13 18:13:01 UTC
Permalink
***@all!

ich habe mir die Funktion zum ermitteln der Kalenderwoche nach DIN-Norm in
meine Arbeitsmappe gemacht.
Diese funktioniert auch - nur bin ich noch nicht ganz glücklich.
Kopiert man die Formel weiter runter, und die Zellen sind leer, wird immer
52 reingeschrieben.
Ich wollte das mit dem "If IsDate(dat) = True Then" unterdrücken, aber das
interessiert den garnicht. DAT wüsste doch der Wert sein, der an die Funktion
übergeben wird - oder bin ich da falsch?

Wie kann ich es also unterdrücken, dass bei leeren Zellen ein icht
gewünschter Wert erscheint?



Gruß
Stefan


Function DINKW(dat As Date) As Integer

'Aufruf / Verwendun: =MAPPE.XLS!DINKW(A1)

'Bei der Berechnung der Kalenderwoche gibt XL scheinbar ein falsches
Ergebnis aus.
'Wie wird die Kalenderwoche richtig berechnet?
'XL berechnet die Kalenderwoche standardmäßig nach amerikanischer Norm.
'Für Deutschland gilt die internationale Norm ISO 8601 (1973).
'1976 wurde festgelegt, dass die Woche mit dem Montag beginnt:
'DIN 1355 (1974), DIN EN 28601 (1993). Dies bedeutet für die Berechnung der
Kalenderwoche:
'Der 1. Januar eines Jahres gehört erst dann zur ersten Kalenderwoche,
'wenn dieser Tag auf einen Montag, Dienstag, Mittwoch oder Donnerstag fällt.
'Falls der 1. Januar ein Freitag, Samstag oder Sonntag ist, zählt er noch
zur letzten Kalenderwoche
'des vorherigen Jahres. Weiterhin können der 29., 30. und 31.12. eines Jahres
'schon zur 1. Kalenderwoche des neuen Jahres gehören.

If IsDate(dat) = True Then

Dim kw As Integer

kw = Int((dat - DateSerial(Year(dat), 1, 1) + _
((Weekday(DateSerial(Year(dat), 1, 1)) + 1) _
Mod 7) - 3) / 7) + 1

If kw = 0 Then

kw = DINKW(DateSerial(Year(dat) - 1, 12, 31))

ElseIf kw = 53 And (Weekday(DateSerial(Year(dat), 12, 31)) - 1) Mod
7 <= 3 Then

kw = 1

End If

DINKW = kw

Else

DINKW = 0

End If

End Function
Claus Busch
2010-01-13 18:28:34 UTC
Permalink
Hallo Stefan,
Post by Stefan Theobald
ich habe mir die Funktion zum ermitteln der Kalenderwoche nach DIN-Norm in
meine Arbeitsmappe gemacht.
Diese funktioniert auch - nur bin ich noch nicht ganz glücklich.
Kopiert man die Formel weiter runter, und die Zellen sind leer, wird immer
52 reingeschrieben.
Ich wollte das mit dem "If IsDate(dat) = True Then" unterdrücken, aber das
interessiert den garnicht. DAT wüsste doch der Wert sein, der an die Funktion
übergeben wird - oder bin ich da falsch?
du rufst doch deine Funktion in einer Zelle auf. Ändere dort die Formel zu:
=WENN(A1="";"";DINKW(A1))


Mit freundlichen Grüssen
Claus Busch
--
Win XP PRof SP2 / Vista Ultimate SP2
Office 2003 SP2 /2007 Ultimate SP2
Andreas Killer
2010-01-14 08:11:43 UTC
Permalink
On 13 Jan., 19:13, Stefan Theobald
Post by Stefan Theobald
ich habe mir die Funktion zum ermitteln der Kalenderwoche nach DIN-Norm in
meine Arbeitsmappe gemacht.
Speicher Dir mal diese ab:

Function KW(ByVal Datum As Date) As Integer
'Liefert die Kalenderwoche für Datum
Dim T As Long
T = DateSerial(Year(Datum + (8 - Weekday(Datum)) Mod 7 - 3), 1, 1)
KW = ((Datum - T - 3 + (Weekday(T) + 1) Mod 7)) \ 7 + 1
End Function
Post by Stefan Theobald
Wie kann ich es also unterdrücken, dass bei leeren Zellen ein icht
gewünschter Wert erscheint?
Die Abfrage ist schon richtig, aber wenn Du "nichts" zurückgeben
willst, dann musst Du den Rückgabewert der Function ändern:

Function KW(ByVal Datum As Range) As Variant
'Liefert die Kalenderwoche für Datum oder "" wenn Zelle leer/Datum
ungültig
Dim T As Long
If Not IsDate(Datum) Then
KW = ""
Else
T = DateSerial(Year(Datum + (8 - Weekday(Datum)) Mod 7 - 3), 1, 1)
KW = ((Datum - T - 3 + (Weekday(T) + 1) Mod 7)) \ 7 + 1
End If
End Function

Oder Du folgst Claus Beispiel und machst ein WENN drumrum.

Andreas.

Loading...