Zur Zeit arbeite ich an einem privaten Projekt: Ich überlege mir für viele mathematische Zusammenhänge, wie sie mit VBA lösbar sind. Ich mache das einfach, weil es mir Spaß macht. Und teilweise nützt es mir auch bei meinen „nützlichen“ Projekten.
Die Fälle, bei denen es in VBA schon Funktionen gibt (z. B. Sin, Cos, Abs), werde ich natürlich nicht behandeln. Sie sind in der VB-Hilfe unter dem Stichwort „Mathematische Funktionen“ zu finden.
Hier sind die Sachen, die ich bisher gemacht habe:
Primzahlen und Primfaktorzerlegung
Eine Primzahl ist eine Zahl, die nicht mehr und nicht weniger als zwei Teiler hat: 1 und die Zahl selbst. Da es unendlich viele Primzahlen gibt, benutze ich ein Array, in das während der Laufzeit so viele Werte wie nötig hinzugefügt werden.
Um möglichst große Zahlen verarbeiten zu können, habe ich „Double“ gewählt. Da Primzahlen jedoch nur ganze, positive Zahlen sein können, lasse ich für Parameter nur solche Werte zu bzw. runde Werte. Und dass „Double“ nur 15 signifikante Stellen zulässt, führt dazu, dass ab 10^15 keine korrekten Werte herauskommen, somit lasse ich auch für diese Fälle eine Fehlermeldung erscheinen.
Die Fälle, bei denen es in VBA schon Funktionen gibt (z. B. Sin, Cos, Abs), werde ich natürlich nicht behandeln. Sie sind in der VB-Hilfe unter dem Stichwort „Mathematische Funktionen“ zu finden.
Hier sind die Sachen, die ich bisher gemacht habe:
Primzahlen und Primfaktorzerlegung
Eine Primzahl ist eine Zahl, die nicht mehr und nicht weniger als zwei Teiler hat: 1 und die Zahl selbst. Da es unendlich viele Primzahlen gibt, benutze ich ein Array, in das während der Laufzeit so viele Werte wie nötig hinzugefügt werden.
Um möglichst große Zahlen verarbeiten zu können, habe ich „Double“ gewählt. Da Primzahlen jedoch nur ganze, positive Zahlen sein können, lasse ich für Parameter nur solche Werte zu bzw. runde Werte. Und dass „Double“ nur 15 signifikante Stellen zulässt, führt dazu, dass ab 10^15 keine korrekten Werte herauskommen, somit lasse ich auch für diese Fälle eine Fehlermeldung erscheinen.
Visual Basic-Quellcode
Visual Basic-Quellcode
- Function teilbar(a As Double, b As Double) As Boolean
- 'Gibt zurück, ob a durch b teilbar ist.
- If a < 0 Or b < 0 Or 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
- teilbar = (Round(a - Int(a / b) * b, 0) = 0)
- End Function
- Sub PrimInit()
- 'Dient zur Festlegung von Anfangswerten, wenn "PrimArray" und "PrimIndex" noch nicht dimensioniert sind.
- Dim x As Double
- On Error GoTo Leer
- x = UBound(PrimArray)
- Exit Sub
- Leer:
- ReDim PrimIndex(1 To 2)
- PrimIndex(1) = 0
- PrimIndex(2) = 1
- ReDim PrimArray(1 To 1)
- PrimArray(1) = 2
- End Sub
- Function Primzahl(Zahl As Double) As Boolean
- 'Gibt zurück, ob "Zahl" eine Primzahl ist.
- Dim i As Double
- If Zahl < 0 Or CStr(Zahl) <> CStr(Int(Zahl)) Or Zahl >= 10 ^ 15 Then MsgBox "Ungültiger Parameterwert!", vbCritical: Stop
- PrimInit
- Primzahl = True
- If Zahl <= 1 Then
- Primzahl = False
- ElseIf UBound(PrimIndex) < Zahl Then
- For i = 1 To PrimzahlNr(Int(Sqr(Zahl)))
- If teilbar(Zahl, Primzahlen(i)) Then
- Primzahl = False
- Exit For
- End If
- Next
- Else
- Primzahl = (PrimArray(PrimIndex(Zahl)) = Zahl)
- End If
- End Function
- Sub PrimzahlPrüf()
- 'Prüft, ob die erste noch nicht geprüfte Zahl eine Primzahl ist
- 'und füllt "PrimArray" und "PrimIndex" entsprechend auf.
- If Primzahl(UBound(PrimIndex) + 1) Then
- ReDim Preserve PrimArray(1 To UBound(PrimArray) + 1)
- PrimArray(UBound(PrimArray)) = UBound(PrimIndex) + 1
- End If
- ReDim Preserve PrimIndex(1 To UBound(PrimIndex) + 1)
- PrimIndex(UBound(PrimIndex)) = UBound(PrimArray)
- End Sub
- Function Primzahlen(Index As Double) As Double
- 'Liefert die Primzahl an der Stelle "Index". Primzahlen(100) liefert die 100. Primzahl.
- Dim p As Boolean
- If Index < 1 Or CStr(Index) <> CStr(Int(Index)) Or Index >= 10 ^ 15 Then MsgBox "Ungültiger Parameterwert!", vbCritical: Stop
- PrimInit
- While UBound(PrimArray) < Index
- PrimzahlPrüf
- Wend
- Primzahlen = PrimArray(Index)
- End Function
- Function PrimzahlNr(Zahl As Double) As Double
- 'Liefert die Primzahl-Index-Nr. der größten Primzahl, die kleiner oder gleich "Zahl" ist.
- Dim p As Boolean
- If Zahl < 1 Or CStr(Zahl) <> CStr(Int(Zahl)) Or Zahl >= 10 ^ 15 Then MsgBox "Ungültiger Parameterwert!", vbCritical: Stop
- PrimInit
- While UBound(PrimIndex) < Zahl
- PrimzahlPrüf
- Wend
- PrimzahlNr = PrimIndex(Zahl)
- End Function
- Function PrimzahlArray(Typ As PrimArrayTyp, von As Double, bis As Double) As Variant
- 'Liefert ein Array, das die Primzahlen zwischen "von" und "bis" enthält.
- 'Wenn "nachNr" ausgewählt wird, liefert es mit von=1 und bis=100 die ersten 100 Primzahlen.
- 'Wenn "nachPrimzahl" ausgewählt wird, liefert es mit von=1 und bis=100 die Primzahlen bis 100.
- Dim p() As Double
- Dim v As Double, i As Double
- If Typ = nachPrimzahl Then
- v = PrimzahlNr(von)
- If v = 0 Then v = 1
- If Primzahlen (v) < von Then v = v + 1
- von = v
- bis = PrimzahlNr(bis)
- End If
- If bis < von Then
- PrimzahlArray = Split("", " ")
- Else
- ReDim p(bis - von)
- For i = von To bis
- p(i - von) = Primzahlen(i)
- Next
- PrimzahlArray = p
- End If
- End Function
- Function PrimzahlAnzahl(von As Double, bis As Double) As Double
- 'Liefert die Anzahl der Primzahlen zwischen "von" und "bis".
- PrimzahlAnzahl = UBound(PrimzahlArray(nachPrimzahl, von, bis)) + 1
- End Function
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „roddy“ ()