Private Declare Function timeGetTime Lib "winmm.dll" () As Long
' ---Test1
Sub aTest()
Dim m&, n&, k&, a&, b&, arr(), t1
t1 = timeGetTime
ReDim arr(1 To 65536)
k = 1
Range("D2:D" & Range("D65536").End(xlUp).Row + 1).Clear
For a = 2 To [A2]
n = a \ 2
For b = 2 To n
If a Mod b = 0 Then Exit For
Next b
If b > n Then
arr(k) = a
k = k + 1
End If
Next a
ReDim Preserve arr(1 To k - 1)
Range("D2:D" & k) = Application.Transpose(arr)
Debug.Print timeGetTime - t1 & "ms"
End Sub
'--- Test 2
Sub Emily_230606()
Dim m&, n&, k&, a&, b&, arr(), t1
t1 = timeGetTime
ReDim arr(1 To 65536)
k = 2
arr(1) = 2
Range("E2:E" & Range("E65536").End(xlUp).Row + 1).Clear
For a = 3 To [A2]
If IsPrime(a) Then
arr(k) = a
k = k + 1
End If
Next a
ReDim Preserve arr(1 To k - 1)
Range("E2:E" & k) = Application.Transpose(arr)
Debug.Print timeGetTime - t1 & "ms"
End Sub
'
Function IsPrime(TestNumber As Long) As Boolean
Dim Count As Long
Dim Half As Long
If (TestNumber Mod 2) = 0 Then
Exit Function
End If
Half = Sqr(TestNumber)
For Count = 3 To Half Step 2
If (TestNumber Mod Count) = 0 Then
Exit Function
End If
Next
IsPrime = True
End Function
'
'
' A1 = 100000
' P3 800MHz
Test1 ---> 42852ms
Test2 ---> 470ms