当具有列表验证的单元格更新(用户从列表中选择不同的值)时,另一个单元格会自动更新

时间:2015-04-03 13:39:15

标签: excel vba excel-vba excel-2010 spreadsheet

我有一个列表验证的单元格,用户可以从名称列表中进行选择。当用户选择一个名字时(来自" C7"中的列表验证),我想在" C9"自动调用我在名为CalculateGrade()的类模块中编写的函数。如何从用户中选择列表验证中的其他名称以在不同的单元格中执行函数CalculateGrade()来触发单元格值更改事件?

1 个答案:

答案 0 :(得分:2)

您的功能不会重新计算,因为它无法知道更改值的单元格(例如C7)会改变其结果。您应该编写函数将C7作为参数传递给它。一旦此函数将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可以利用本机工作表函数可用的所有工具公式►公式审计组中的命令是强大的诊断工具,但却未得到充分利用。对Find and correct errors in formulas中提供的审计工具进行了很好的讨论。确定先例位于Display the relationships between formulas and cells部分。

有一个替代方法使用Application.Volatile Method,只要工作簿中的任何更改,函数将重新计算,但传入包含列表验证的单元格作为先例提供了更多功能,并且不要将你锁定到单个单元格以用于列表验证,例如对单元格地址进行硬编码。