我有以下UDF,保存到我的工作簿的模块中:
Function sumAbove2(myCell As Range)
Dim rng As Range, cel As Range
Dim topRow As Long
topRow = myCell.Offset(0, -2).End(xlUp).Row
Dim sRng As Range, eRng As Range
Set sRng = Cells(myCell.Row, myCell.Column)
Set eRng = Cells(topRow, myCell.Column)
For Each cel In Range(sRng, eRng)
Debug.Print cel.Address
sumAbove2 = cel.Value + sumAbove2
Next cel
End Function
这个想法是自动对信息的“块”求和。
当我使用F8
遍历UDF时,UDF工作得很好。但是,当自动运行时,它会产生意想不到的结果。令人烦恼的是,我已将此代码放在一个全新的工作簿中,提取样本数据,并且它从未产生不正确的结果......所以为此,我向我的SO朋友道歉,我无法让它重现。我对UDF比较陌生,所以可能会遗漏一些关于运行它们的关键点(波动有助于/伤害吗?)
当我这样做,两秒钟后,在宏中有一个Break,我可以单步执行F8,它正确地添加任何内容,然后返回0
。
可能发生什么事?我没有在代码中指定工作表,但我不明白为什么会修复它。它可能与页面上的其他一些公式有关吗?没有workheet_change事件等。
编辑:工作簿有几张纸,在这些纸张中有公式。但我正在运行的表单是所有文本,保存我正在尝试输入的公式。只是想提一下格式化中的某些东西可能会给出奇怪的行为。
答案 0 :(得分:1)
我会1)简化代码(你没有使用rng
变量做任何事情而你真的不需要单独变量中的起始和结束行范围),2)定义数据要返回的类型,3)使用完全限定的引用,4)按以下方式添加数字检查:
Function sumAbove2(myCell As Range) As Double
Dim actSht As Excel.Worksheet
Dim topRow As Long
Dim cel As Range, searchRng As Range
topRow = myCell.Offset(0, -2).End(xlUp).Row
Set actSht = ActiveSheet
With actSht
Set searchRng = .Range(.Cells(myCell.Row, myCell.Column), .Cells(topRow, myCell.Column))
End With
For Each cel In searchRng
If IsNumeric(cel.Value) Then sumAbove2 = cel.Value + sumAbove2
Next cel
End Function
似乎我完美地工作。
答案 1 :(得分:1)
您需要使用正确的工作表完全限定所有范围...
Function sumAbove2(myCell As Range)
Dim sht As Worksheet '<<<
Dim rng As Range, cel As Range
Dim topRow As Long
Dim sRng As Range, eRng As Range
Set sht = myCell.Worksheet '<<<
topRow = myCell.Offset(0, -2).End(xlUp).Row
Set sRng = sht.Cells(myCell.Row, myCell.Column) '<<<
Set eRng = sht.Cells(topRow, myCell.Column) '<<<
For Each cel In sht.Range(sRng, eRng) '<<<
Debug.Print cel.Address
sumAbove2 = cel.Value + sumAbove2
Next cel
End Function
编辑:调试工作表中的UDF #VALUE错误很棘手 - 如果通过从测试子调用函数进行调试,您将获得更多信息:
Sub Tester()
Debug.Print sumAbove2(Activesheet.Range("C44"))
End sub