Ошибка переполнения с Mod в VBA, когда значение составляет миллиарды или больше

Я пытаюсь найти наибольший простой делитель числа x. Когда x меньше 1 миллиарда, мой код работает, но когда он больше 1 миллиарда, он дает ошибку переполнения, и отладка выделяет строку с модом в ней.

 Sub Largest_Divisor()
    Dim x As Double
    Dim Q As Integer
    Q = 0
    Dim L() As Double
    x = 999999999#
    Dim i As Double
    For i = 775145 To 3 Step -2
        If x Mod i = 0 Then
            If IsPrime(i) Then
                ReDim Preserve L(Q) As Double
                L(Q) = i
                Q = Q + 1
            End If
        End If
    Next i
    MsgBox (Application.Max(L))
 End Sub

person Boyd Johnson    schedule 01.11.2012    source источник
comment
Кто-нибудь думает, что вызывает ошибку переполнения?   -  person Boyd Johnson    schedule 01.11.2012
comment
возможный дубликат vba Run-Time Error 6   -  person RubberDuck    schedule 09.05.2014


Ответы (2)


Я подозреваю, что когда x превышает примерно 2 миллиарда, а точнее 2,147,483,648, у вас возникают проблемы.

Это связано с тем, что в соответствии с документацией mod возвращается не более long, значение которого варьируется от -2,147,483,648 до 2,147,483,647 в виде 32-битного значения со знаком. Это явно не указано в справочной документации, но аргументы mod, вероятно, также приводятся к long.

person A. Webb    schedule 01.11.2012
comment
Пожалуйста, добавьте ссылки на документацию. - person ; 01.11.2012

Хорошая работа может заключаться в использовании этой функции:

Function Modulus(int1 As Double, int2 As Double) As Double

' This function will return int1 Mod int2. It is useful when |int1| exceeds 
' 2,147,483,647 as the VBA Mod function will then break.
'

Dim myInt As Integer

myInt = Int(int1 / int2)

Modulus = int1 - (myInt * int2)

End Function
person user348731    schedule 15.02.2019