Public Declare Function timeGetTime Lib "winmm.dll" () As Long
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub Main()
  Const MAX_PRIMES As Long = 20000
  Dim MaxN As Long
  Dim Primes(0 To MAX_PRIMES) As Long:Dim ETbl() As Boolean
  Dim I As Long, J As Long:Dim PrimeCnt As Long:Dim TimeCnt As Long
  
  Primes(0) = 2:Sleep 1500:TimeCnt = timeGetTime
  MaxN = Round(10 * MAX_PRIMES * Log(MAX_PRIMES))
  ReDim ETbl(0 To MaxN)
  For I = 2 To Round(Sqr(MaxN))
    For J = 2 To (MaxN \ I)
      ETbl(I * J) = True
    Next J
  Next I
  For I = 2 To MaxN - 1 Step 1
    If Not ETbl(I) Then
      Primes(PrimeCnt) = I
      PrimeCnt = PrimeCnt + 1
      If PrimeCnt > MAX_PRIMES Then Exit For
    End If
  Next I
  
  TimeCnt = timeGetTime() - TimeCnt
  MsgBox TimeCnt
End Sub