当具有列表validation的单元格得到更新(用户从列表中select不同的值)时,另一个单元格会自动更新

我有一个单元格有一个列表validation,用户可以从名单列表中select。 当用户select一个名称(来自“C7”中的列表validation)时,我想在“C9”下面的一个单元格自动调用我在一个名为CalculateGrade()的类模块中编写的函数。 如何从用户从列表validation中select不同的名称来触发单元格值更改事件,以便在不同的单元格中执行函数CalculateGrade()?

你的函数没有重新计算,因为它没有办法知道改变了值的单元格(例如C7)会改变它的结果。 您应该已经编写了将C7作为parameter passing给它的函数。 一旦这个函数有C7作为先例 ,C7中的任何更改都会触发重新计算函数。

你已经决定保留CalculateGrade()函数的密码,但它可能是这样的:

function CalculateGrade() dim tmp as double, str as string str = range("C7").value 'do something here to get a grade from the name in C7 CalculateGrade = tmp end function 

这是如何写的:

 function CalculateGrade(rList as range) dim tmp as double, str as string str = rList.value 'do something here to get a grade from the new name in C7 (aka rList) CalculateGrade = tmp end function 

这个修改过的函数并不像=CalculateGrade() ; 它被称为=CalculateGrade(C7) 。 以C7作为函数的先例,C7中的任何更改都将重新计算函数并返回一个新值。

UDF可以利用本地工作表函数可用的所有工具“公式”►“公式审计”组中的命令是function强大的诊断工具,但大大未被充分利用。 对Find中可用的审计工具进行了很好的讨论, 并更正了公式中的错误 。 确定先例在显示公式和单元格部分之间的关系 。

有一个使用Application.Volatile方法的替代方法 ,其中,只要工作簿中的任何内容发生更改,函数就会重新计算,但是将包含列表validation的单元格作为先例传入,可以提供更多的function,并且不会将您locking到单个单元格列表validation像硬编码单元格地址一样。