咔片PPT · AI自动生成演示文稿,模板丰富、排版精美 讯飞智文 · 一键生成PPT和Word,高效应对学习与办公

当我们使用的EXCEL有大量数据时,选中某一数据却无法快速定位它所属的字段信息,这时可以使用聚光灯效果来快速判断,在EXCEL中使用聚光灯需要使用条件格式来制作,这里我使用VBA来教大家制作一个聚光灯的效果,并且如果你的数据原来就有颜色标记的,聚光灯也并不会破坏它。

在开始之前,首先学习一个异或运算,异或是两个数的位运算,按位相同结果为0,不同结果为1,异或运算有一个特性,a异或b再异或b,结果还为a本身,使用异或的这个特征,可以用来恢复单元格的原颜色。

c=a xor b d=c xor b //此时d=a

打开VBA编辑界面,在thisworkbook对象下定义如下全局变量,用来保存当前聚光灯的行列信息,在下次改变聚光灯时方便取消之前的效果。

Public row As Long, col As Long, shn As Worksheet Public color_row, color_col, color_pre

点击wirkbook的SelectionChange事件,自动填充Workbook_SheetSelectionChange过程。

'初始化聚光灯颜色 length = 50'填充列的长度 color_row = VBA.RGB(2177, 194, 231) color_col = VBA.RGB(171, 243, 165) color_row = color_row Xor vbWhite color_col = color_col Xor vbWhite

聚光灯的行列颜色可以分别指定,这里首先将颜色与白色进行异或运算作为初始颜色,在聚光灯填充颜色时,再与单元格的原颜色进行异或,如果原色为白色,那么填充的便是最初填写的rgb颜色。

Sub setColor(ByVal rg As Range, ByVal c As Long) cur = rg.Interior.Color Xor c If cur = vbWhite Then rg.Interior.Pattern = xlNone Else rg.Interior.Color = cur End If End Sub

设置颜色的函数,当颜色为白色时,使用pattern属性设置为xlnone,防止颜色覆盖初始的虚线网格。

'取消原聚光灯效果 If row > 0 Then cur = shn.Cells(row, col).Interior.Color If cur <> color_pre Then '还原当前手动设置的颜色 cur = cur Xor color_row cur = cur Xor color_col shn.Cells(row, col).Interior.Color = cur End If '取消列颜色 For i = 1 To row + lenth Call setColor(shn.Cells(i, col), color_row) Next '取消行颜色 For i = 1 To 50 Call setColor(shn.Cells(row, i), color_col) Next End If

在聚光灯生效后保存聚光灯所在单元格的颜色,取消时如果颜色被改变,则先将此单元格颜色分别与聚光灯颜色异或,在之后的循环取消时又会恢复为手动设置颜色。

Set shn = Sh '如果选中的是区域,则不设置聚光灯 If Target.CountLarge > 1 Then row = 0 col = 0 Exit Sub End If

如果选中的单元格不是一格,则结束过程,即不需要聚光灯。

'获取当前选中的行号、列号,并保存 row = Target.row col = Target.Column '设置列颜色 For i = 1 To row + length Call setColor(shn.Cells(i, col), color_row) Next '设置行颜色 For i = 1 To 50 Call setColor(shn.Cells(row, i), color_col) Next '保存当前选中单元格的颜色 color_pre = shn.Cells(row, col).Interior.Color

循环设置行列的颜色信息,最后将选中的单元格颜色保存,以便下次判断其是否被手动更改过。

来看看效果怎么样:

聚光灯效果,原颜色不会被破坏

当改变I9单元格的颜色并点击其他单元格时:

改变I9单元格颜色

原有颜色及后设置的颜色全部不变

以上便是使用VBA为EXCEL定制聚光灯的方法,亲爱的朋友们,你们还有什么好的方法,欢迎在评论区留言讨论。

需要源码的朋友请私信。