从另一个工作表中获取数据时,子“ worksheet_calculate()”不会自动更新

时间:2019-05-16 05:46:53

标签: excel vba

我正在尝试创建一个表格,该表格显示用户定义的RAL的颜色。我有2张纸:“数据”和“ Sheet1”。数据表包含RAL颜色表(+一些其他源数据,也与此问题无关)-该表名为“颜色”,如下所示:

Table

在Sheet1中,我有一个单元格(B10),该单元格仅包含表“ Color [RAL]”中的数据(使用数据验证功能)。

我有以下代码:

Private Sub Worksheet_Calculation()

    Range("F10").Interior.Color = RGB( _
        Application.VLookup(Range("B10"), Worksheets("data").Range("F1:J214"), 3), _
        Application.VLookup(Range("B10"), Worksheets("data").Range("F1:J214"), 4), _
        Application.VLookup(Range("B10"), Worksheets("data").Range("F1:J214"), 5) _
    )

End sub

我本来想使用这样的东西:

Private Sub Worksheet_Calculation()

    Range("F10").Interior.Color = RGB( _
        Application.VLookup(Range("B10"), color[RAL], 3), _
        Application.VLookup(Range("B10"), color[RAL], 4), _
        Application.VLookup(Range("B10"), color[RAL], 5) _
    )

End sub

但是不会编译。因此,我决定对范围进行硬编码,因为它不会经常更改,并且在代码中更改范围也没有问题。

无论如何,当我应用相同的代码(上面的第一个)时,虽然VLookup的参数在同一张工作表中(数据表+“检查单元格”),但所有操作均符合预期-我更改了单元格中的值(也使用数据验证功能),所需的单元格将更改其颜色。

当我将表格移动到其他工作表时,它不会自动刷新-我需要手动运行Sub来更改颜色。手动重新计算工作表(或工作簿)时,它甚至都没有改变。

有什么想法为什么会发生这种现象以及如何解决?

奖金问题:)-有没有一种方法可以在VLookup中实际引用表Color的RAL列,而不是对Range进行硬编码?

1 个答案:

答案 0 :(得分:0)

问题是Worksheet_Calculation()不是事件,因此不会自动运行。因此,您必须使用Worksheet_Calculate事件。这是在特定的工作表中。因此,如果将表格移动到另一个工作表上,则还需要将Worksheet_Calculation()事件移动到该工作表上,否则该代码仍将应用于旧工作表。

为避免移动代码,您可以在Workbook_SheetCalculate中使用ThisWorkbook事件,该事件在重新计算所有工作表的任何时运行。

对于您的奖金问题,请查看The VBA Guide To ListObject Excel Tables或使用Range("Color[RAL]")访问表RAL的列Color中的数据范围。