При использовании этой пользовательской функции (MultiplyBigNumbers) на листе возникает ошибка.Что-то не так с кодом или синтаксисом? - PullRequest
0 голосов
/ 28 января 2019

Я написал код (пользовательская функция Excel VBA) для умножения больших чисел и отображения правильного результата в строковом формате.Но, кажется, что-то не так с этим кодом, который я не могу понять.

изображение для лучшего понимания логики.

enter image description here

На рисунке выше показаны два случая.Порядок матрицы будет меняться в зависимости от количества цифр.Кроме того, номер 2 будет состоять только из 1 или 2 цифр, не более того.Только номер 1 будет содержать более 20 или 30 цифр.

Я уже написал код.

Public Function MultiplyBigNumbers(n1 As String, n2 As String) As String
    Dim i1 As Long, i2 As Long, i3 As Long, i4 As Long
    Dim i5 As Variant, i6 As Variant
    Dim i7 As Long, i8 As Long



i3 = Int(Log(n1) / Log(10))
i4 = Int(Log(n2) / Log(10))
i5 = 0
i6 = 0

    Select Case True
        Case i3 = i4
            ReDim Ad(1 To i3 + 1) As Long
            ReDim Bd(1 To i3 + 1) As Long
            For i2 = 1 To i3 + 1 Step 1
                Ad(i2) = (Mid(n1, i2, 1))
                Bd(i2) = (Mid(n2, i2, 1))
            Next

            For i1 = 1 To i3 + 1
                If Bd(i1) > Ad(i1) Then
                    i5 = n2
                    i6 = n1
                    Exit For
                ElseIf Bd(i1) <= Ad(i1) Then
                    i5 = n1
                    i6 = n2
                End If
            Next

        Case i3 > i4
            i5 = n1
            i6 = n2

        Case Else
            i5 = n2
            i6 = n1
    End Select


    i7 = Int(Log(i5) / Log(10)) + 1
    i8 = Int(Log(i6) / Log(10)) + 1

i3 = 0
i4 = 0
    Dim A() As Long
    ReDim A(1, 1 To i7) As Long
        For i3 = 1 To i7 Step 1
            A(1, i3) = Mid(i5, i3, 1)
        Next i3
i3 = 0
i4 = 0
    Dim B() As Long
    ReDim B(1 To i7, 1 To i7 + i8 - 1) As Long

    If i8 = 2 Then
            For i3 = 1 To i7 Step 1
                For i4 = 1 To i7 + i8 - 1 Step 1
                    If i3 = i4 Then
                        B(i3, i4) = Mid(i6, 1, 1)
                    ElseIf i4 - i3 = 1 Then
                        B(i3, i4) = Mid(i6, 2, 1)
                    Else
                        B(i3, i4) = 0
                    End If
                Next i4
            Next i3
     Else
            For i3 = 1 To i7 Step 1
                For i4 = 1 To i7 + i8 - 1 Step 1
                    If i4 - i3 = 1 Then
                        B(i3, i4) = Mid(i6, 1, 1)
                    Else
                        B(i3, i4) = 0
                    End If
                Next i4
            Next i3
     End If

i3 = 0
i4 = 0
Dim k As Long
k = 0
    Dim D() As Long
    ReDim D(1, 1 To i7 + i8 - 1) As Long
        For i3 = 1 To i7 + i8 - 1 Step 1
            For k = 1 To i7 Step 1
                D(1, i3) = D(1, i3) + A(1, k) * B(k, i3)
            Next k
        Next i3
i3 = 0
i4 = 0
    For i3 = i7 + i8 - 1 To 2 Step -1
       D(1, i3 - 1) = D(1, i3 - 1) + Int(D(1, i3) / 10)
       D(1, i3) = D(1, i3) - 10 * Int(D(1, i3) / 10)
    Next i3

    Dim C() As Variant
    ReDim C(1 To i7 + i8 - 1) As Variant
        For i3 = 1 To i7 + i8 - 1 Step 1
            C(i3) = D(1, i3)
        Next i3

    MultiplyBigNumbers = Join(C, "")

End Function

1 Ответ

0 голосов
/ 28 января 2019

Я признаю, что моя Log математика не существует, если кто-то хочет быть очень техническим.Однако я уловил вашу ошибку, потому что эта строка кода выдает ошибку: i4 = Int(Log(n2) / Log(10)), когда n2=0.

Вот пример теста, чтобы показать:

Sub testiWishiKnewMathBetterThis()

'this will work
    MsgBox Log(500) / Log(10)

'this one won't.
    MsgBox Log(0) / Log(10)

End Sub

Вот экранснимок ошибки вы получите:

uh oh

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...