Hallo Mase,
vielen Dank für Deine Antwort.
Die angegebene Funktion benötigt noch eine weitere Funktion Divisionsrest(). Wenn ich ParamArray durch byRef ersetze, entsteht in der 4. letzten Zeile:
ggT = ggT(ggT, Zahl(i))
eine Fehlermeldung. Ich vermute, ParamArray wird benötigt und ich habe mit dem Funktionsaufruf in ggTest() einen Fehler.
Hier der gesamte code mit Divisionsrest():
Sub ggTTest()
Dim Zahl(1) As Variant
Zahl(0) = 12
Zahl(1) = 33
Debug.Print ggT(Zahl())
End Sub
Function Divisionsrest(a As Double, b As Double) As Double
'Liefert den Divisionsrest von "a / b". Entspricht "a Mod b", jedoch auf "Double"-Ebene.
If CStr(a) <> CStr(Int(a)) Or CStr(b) <> CStr(Int(b)) Or a >= 10 ^ 15 Or b >= 10 ^ 15 Then MsgBox "Ungültiger Parameterwert!", vbCritical: Stop
Divisionsrest = Round(a - Int(a / b) * b, 0)
End Function
Function ggT(ByRef Zahl() As Variant) As Double
'Liefert den größten gemeinsamen Teiler der "Zahl"-Werte.
Dim i As Integer, ungültig As Boolean
Dim a As Double, b As Double, Rest As Double
ungültig = (UBound(Zahl) = -1)
For i = 0 To UBound(Zahl)
ungültig = (ungültig Or Zahl(i) <= 0 Or CStr(Zahl(i)) <> CStr(Int(Zahl(i))) Or Zahl(i) >= 10 ^ 15)
Next
If ungültig Then MsgBox "Ungültiger Parameterwert!", vbCritical: Stop
Select Case UBound(Zahl)
Case 0: ggT = Zahl(0)
Case 1
If Zahl(0) > Zahl(1) Then
a = Zahl(0): b = Zahl(1)
Else
a = Zahl(1): b = Zahl(0)
End If
Do
Rest = Divisionsrest(a, b)
If Rest = 0 Then Exit Do
a = b
b = Rest
Loop
ggT = b
Case Else
ggT = Zahl(0)
For i = 1 To UBound(Zahl)
ggT = ggT(ggT, Zahl(i))
Next
End Select
End Function
Vidul
|