UDF - 自动运行时的结果与走过时不同

时间:2016-10-04 14:50:52

标签: excel-vba user-defined-functions vba excel

我有以下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比较陌生,所以可能会遗漏一些关于运行它们的关键点(波动有助于/伤害吗?)

Example of the wrong values being added. Note it catches the values from the cells above it.

当我这样做,两秒钟后,在宏中有一个Break,我可以单步执行F8,它正确地添加任何内容,然后返回0

可能发生什么事?我没有在代码中指定工作表,但我不明白为什么会修复它。它可能与页面上的其他一些公式有关吗?没有workheet_change事件等。

编辑:工作簿有几张纸,在这些纸张中有公式。但我正在运行的表单是所有文本,保存我正在尝试输入的公式。只是想提一下格式化中的某些东西可能会给出奇怪的行为。

2 个答案:

答案 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