Clever-Excel-Forum

Normale Version: Typen unverträglich ?
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo
ich habe eine Funktion im Netz gefunden, die mir das Datum des Montags einer angegebenen Kalenderwoche zurückmeldet.
Also ich gebe ein "39" (.KW) und bekommen zurück: "27.09.2021". So weit so gut.
Nun möchte ich die Funktion aber mit einer Variablen aufrufen:
hier die Funktion

Public Function MontagKW(myKW As Long, Optional myJahr)
               ' gibt den Montag der übergebenen Kalenderwoche im übergebenen oder aktuellen Kalenderjahrzurück
Dim KWMon As Date
Dim aktKalenderwoche As Long
    If IsMissing(myJahr) Then myJahr = Year(Date)
    MontagKW = DateSerial(myJahr, 1, 1) + (myKW - 1) * 7
    MontagKW = MontagKW + 1 - Weekday(MontagKW, 2)
    If Format(MontagKW, "ww", 2, 2) <> myKW Then MontagKW = MontagKW + 7
End Function


übergeben werden muss also ein Parameter im Long-Format.
Mache ich auch:
         aktKalenderwoche = CLng(WorksheetFunction.WeekNum(Date, 21))
          MsgBox TypeName(aktKalenderwoche)              ---> liefert "Long"
          MsgBox (MontagKW(aktKalenderwoche))           ----> liefert "Argumenttype ByRef unverträglich"


Die Variable aktKalenderwoche ist im Long - Format, so wie es die Funktion haben möchte; das zeigt mir die erste MsgBox auch an.
Die zweite MsgBox bringt aber den Fehler "Argumenttype ByRef unverträglich" ???
Wieso kommt diese Fehlermeldung?

Hat jemand eine Idee und kann helfen?

Gruß
Statler
Hallo,

dem kann leicht abgeholfen werden:
MsgBox MontagKW((aktKalenderwoche))

Du musst also nur die Variable aktKalenderwoche in zusätzliche runde Klammern setzen bei der Wert-Übergabe an die Funktion MontagKW(...)
Dadurch wird VBA gezwungen, die Variable im Funktionsparameter im ByVal-Übergabeverfahren zu übernehmen. Es wird dadurch verhindert, dass eine Übergabe im ByRef-Verfahren erfolgt, was er offenbar nicht will.

Du kannst natürlich auch anstelle der zusätzlichen Klammerung beim Funktionsaufruf die Funktionsdeklaration ändern in:
Public Function MontagKW(ByVal myKW As Long, Optional ByVal myJahr)
Hallo,

da Du hier ByRef gar nicht benötigst und es auch nicht viel Sinn macht, würde ich lieber die Function ordentlich formulieren und anpassen als das Argument mit Klammern als ByRef zu erzwingen. Ich würde auch hier den Rückgabewert konkret definieren (da nichts anderes als ein Datum herauskommen kann):
Code:
Public Function MontagKW(ByVal myKW As Long, Optional ByVal myJahr) As Date
Prima. Vielen Dank für Eure Hilfe :)