【问题标题】:Excel VBA function that returns an answer only when viewed仅在查看时返回答案的 Excel VBA 函数
【发布时间】:2014-03-24 15:21:49
【问题描述】:

我使用的是 Excel 2007。我在 Excel VBA 模块中有以下功能:

Function test(Loc, Dis)

    Dim StaRan As String
    Dim EndRan As String

    Application.Volatile

'   Build the Start Range and End Range strings

    StaRan = Loc.Offset(-Dis, 0).Address
    EndRan = Loc.Offset(Dis, 0).Address

'   Feed the range strings to Excel's Average function to get the answer

    test = WorksheetFunction.Average(Range(StaRan & ":" & EndRan))

End Function

当插入 Excel 工作表时,test 函数使用距离 Dis 作为加/减行计数来偏移位置 Loc 以构建可用于计算平均值的范围。工作表设置为手动计算,因此在按下 F9 按钮之前不会更新。

在 Sheet1 中输入以下内容:

在单元格 A2:1

在单元格 A3:1

在单元格 A4:1

在单元格 B3:=test(A3,1)

如果您在按 F9 时查看放置函数的工作表 (Sheet1),则此函数有效(返回 1)。查看任何其他工作表(例如 Sheet2)时,按 F9 按钮重新计算。然后返回原始工作表(Sheet1)并查看test 返回的内容。它返回了#VALUE!。如果您在查看原始工作表 (Sheet1) 时再次按 F9,它会返回正确答案。

这是 Excel 错误吗?有没有办法解决这个问题?

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    Range() 指的是活动表,除非您对其进行限定。

    这样更直接:

    Function test(Loc, Dis)
    
        Application.Volatile
        test = WorksheetFunction.Average(Loc.Offset(-Dis,0).Resize((2*Dis)+1))
    
    End Function
    

    【讨论】:

    • 蒂姆,您的解决方案不仅有效,而且更清洁。此外,test 行中的最后一个逗号后缺少 1。
    • 最后一个参数是可选的 - 如果您打算在输入范围内使用超过一列的函数,我将其省略。如果您将第一个或第二个 Resize() 参数留空,则不会调整该维度的大小。
    • 当我没有在那个位置提供值时,我得到“编译器错误:语法错误”。可能是因为我使用的是 Excel 2007。
    猜你喜欢
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    相关资源
    最近更新 更多