常用功能加载宏——单元格聚光灯

2020-07-28 11:51:36 浏览数 (3)

如果Excel表格里数据比较多的时候,查看数据很容易看错行,这时候如果给要查看的这行数据标记颜色,那么查看数据就方便多了。

如果每次都手动去标记颜色,又手动去取消颜色,这肯定会很麻烦,给需要这种功能的表格添加一个“聚光灯”功能就非常的方便了:

首先在customUI.xml中增加代码:

代码语言:javascript复制
      <button id="rbbtnHighLight" label="聚光灯&#13;" size="large" onAction="rbbtnHighLight" imageMso="PictureBrightnessGallery"/>

回调函数:

代码语言:javascript复制
Sub rbbtnHighLight(control As IRibbonControl)
    Call MRange.HighLight
End Sub

函数实现:

代码语言:javascript复制
'聚光灯
Sub HighLight()
    Dim str_insert_code As String
    Dim str_code As String
    Dim i As Long
    
    '构建Worksheet_SelectionChange事件代码
    str_insert_code = vbNewLine & "Private Sub Worksheet_SelectionChange(ByVal Target As Range)"
    
    str_insert_code = str_insert_code & vbNewLine & "   If Application.CutCopyMode = False Then"
                                
    str_insert_code = str_insert_code & vbNewLine & "         ActiveSheet.Calculate"
    
    str_insert_code = str_insert_code & vbNewLine & "   End If"
    
    str_insert_code = str_insert_code & vbNewLine & "End Sub"

    
    For i = 1 To ActiveWorkbook.VBProject.VBComponents.Count
        '找到活动工作表组件
        If ActiveWorkbook.VBProject.VBComponents(i).Name = ActiveSheet.CodeName Then

            With ActiveWorkbook.VBProject.VBComponents(i).CodeModule
                str_code = .Lines(1, .CountOfLines)
                
                '没有Worksheet_SelectionChange事件代码的情况下,插入代码
                If VBA.InStr(str_code, "Worksheet_SelectionChange") = 0 Then
                    .InsertLines .CountOfLines   2, str_insert_code
                    '设置数据有效性
                    With Cells.FormatConditions
                        .Delete
                        .Add(xlExpression, Formula1:="=CELL(""row"")=ROW()").Interior.ColorIndex = 27
                    End With
                End If
            End With

            Exit For
        End If
    Next i
End Sub

这个功能的原理就是在当前活动工作表中,首先插入Worksheet_SelectionChange代码:

代码语言:javascript复制
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   If Application.CutCopyMode = False Then
         ActiveSheet.Calculate
   End If
End Sub

只要选择改变的情况下,重新计算。

重新计算的目的就是为了激活条件格式中的函数:

代码语言:javascript复制
=CELL("row")=ROW()

Application.CutCopyMode = False判断这个条件的目的是:

如果复制了单元格,再选中其他单元格想去粘贴的时候,ActiveSheet.Calculate会消除复制,造成无法粘贴。

注意:

这样添加的聚光灯功能只适合数据量较小的表格,如果表格太大,又有太多公式的情况下,Worksheet_SelectionChange事件会比较耗时。

另外由于插入了Worksheet_SelectionChange事件代码,如果文件保存的是不启用宏的格式,将会给出提示:

因为有加载宏一步就能添加这个功能,所以这里就可以不保存VBA代码。

0 人点赞