Function aus Sub aufrufen

  • Excel

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von ralph_hoffmann.

    Function aus Sub aufrufen

    Hallo,

    ich habe in vorhandenen Beiträgen keine Lösung meines Problems gefunden.

    Ich rufe aus einem Sub XY() eine weitere Sub AB(c, d, e, f) auf. Im Sub AB möchte ich eine Function TageProMonat(ByVal Jahr as Long, Monat as Long) as Long aufrufen.

    Die Function ist korrekt programmiert in einem beliegen Tabellenbaltt kann ich die Funktion nutzen.

    Der Aufruf mit AnzahlTage = TageProMonat(Jahr, Monat) klappt jedoch nicht. Es wird mir die Fehlermeldung angezeigt, dass ein Sub oder eine Funktion diesen Namens nicht definiert ist.

    Was mache ich falsch?

    Gruß
    Ralph




    Hier der Code des Sub AB:

    Quellcode

    1. Sub Datei_neu(ByVal Pfad As String, Dateiname As String, Jahr As Variant, Monat As Variant)
    2. '
    3. '#################################################################
    4. '
    5. 'Variablen deklarieren
    6. '
    7. '#################################################################
    8. '
    9. Dim i As Long
    10. Dim AnzahlTage As Long
    11. Dim datei As String
    12. Dim Bereich1 As String
    13. Dim Bereich2 As String
    14. '
    15. '#################################################################
    16. '
    17. 'Variablen füllen
    18. '
    19. '#################################################################
    20. '
    21. datei = Pfad & Dateiname
    22. '
    23. '#################################################################
    24. '
    25. 'Neue Arbeitsmappe einfügen
    26. '
    27. '#################################################################
    28. '
    29. Workbooks.Add
    30. '
    31. '#################################################################
    32. '
    33. 'Neue Arbeitsmappe erstmals abspeichern
    34. '
    35. '#################################################################
    36. '
    37. With ActiveWorkbook
    38. .SaveAs (datei)
    39. '
    40. '#################################################################
    41. '
    42. 'Die Anzhal der Tabellenblätter auf 12 erhöhen
    43. '
    44. '#################################################################
    45. '
    46. For i = 1 To 12 - .Worksheets.Count
    47. .Worksheets.Add
    48. Next i
    49. '
    50. '#################################################################
    51. '
    52. 'Die Reiter der Tabellen umbenennen
    53. '
    54. '#################################################################
    55. '
    56. For i = 1 To 12
    57. Worksheets("Tabelle" & i).Name = MonthName(i)
    58. Next i
    59. '
    60. '#################################################################
    61. '
    62. 'Die Tabellenblätter sortieren
    63. '
    64. '#################################################################
    65. '
    66. Sheets("Januar").Select
    67. Sheets("Januar").Move Before:=Sheets(1)
    68. Sheets("Februar").Select
    69. Sheets("Februar").Move Before:=Sheets(2)
    70. Sheets("März").Select
    71. Sheets("März").Move Before:=Sheets(3)
    72. Sheets("April").Select
    73. Sheets("April").Move Before:=Sheets(4)
    74. Sheets("Mai").Select
    75. Sheets("Mai").Move Before:=Sheets(5)
    76. Sheets("Juni").Select
    77. Sheets("Juni").Move Before:=Sheets(6)
    78. Sheets("Juli").Select
    79. Sheets("Juli").Move Before:=Sheets(7)
    80. Sheets("August").Select
    81. Sheets("August").Move Before:=Sheets(8)
    82. Sheets("September").Select
    83. Sheets("September").Move Before:=Sheets(9)
    84. Sheets("Oktober").Select
    85. Sheets("Oktober").Move Before:=Sheets(10)
    86. Sheets("November").Select
    87. Sheets("November").Move Before:=Sheets(11)
    88. '
    89. '#################################################################
    90. '
    91. 'Spalten beschriften
    92. '
    93. '#################################################################
    94. '
    95. For i = 1 To 12
    96. .Worksheets(MonthName(i)).Select
    97. With .Worksheets(MonthName(i))
    98. .Cells(1, 1).Value = "Datum"
    99. .Cells(1, 2).Value = "Dienstzeit Beginn [h]"
    100. .Cells(1, 3).Value = "Dienstzeit Beginn [m]"
    101. .Cells(1, 4).Value = "Dienstzeit Ende [h]"
    102. .Cells(1, 5).Value = "Dienstzeit Ende [m]"
    103. .Cells(1, 6).Value = "Dienstzeit-Unterbrechung Anfang [h]"
    104. .Cells(1, 7).Value = "Dienstzeit-Unterbrechung Anfang [m]"
    105. .Cells(1, 8).Value = "Dienstzeit-Unterbrechnung Ende [h]"
    106. .Cells(1, 9).Value = "Dienstzeit-Unterbrechnung Ende [m]"
    107. .Cells(1, 10).Value = "Pause 30 Min."
    108. .Cells(1, 11).Value = "Pause 45 Min."
    109. .Cells(1, 12).Value = "Überstunden"
    110. .Cells(1, 13).Value = "Nachtstunden"
    111. .Cells(1, 14).Value = "Samstagstunden nach 13Uhr"
    112. .Cells(1, 15).Value = "Sonntagsstunden"
    113. .Cells(1, 16).Value = "Feiertagsstunden"
    114. End With
    115. Next i
    116. '
    117. '#################################################################
    118. '
    119. 'Datum Eintragen
    120. '
    121. '#################################################################
    122. '
    123. '
    124. '#################################################################
    125. '
    126. 'Die Datenbereiche zu Tabellen formatieren und
    127. 'Bereiche benennen
    128. '
    129. '#################################################################
    130. '
    131. For i = 1 To 12
    132. AnzahlTage = TageProMonat(Jahr, Monat)
    133. Bereich1 = "A1:P" & AnzahlTage + 1
    134. Bereich2 = "=" & MonthName(i) & "!" & "R1C1:R" & AnzahlTage + 1 & "C16"
    135. .Worksheets(MonthName(i)).Select
    136. With .Worksheets(MonthName(i))
    137. .Range(Bereich1).Select
    138. Selection.AutoFormat Format:=xlRangeAutoFormatClassic2, Number:=True, Font _
    139. :=True, Alignment:=True, Border:=True, Pattern:=True, Width:=True
    140. ActiveWorkbook.Names.Add Name:=MonthName(i), RefersToR1C1:=Bereich2
    141. .Range("A1").Select
    142. End With
    143. Next i
    144. End With
    145. '
    146. '######################################################################
    147. '
    148. 'Sub Ende
    149. '
    150. '######################################################################
    151. '
    152. End Sub




    Und hier der Code der Funktion:

    Quellcode

    1. Public Function TageProMonat(ByVal Jahr As Long, ByVal Monat As Byte) As Byte
    2. TageProMonat = Day(DateAdd("d", -1, DateSerial(Jahr, Monat + 1, 1)))
    3. End Function

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ralph_hoffmann“ ()

    Ist die Funktion im selben Modul bzw. Worksheet definiert.
    Ansonsten muss sie Public sein.

    Bemerkung am Rande:
    Der komplette Code ist extrem umständlich.
    Die Funktion AnzahlTage ist auch als Einzeiler darstellbar.

    Visual Basic-Quellcode

    1. Public Function AnzahlTage(ByVal Jahr As Long, ByVal Monat As Byte) As Byte
    2. AnzahlTage = Day(DateAdd("d", -1, DateSerial(Jahr, Monat + 1, 1)))
    3. End Function
    Auch das Hauptprogramm ließe sich bei entsprechender Programmierung auf einen Bruchteil entflechten.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hi petaod,

    danke für die Info, was die Länge des Funktionscodes angeht. Wo kann ich die DAY-Anweisung nachlesen. In der Hilfe meines Excel 2003 im Büro ist die DAY-Funktion so nicht erklärt.

    Nun zum Funktionsaufruf: Der klappt leider noch immer nicht. Ich erhalte immer noch die gleiche Fehlermeldung, dass die Function nicht deklariert ist.

    Die Funktion habe ich als AddIn in Excel eingebunden. Im Tabellenbaltt kann ich die Funktion nutzen.

    Gruß
    Ralph

    UPDATE 23.12.2011, 12:33:

    Jetzt klappt es! Habe rausgefunden, dass ich das AddIn "Benutzerdefinierte Funktionen" unter Verweise erst aktivieren muss!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ralph_hoffmann“ ()