Funktion in einer Funktion

  • Excel

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Funktion in einer Funktion

    Hallo Zusammen ich möchte eine Funktion in einer Funktion aufrufen, leider verlässt das Programm vorzeitig die schleife ? :huh:

    Sehe den Grund nicht

    Visual Basic-Quellcode

    1. Private Function Quersumme(Zahl As String) As Integer
    2. Dim Längelen As Double
    3. Dim Summe As Double
    4. Dim Längestart As Double
    5. 'Bestimmt die Länge Zahlenfolge
    6. Längelen = Len(Zahl)
    7. 'Berechnung der Quersumme
    8. For Längestart = 1 To Längelen
    9. If InStr("0123456789", Mid(Zahl, Längestart, 1)) Then
    10. Quersumme = Mid(Zahl, Längestart, 1)
    11. Summe = Summe + Quersumme
    12. Else
    13. Quersumme = "#Value"
    14. End If
    15. Next Längestart
    16. Quersumme = Summe
    17. Return
    18. End Function
    19. Public Function Querbereich(bereich As Range) As Long
    20. Dim Zelle As Range
    21. With Worksheets("Tabelle1")
    22. Set bereich = Range("B1:c2")
    23. Set Zelle = Range("B1:C2")
    24. For Each Zelle In bereich
    25. If IsNumeric(Zelle) Then
    26. Zelle = Quersumme(Zelle.Value)
    27. End If
    28. Querbereich = Zelle
    29. Next Zelle
    30. End With
    31. End Function
    Umlaute vermeide ich grundsätzlich beim Programmieren, es sei denn es handelt sich um auszugebenen Text. Wofür ist das Return?

    Dim Zelle as Range, Set Zelle = Range..., for each Zelle in bereich und dann Querbereich=Zelle, wo doch ein long ausgegeben werden soll (function....()as long) ?

    Ich kenne es eher so:
    For each Zelle in bereich.cells
    ...
    next
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    Das return ist unwichtig, es müssen noch ein paar Sachen geändert werden.Nach start der quersummen funktion, wird die schleife nicht weiter ausgeführt. For each zelle in bereich?

    Hab das Problem gefunden :D

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

    Simono schrieb:

    Das return ist unwichtig
    Das Return ist syntaktisch falsch an dieser Stelle.
    Das müsste eigentlich die Fehlermeldung "Return ohne GoSub" auslösen.
    In Excel-VBA ist der vorzeitige Aussprung aus einer Funktion mit Exit Function zu definieren.
    Return ist ein Überbleibsel aus uralten Zeiten, wo noch mit GoSub gearbeitet wurde.

    Zugegeben, es ist verwirrend, da das Return in VB.Net wieder auflebte und dort anders eingesetzt wird.
    Aber so ist nun mal.

    Mach das Return raus (oder ersetze es durch Exit Function).
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Visual Basic-Quellcode

    1. Private Function Quersumme(Zahl As String) As Integer
    2. Dim Längelen As Double
    3. Dim Summe As Double
    4. Dim Längestart As Double
    5. 'Bestimmt die Länge Zahlenfolge
    6. Längelen = Len(Zahl)
    7. 'Berechnung der Quersumme
    8. For Längestart = 1 To Längelen
    9. If InStr("0123456789", Mid(Zahl, Längestart, 1)) Then
    10. Quersumme = Mid(Zahl, Längestart, 1)
    11. Summe = Summe + Quersumme
    12. Else
    13. Quersumme = "#Value"
    14. End If
    15. Next Längestart
    16. Quersumme = Summe
    17. End Function
    18. 'Bereichsfunktion Quersumme
    19. Public Function Querbereich(bereich As Range) As Integer
    20. Dim Zelle As Range
    21. Dim Summe As Integer
    22. Application.ScreenUpdating = False
    23. With Worksheets("Tabelle1")
    24. Set bereich = Range("B1:C2")
    25. Set Zelle = Range("B1:C2")
    26. For Each Zelle In bereich
    27. If IsNumeric(Zelle.Value) Then
    28. Querbereich = Quersumme(Zelle.Value)
    29. Summe = Summe + Querbereich
    30. End If
    31. Next Zelle
    32. Querbereich = Summe
    33. Application.ScreenUpdating = True
    34. End With
    35. End Function

    Danke petaod! der Code funktioniert jetzt. Ich habe jetzt das Problem mit dem Range.
    Die berechnung klappt.Nur ich hatte mir vorgestellt das er nur den bereich der Selection als Berechnungsparameter mit einbezieht.
    Leider klappt das noch nicht.
    Und wenn ich einen zu großen bereich angebe stürzt Excel ab z.B Range("A:Z").

    Simono schrieb:

    Und wenn ich einen zu großen bereich angebe stürzt Excel ab z.B Range("A:Z").
    Versuch's mal mit Intersect(UsedRange,Range("A:Z"))
    Falls dein UsedRange auch unsauber ist, musst du den tatsächlich notwendigen Bereich vorher rausfinden.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dani=mc^2 schrieb:

    Geht das nicht in einem Visual Basic-Quellcode
    Lies meine Erklärung in Post#4

    Simono schrieb:

    nur den Ausgewählten Bereich
    Der heisst "Selection".
    Das kannst du bei Bedarf ebenfalls per Intersect mit anderen Ranges kombinieren.
    Intersect(Selection,UsedRange,Range("A:Z")) oder Intersect(UsedRange,Selection)
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Selection ist auch nichts anderes als ein Range.
    Wenn's mit einer Range-Angabe funktioniert, tut's auch mit einer anderen.
    Der Bereich muss natürlich zum Zeitpunkt des Aufrufs selektiert sein.

    Lass dir mal ​Bereich.Address anzeigen, dann siehst du, was alles durchlaufen wird.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    es wird die ausgewählte Zelle als Bezug genommen wo die Formel eingegeben wird nicht der ausgewählte bereich.

    Set bereich = Application.Intersect(ActiveSheet.UsedRange, Selection)
    Set Zelle = Application.Intersect(ActiveSheet.UsedRange, Selection)
    Was steht in Selection.Address? Eine einzelne Zelle?
    Dann wird zwischen dem Auswählen des Bereichs und der Ausführung, Selection irgendwo überschrieben.

    Startest du es über einen Button?
    Setze da die Eigenschaft TakeFocusOnClick auf False.
    Und überprüfe allen Code, der zwischen Auswählen des Bereichs und deiner Verarbeitung steht.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --