我有一个宏突出显示包含基于Target
事件的Worksheet_SelectionChange
单元格的表格的行。
我的宏更改.Pattern
的{{1}},.TintAndShade
和.Color
属性,有效地用颜色填充它们,但只是暂时:当一个单元格如果选择了不同的表行,则宏会突出显示该行并将第一行恢复为其原始格式。我声明了一个tableRow.Interior
数组,我在格式化填充之前保存了格式,并在重新填充填充时读回了。
我希望在更改所选范围的格式(特别是列出的Public formatLog()
值中的任何一个)时触发另一部分代码,但只能手动执行。因此,当我的宏格式化时,我可以使用.Interior.[...]
来关闭,但是由用户执行相同操作时触发。即一个Application.EnabledEvents = False
事件,用于监控工作表中的任何格式更改。
最简单的方法是使用Worksheet_FormatChange(ByVal Target As Range)
触发器记录当前的单元格格式,将其与之前的格式进行比较,然后如果它已更改,我只需将新值放入my { {1}}这样,当我点击离开远程处理代码时,会将单元格重置为保存在日志中的新格式。
即。考虑4个案例
案例A,没有记录格式更改的事件
Worksheet_SelectionChange
最初填充为绿色。当我选择formatLog()
时,保存A1:D1
的颜色,然后我的宏将所有桶填充为黄色。我将A1
更改为红色填充,然后点击新行A1:D1
。现在宏观察A1
点中保存的值,它们全部为绿色,并用绿色填充A2
。
结果:A1:D1
红色填充未保存
案例B,将登录与A1:D1
结合使用以记录颜色变化
A1
如上所述为绿色。选中Worksheet_SelectionChange
并注明其位置A1:D1
。情况和以前一样; 保存A1
的颜色,然后我的宏将所有桶装满黄色。我将t
更改为红色填充,然后单击。这一次A1:D1
触发,指向最后一个已知的目标位置A1
SelectionChange
;代码见" t
"并更新A1
以反映这一点。最后,当我点击第1行并进入A1 was Green, now it's Red
时,宏会使用formatLog()
A2
结果:保存红色格式(有时)
案例C,忽略黄色填充
案例B工作正常,除非不是填写A1:D1
红色,我只需点击即可。然后我的A1
被触发,查看最后一个目标A1
(A1),说SelectionChange
t
并将其保存到日志中。但黄色填充是由宏完成的,而不是用户完成的。这显然不正确。
相反,我可以告诉选择更改只更新日志,如果格式不是黄色 - 这导致案例4 ,如果我手动用与宏相同的颜色填充单元格怎么办? 。如何判断填充是人还是计算机?这是我想使用Oh look, A1 was Green, now it's
的地方,但不能!
一种方法是使用不同的yellow
事件,该事件在宏运行时被禁用,但由用户格式化触发。如果您已经完成了所有这些,那就是我要求举办新活动的原因。我知道有类似的问题被问到:here's one但我对VBA来说相对较新,并且不能理解为我的问题应用答案。