更新済み 解決後にこのポストをクリーンアップします。要約すると、次の最高の素数(=NextHighestPrimeNumber(100)
が101
を返す)を計算したExcelのユーザー定義の式を作成していました。私が実験を始めたとき、私はこの数式が約21億の誤差になることに気付きました。私はそれが私の変数に接続されていると思ったので、私はDOUBLEを試しましたが、まだエラーがありました。それは以前にダブルのように定義またはハードコード化された番号である場合であっても、VBA MOD機能は常に LONG変数に分子を変換しているためMOD関数は、Excel VBAで長い変数を排他的に使用します。
Function NextHighestPrimeNumber(StartingNumber As Double) As Variant
Dim CeilingTest As Long
Dim i As Long
If StartingNumber < 11 Then
If StartingNumber > 6 Then
NextHighestPrimeNumber = 11
ElseIf StartingNumber > 4 Then
NextHighestPrimeNumber = 7
ElseIf StartingNumber > 2 Then
NextHighestPrimeNumber = 5
ElseIf StartingNumber > 0 Then
NextHighestPrimeNumber = 3
ElseIf StartingNumber = 0 Then
NextHighestPrimeNumber = 1
Else
NextHighestPrimeNumber = "Pick A Positive Integer"
End If
Exit Function
Else
'Create Array
ReDim Prime_Array(0 To 4) As Double
GoTo StartArrayPopulate
DoneWithStartingArray:
If StartingNumber Mod 2 = 0 Then
StartingNumber = StartingNumber - 1
End If
NewNumber:
StartingNumber = StartingNumber + 2
CeilingTest = Int(VBA.Sqr(StartingNumber))
'Array loop
For i = LBound(Prime_Array) To UBound(Prime_Array)
If Prime_Array(i) > CeilingTest Then
NextHighestPrimeNumber = StartingNumber
Exit Function
ElseIf StartingNumber Mod Prime_Array(i) = 0 Then GoTo NewNumber
End If
Next i
'Add new Array Value
ExpandDim:
ReDim Preserve Prime_Array(UBound(Prime_Array) + 1)
Prime_Array(UBound(Prime_Array)) = NextHighestPrimeNumber(Prime_Array(UBound(Prime_Array) - 1))
'test if bigger than cieling
If Prime_Array(UBound(Prime_Array)) > CeilingTest Then
NextHighestPrimeNumber = StartingNumber
Exit Function
ElseIf StartingNumber Mod Prime_Array(UBound(Prime_Array)) = 0 Then GoTo NewNumber
Else
GoTo ExpandDim
End If
End If
Exit Function
StartArrayPopulate:
Prime_Array(0) = 3
Prime_Array(1) = 5
Prime_Array(2) = 7
Prime_Array(3) = 11
Prime_Array(4) = 13
GoTo DoneWithStartingArray
End Function
* "9,223,372,036,854,775,807までの範囲を持つ必要がありますLONG変数" *: 'ZZコードを失敗したとのフラグが立てられたエラーを投げました。後者では、long型は4バイトです。 –
"ロングは、-2,147,483,648から 2,147,483,647までの範囲の4バイト(32ビット)です。MSDNでこの定義はどこで見つかりましたか? [チップピアソン](https://www.pcreview.co.uk/threads/vba-long-data-type-overflow.959041/) – pnuts
明らかに、VB.NETの参考資料を参考にしています。代わりに[VBAリファレンス](https://msdn.microsoft.com/en-us/library/aa263420(VS.60).aspx)を参照してください。 – GSerg