Hallo Guidot,
schön, dass du mit den angegebenen Lösungen zufrieden bist,
ich wäre es nicht. Für nennenswerte Array-Größen sind nämlich
beide grausig ineffizient , weil für jede Lücke alle folgenden
Elemente kopiert werden, inklusive der überflüssig gewordenen
Kopien am Feldende.
ich sehe das so, wenn der Anfrager das makro mit einem Button startet und das Ergebnis ist einen Tick, eine Sekunde später da so ist das in Ordnung.
Dauert es länger kann er das sagen, dann wird versucht den Code zeitlich zu optimieren.
Dem war nicht der Fall.
Erinnert mich an die Sache mit dem Code um rauszufinden ob eine Zahl eine Primzahl ist oder nicht mittels einer VBa-Funktion.
Dieser im Rahmen eines Gesamtprojektes wo es noch um andere Funktionen wie Quersumme u.ä. ging.
Quersumme, eine dritte Funktion und den Gesamtcode habe ich selbst gebastelt, für Primzahl einen Code aus dem Internet gefischt, getestet und eingebaut.
Warum sollte ich mir da Gedanken machen etwas von 700 ms Dauer auf 350 ms dauer zu optimieren?
Nachstehend ist Code von Franz zum Primzahltest, meinste der wäre nötig gewesen in meinem Fall wo auch die „ineffiziente“ Primzahlfunktion dicke schnell genug ist?
Dito hier das mit den Arrays.
Array wandern. Der Schreibindex wird immer um 1 erhöht, der
Leseindex läuft schneller, weil er leere Elemente überspringen
darf.
Das würde mich interessieren, wieso wodurch, wie , überspringt da der LeseIndex Elemente, wie kriegt er raus daß sie leer sind?
Sobald der Leseindex das Ende des Felds erreicht, war’s
das. Die Implementierung überlasse ich VB-Nutzern als Übung…
Es geht um VBA, da gibt es manches nicht von VB wie diesen einen Pointer, weiß den Namen grad nicht.
Gruß
Reinhard
Function IsPrim(lngZahl As Long) As Boolean
Dim l As Long
Dim lMax As Long
Select Case lngZahl
Case 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 33, 37, 41, 43, 47, \_
53, 59, 61, 67, 71, 73, 79, 83, 89, 97
IsPrim = True
Exit Function
Case Else
If lngZahl Mod 2 = 0 Then Exit Function
If lngZahl Mod 3 = 0 Then Exit Function
If lngZahl Mod 5 = 0 Then Exit Function
If lngZahl Mod 7 = 0 Then Exit Function
If lngZahl Mod 11 = 0 Then Exit Function
If lngZahl Mod 13 = 0 Then Exit Function
If lngZahl Mod 17 = 0 Then Exit Function
If lngZahl Mod 19 = 0 Then Exit Function
If lngZahl Mod 23 = 0 Then Exit Function
If lngZahl Mod 29 = 0 Then Exit Function
If lngZahl Mod 33 = 0 Then Exit Function
If lngZahl Mod 37 = 0 Then Exit Function
If lngZahl Mod 41 = 0 Then Exit Function
If lngZahl Mod 43 = 0 Then Exit Function
If lngZahl Mod 47 = 0 Then Exit Function
If lngZahl Mod 53 = 0 Then Exit Function
If lngZahl Mod 59 = 0 Then Exit Function
If lngZahl Mod 61 = 0 Then Exit Function
If lngZahl Mod 67 = 0 Then Exit Function
If lngZahl Mod 71 = 0 Then Exit Function
If lngZahl Mod 73 = 0 Then Exit Function
If lngZahl Mod 79 = 0 Then Exit Function
If lngZahl Mod 83 = 0 Then Exit Function
If lngZahl Mod 89 = 0 Then Exit Function
If lngZahl Mod 97 = 0 Then Exit Function
End Select
lMax = CLng(lngZahl ^ 0.5)
For l = 101 To lMax Step 10
If lngZahl Mod l = 0 Then Exit Function
Next
For l = 103 To lMax Step 10
If lngZahl Mod l = 0 Then Exit Function
Next
For l = 107 To lMax Step 10
If lngZahl Mod l = 0 Then Exit Function
Next
For l = 109 To lMax Step 10
If lngZahl Mod l = 0 Then Exit Function
Next
IsPrim = (l \> lMax - 1)
End Function