недостаток в двух строках:
If D(i1) > 0 Then i5 = n2 And i1 = i3 + 1 Else If D(i1) = 0 Then i1 = i1 Else i5 = n1
If D(i1) > 0 Then i6 = n1 And i1 = i3 + 1 Else If D(i1) = 0 Then i1 = i1 Else i6 = n2
с учетом первой и перевод в синтаксис plain If
, это будетyield:
If D(i1) > 0 Then
i5 = n2 And i1 = i3 + 1
Else
If D(i1) = 0 Then
i1 = i1
Else
i5 = n1
End If
End If
, который согласно вашему комментарию должен выглядеть следующим образом:
If D(i1) > 0 Then
i5 = n2
i1 = i3 + 1 ' to end loop
Else
If D(i1) = 0 Then
i1 = i1
Else
i5 = n1
End If
End If
Кроме того:
- для выхода из цикла, который вы хотите использовать
Exit For
оператор - эти две
For i1 = 1 To i3 + 1 Step 1
петли могут быть объединены вместе i1 = i1
ничего не делает
, и поэтому вы можете переписать эти две петли в одну петлю:
For i1 = 1 To i3 + 1 Step 1
If D(i1) > 0 Then
i5 = n2
i6 = n1
Exit For
ElseIf D(i1) < 0 Then
i5 = n1
i6 = n2
End If
Next i1
Наконец, если добавить явное объявление переменных и некоторые другие оптимизации, весь код приведет к следующему:
Public Function AddBigNumbers(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))
i8 = Int(Log(i6) / Log(10))
Dim A() As Long
ReDim A(1 To i7 + 1) As Long
For i2 = 1 To i7 + 1
A(i2) = (Mid(i5, i2, 1))
Next
Dim B() As Variant
ReDim B(1 To i7 + 1) As Variant
Select Case True
Case i7 > i8
For i1 = 1 To i7 - i8
B(i1) = 0
Next
For i2 = i7 - i8 + 1 To i7 + 1
B(i2) = Mid(i6, i2 - i7 + i8, 1)
Next
Case i7 = i8
For i2 = 1 To i7 + 1
B(i2) = Mid(i6, i2, 1)
Next
End Select
Dim C() As Variant
ReDim C(1 To i7 + 1) As Variant
For i2 = 1 To i7 + 1
C(i2) = CInt(A(i2)) + B(i2)
Next
For i2 = i7 + 1 To 2 Step -1
C(i2 - 1) = C(i2 - 1) + Int(C(i2) / 10)
C(i2) = C(i2) - 10 * Int(C(i2) / 10)
Next
AddBigNumbers = Join(C, "")
End Function