单元格格式更改时触发的事件

我有一个macros,它基于一个Worksheet_SelectionChange事件突出显示包含Target单元格的表的行。 我的macros改变了tableRow.Interior.Pattern.TintAndShade.TintAndShade属性,有效地用一个颜色填充它们, 但是只是暂时的 :当一个不同的表格行的单元被选中时,macros突出显示该行并恢复第一行回到原来的格式。 我有一个Public formatLog()数组声明,我保存的格式化之前,我填充,我重新读取填充时重新读取。

我希望当选定范围的格式发生变化(特别是任何列出的.Interior.[...]值)时触发另一部分代码,但只能手动操作。 所以也许我可以使用Application.EnabledEvents = False来closures当我的macros格式化,但是由用户做同样的事情触发。 即Worksheet_FormatChange(ByVal Target As Range)事件来监视工作表中的任何格式更改。

为什么这个方法?

最简单的方法是使用Worksheet_SelectionChange触发器来logging当前的单元格格式,将它与之前的格式进行比较,然后如果更改了,我只需将新的值放在我的formatLog()这样当我点击de- hilighting代码将单元格重置为保存在日志中的新格式。

即考虑4例

情况A,没有事件logging格式的变化

A1:D1最初填充绿色。 当我selectA1A1:D1的颜色被保存,然后所有的桶被我的macros填充成黄色。 我将A1更改为红色填充,然后单击新行A2 。 现在,macros观看A1:D1保存的值A1:D1点全部是绿色, A1:D1像绿色一样填充。

结果: A1红色填充未被保存

情况B,使用日志与Worksheet_SelectionChange结合logging颜色的变化

A1:D1如上所述是绿色的。 selectA1并指出其位置。 情况如前; A1:D1的颜色被保存,然后我的macros被所有的桶充满黄色。 我将A1更改为红色填充,然后单击 。 这次SelectionChange触发,指向A1的最后已知目标位置t ; 代码看到“ A1 was Green, now it's Red ”,它更新了formatLog()来反映这一点。 最后,当我单击第一行并进入A2 ,macros将使用A1:D1的新格式还原A1:D1

结果:红色格式保存(有时)

情况C,忽略黄色填充

案例B工作正常,除非不填写A1红色,我只需点击即可。 然后我的SelectionChange被触发, Oh look, A1 was Green, now it's一个目标t (A1), Oh look, A1 was Green, now it's yellow并保存到日志。 但是黄色填充是由macros而不是用户完成的。 这显然是不正确的。

相反,如果格式不是黄色的,我可以告诉select更改为只更新日志 – 这会导致情况4 ,如果手动使用与macros相同的颜色填充单元格,该怎么办? 如何知道什么时候填充是人类或计算机? 这是我想使用SelectionChange但不能!

那么一种方法是有一个不同的Worksheet_FormatChange事件,它在macros运行时被禁用,但是由用户格式化来触发。 如果你遵循了这一切,那就是为什么我要求一个新的事件。 我知道类似的问题已经被问到: 这里是一个,但我相对较新的VBA,并不能理解足够的答案,我的问题。