222 Aufrufe
Gefragt in Tabellenkalkulation von

Hallo liebe Forenmitglieder

Ich versuche gerade eine Excel vba Function zu schreiben, die mir anhand eines Datums in einer Zelle  oder des Monatsnamens z.B. Januar, februar usw. die Anzahl Kalendertage berechnet und in einer Zelle im Tabellenblatt ausgibt.

So möchte ich später mit Kalendertagen rechnen.

Dazu habe ich folgenden VBA Code eingegeben:

Function Kalendertage(Monat As Range, Datum As Range) As Double
'Berechnet anhand eines Monatnamens oder Datums die Anzahl Kalendertage!
If Monat = True Then
    Select Case Monat
        Case "Januar", "März", "Mai", "Juli", "August", "Oktober", "Dezember"
            Kalendertage = CDbl(31)
        Case "Februar"
            Kalendertage = CDbl(28)
        Case "April", "Juni", "September", "November"
            Kalendertage = CDbl(30)
    End Select
End If
If Datum = True Then
    Dim m As Integer
        m = Month(Datum)
        
        Select Case m
            Case Is = 1, 3, 5, 7, 8, 10, 12
                Kalendertage = CDbl(31)
            Case Is = 2
                Kalendertage = CDbl(28)
            Case Is = 4, 6, 9, 11
                Kalendertage = CDbl(30)
        End Select
End If
End Function

Leider bekomme ich als Ergebnis der Berechnung immer in der Zelle von Excel ' #Wert ' angezeigt.

Leider konnte ich nicht herausfinden, wo das Problem liegt. Vielleicht schaut sich das ja mal jemand an und findet eine passende Lösung meines Problems. Das Wäre super.

Gebe ich die Select Case Anweisung direkt in eine Sub Prozedur in einem CommandButton auf dem Tabellenblatt ein funktioniert alles.

Der Code selber befindet sich dabei in meiner Makro-Arbeitsmappe, die ich als Excel vla Datei (Excel-Add-In) Datei immer beim Start von Excel ausführe. Excel Version ist noch Excel 2003

3 Antworten

0 Punkte
Beantwortet von

Guten Morgen,

Am Select Case  liegt es nicht

aber deine Abfrage mit der alternativen Eingabe von Monat als Namen oder Datum über 2 verschieden Eingabevariablen funktioniert so nicht

IF Monat = True  schaut nicht ob die Variable gesetzt ist, sondern ob sie gleich dem Wert True ist (was sie ja nicht ist weil ja z.B. April drinnen steht und April <> True)

ich würde es so versuchen 

Function Kalendertage(myInput As Range) As Double
'Berechnet anhand eines Monatnamens oder Datums die Anzahl Kalendertage!

Select Case myInput
    Case "Januar", "März", "Mai", "Juli", "August", "Oktober", "Dezember"
            Kalendertage = CDbl(31)
    Case "Februar"
            Kalendertage = CDbl(28)
    Case "April", "Juni", "September", "November"
            Kalendertage = CDbl(30)
    Case Else
    Dim m As Integer
        m = Month(Datum)
        
        Select Case m
            Case Is = 1, 3, 5, 7, 8, 10, 12
                Kalendertage = CDbl(31)
            Case Is = 2
                Kalendertage = CDbl(28)
            Case Is = 4, 6, 9, 11
                Kalendertage = CDbl(30)
        End Select
End Select

End Function

0 Punkte
Beantwortet von
Bearbeitet
Monatsname oder Datum als Übergabeparameter!

Function TageImMonat(Optional ByVal eingabe As Variant) As Integer
    Dim monat As Integer
    Dim jahr As Integer
    jahr = Year(Date)
    If IsDate(eingabe) Then
        monat = Month(CDate(eingabe))
    Else
        Select Case LCase(eingabe)
            Case "januar": monat = 1
            Case "februar": monat = 2
            Case "märz": monat = 3
            Case "april": monat = 4
            Case "mai": monat = 5
            Case "juni": monat = 6
            Case "juli": monat = 7
            Case "august": monat = 8
            Case "september": monat = 9
            Case "oktober": monat = 10
            Case "november": monat = 11
            Case "dezember": monat = 12
            Case Else: Exit Function
        End Select
    End If
    TageImMonat = Day(DateSerial(jahr, monat + 1, 0))
End Function

oder auch so!

Function TageImMonat(Optional ByVal eingabe As Variant) As Integer
    Dim monat As Integer, jahr As Integer
    jahr = Year(Date)
    If IsDate(eingabe) Then
        monat = Month(CDate(eingabe))
    Else
        monat = Month(DateValue("01." & eingabe & "." & jahr))
    End If
    TageImMonat = Day(DateSerial(jahr, monat + 1, 0))
End Function

Oder als Formel ,Datum oder Monatsname in A1

=WENNFEHLER(TAG(DATUM(JAHR(HEUTE());VERGLEICH(A1;{"Januar";"Februar";"März";"April";"Mai";"Juni";"Juli";"August";"September";"Oktober";"November";"Dezember"};0) + 1;0));TAG(DATUM(JAHR(A1); MONAT(A1) + 1; 0)))
0 Punkte
Beantwortet von
Bearbeitet
In Vba wäre dann auch diese Variante möglich!

A1 Monatsname oder Datum B1 Ausgabe

Sub MonatsTage()
Range("B1").FormulaLocal = "=WENNFEHLER(TAG(DATUM(JAHR(HEUTE());VERGLEICH(A1;{""Januar"";""Februar"";""März"";""April"";""Mai"";""Juni"";""Juli"";""August"";""September"";""Oktober"";""November"";""Dezember""};0) + 1;0));TAG(DATUM(JAHR(A1); MONAT(A1) + 1; 0)))"
End Sub

Als Wert!

In Deutsch mag es der Vb Editor nicht so gern,daher Englich!

Dim MonatsTage as Integer

MonatsTage = Application.Evaluate("IFERROR(DAY(DATE(YEAR(TODAY()),MATCH(A1,{""Januar"",""Februar"",""März"",""April"",""Mai"",""Juni"",""Juli"",""August"",""September"",""Oktober"",""November"",""Dezember""},0) + 1,0)),DAY(DATE(YEAR(A1), MONTH(A1) + 1, 0)))")
...