excel - 为什么 Excel VBA 中的这个自定义函数不能正常工作。代码或算法有问题吗?
问题描述
我为自定义函数编写了一个代码,用于在 Excel VBA 中添加数字(大于 15 位)。如果我运行此功能 1 次,这工作正常,但多次使用时会出错。我是这个领域的新手,所以真的很感激任何帮助。
我已经写好了代码。请看一看。
Public Function AddBigNumbers(n1 As String, n2 As String) As String
i1 = 0
i2 = 0
i3 = Int(Log(n1) / Log(10))
i4 = Int(Log(n2) / Log(10))
i5 = 0
i6 = 0
If i3 = i4 Then
Dim Ad() As Long
ReDim Ad(1 To i3 + 1) As Long
For i2 = 1 To i3 + 1 Step 1
Ad(i2) = (Mid(n1, i2, 1))
Next i2
i1 = 0
i2 = 0
Dim Bd() As Long
ReDim Bd(1 To i3 + 1) As Long
For i2 = 1 To i3 + 1 Step 1
Bd(i2) = (Mid(n2, i2, 1))
Next i2
Dim D() As Long
ReDim D(1 To i3 + 1) As Long
i1 = 0
For i1 = 1 To i3 + 1 Step 1
If Bd(i1) > Ad(i1) Then
D(i1) = 1
End If
Next i1
i1 = 0
For i1 = 1 To i3 + 1 Step 1
If Bd(i1) = Ad(i1) Then
D(i1) = 0
End If
Next i1
i1 = 0
For i1 = 1 To i3 + 1 Step 1
If Bd(i1) < Ad(i1) Then
D(i1) = -1
End If
Next i1
i1 = 0
For i1 = 1 To i3 + 1 Step 1
If D(i1) > 0 Then i5 = n2 And i1 = i3 + 1 Else If D(i1) = 0 Then i1 = i1 Else i5 = n1
Next i1
i1 = 0
For i1 = 1 To i3 + 1 Step 1
If D(i1) > 0 Then i6 = n1 And i1 = i3 + 1 Else If D(i1) = 0 Then i1 = i1 Else i6 = n2
Next i1
End If
If i3 > i4 Then i5 = n1 Else i5 = n2
If i3 > i4 Then i6 = n2 Else i6 = n1
i7 = Int(Log(i5) / Log(10))
i8 = Int(Log(i6) / Log(10))
i1 = 0
i2 = 0
Dim A() As Long
ReDim A(1 To i7 + 1) As Long
For i2 = 1 To i7 + 1 Step 1
A(i2) = (Mid(i5, i2, 1))
Next i2
i1 = 0
i2 = 0
Dim B() As Variant
ReDim B(1 To i7 + 1) As Variant
If i7 > i8 Then
For i1 = 1 To i7 - i8 Step 1
B(i1) = 0
Next i1
For i2 = i7 - i8 + 1 To i7 + 1 Step 1
B(i2) = Mid(i6, i2 - i7 + i8, 1)
Next i2
End If
If i7 = i8 Then
For i2 = 1 To i7 + 1 Step 1
B(i2) = Mid(i6, i2, 1)
Next i2
End If
i1 = 0
i2 = 0
Dim C() As Variant
ReDim C(1 To i7 + 1) As Variant
For i2 = 1 To i7 + 1 Step 1
C(i2) = CInt(A(i2)) + B(i2)
Next i2
i1 = 0
i2 = 0
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 i2
i9 = 0
i9 = Join(C, "")
'i9 = WorksheetFunction.Concat("'", Join(C, ""))
AddBigNumbers = i9
i1 = 0
i2 = 0
End Function
如果我运行它一次(意味着如果我使用它一次)它工作正常,但多次运行它会给出错误“#Value”。
解决方案
请尝试以下代码。
Function SumBigNumbers(s1 As String, s2 As String) As String
Dim n1 As Double, n2 As Double
n1 = CDbl(s1)
n2 = CDbl(s2)
SumBigNumbers = CStr(n1 + n2)
End Function
该代码只是将两个长数字字符串转换为实际数字,将它们相加并将结果转换为字符串。VBA 将以科学计数法返回一串数字。但是请注意,这仅用于显示目的。在内部,它是一个正常(如果很长)的数字。
因此,在计算结果之后,即在调用过程中,会发生向可读内容的转换。
Private Sub CallSum()
With ActiveSheet.Cells(16, 1)
.Value = SumBigNumbers("12345678987654321", "34567890123987654")
.NumberFormat = "0.00"
End With
End Sub
事实证明,一个简单的 NumberFormat 就可以完成这项工作。我只是想知道这是否会像我的示例中那样处理更大的数字。
推荐阅读
- python - 可能的硬件/互联网问题 - Selenium bot 停止工作
- javascript - 你可以在 else 中添加嵌套 if 语句吗?
- ios - 在 iPad Catalyst 应用程序中使用 Mac 上的鼠标滑动删除功能不起作用
- powerbi - 如何使用 PowerBI 编写案例逻辑?
- c - 如何使用 fgets 获取输入大小?
- javascript - 如何将元素定位在页面中间,然后使其具有粘性并转到顶部?
- angular - AG-Grid 请求开始行和结束行属性无法正常工作
- mysql - 如何在多列中搜索 LIKE 字符串值?
- javascript - 为什么我的导航栏切换按钮在我的手机上不起作用?
- python-3.x - skimage.io.imread 和 matplotlib.pyplot.imread 有什么区别