【发布时间】:2016-09-23 20:06:45
【问题描述】:
似乎 Application.Volatile 和 ActiveSheet.Calculate 不是我想象的那样,我需要帮助创建一个在相关数据更改时正确重新计算的函数。这是我现在要做的:
Public Function Availability(EmpName As Range)
Application.Volatile (True)
ColLetter = Cletter(EmpName.Column)
Set NameRange1 = Range("$" & ColLetter & "$1:$" & ColLetter & "$" & (Application.ActiveCell.Row - 1))
Set SumRange1 = Range(Cletter(Application.ActiveCell.Column) & "1:" & Cletter(Application.ActiveCell.Column) & (Application.ActiveCell.Row - 1))
Sum1 = Application.SumIfs(SumRange1, NameRange1, EmpName)
Availability = Sum1
End Function
如您所见,它需要一个单元格并使用该单元格执行 sumifs 以提供标准和标准列,使用放置函数的列对实际数字求和(我知道这似乎是重新发明轮子,但我只是提出问题的最简单形式)。本质上,它对每一行都执行这些计算。
CLetter 只是另一个将 Column# 转换为字母的小函数,因为我懒得调用 R1C1 并发现它更具可读性。
但是,每当我更改标准或总和范围时,而不是重新计算以考虑标识符或数字的变化,似乎忘记了受影响的行存在(即使我只是将其更改为 MATCH the criteria)或者只是抛出一个#VALUE 错误。通过单击“=Availability(A#)”函数并按 Enter 键可以轻松解决此问题,但我不想编写一个额外的宏来刷新所有这些单元格,因为它们将遍布电子表格。切换波动率有所帮助,但没有解决问题,也没有在以下工作表更改事件上添加一些变体:
Private Sub Worksheet_Change(ByVal Target As Range)
ActiveSheet.Calculate
End Sub
当然有一些方法可以让函数在任何单元格被更改时刷新自身,而不仅仅是它自己的。
【问题讨论】:
-
部分问题是您正在引用活动单元格。如果您更改数据,您的活动单元格就是刚刚更改的单元格,而不是公式所在的单元格。
-
“只要在工作表上的任何单元格中发生计算,就必须重新计算 volatile 函数。” - 如果您要更改的单元格未被 any 公式引用,则编辑不会触发任何计算。您可以尝试添加一个“虚拟”公式来引用您正在更改的单元格 - 这应该足以触发重新计算。
-
Dangit 你是对的,Scott,我曾考虑过这可能是一个问题,但无法想出一种无参数的方法来查找函数调用所在的行和列,它需要(不是手动输入,我的意思是)。知道如何始终从函数内部引用“此单元格”吗?也许是间接的?
-
试试
Worksheet_SelectionChangecheck this answer out怎么样 -
Application.ThisCell会做你想做的事,或者Application.Caller就像 Scott 使用的那样