动态改变单元格背景色,高亮显示选定单元格所在的行和列

HighLightTheRowAndColOfSelectedCells
不知你有没有这样的困扰:“在行列数很多的表格中查看数据时,希望可以高亮显示选定单元格所在的行列呢?“ 话不多说,直接上效果图。
先前在网上也参考了很多实现方式,个人觉得这个实现方法是比较符合我的需求的。下面就实现细节,进行说明。
注:此方法也是网络上参考来的,并非原创,出处已经记不得了。如有侵犯版权,请联系删除。

功能概要

  1. 可以指定高亮显示的范围;如上图,高亮显示范围为 $B$3:$L$26
  2. 选定单元格可以为1个单元格或多个连续单元格;
  3. 即使选定单元格在 $B$3:$L$26 范围之外,也可正常动作;
  4. 高亮显示的行和列随着选定单元格的变化而动态改变;

这些功能均可在上面的 GIF 动图中看出。

实现步骤

  1. 格式为 *.xlsm,且存有数据的Excel表格,用于保存VBA代码;
    Table01
  2. 条件格式 =OR(AND(ROW()>=sRow,ROW()<=eRow),AND(COLUMN()>=sColumn,COLUMN()<=eColumn))
    ConditionFormat01
    ConditionFormat02
  3. VBA代码(因为博客编辑器不支持VBA语法,所以一下代码的关键字和注释不能高亮显示)
' 捕捉选定单元格发生变化的事件
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    If ActiveSheet.Range("A1").Value = 1 Then ' 当A1单元格的值为1时,向工作表添加 名称。
        ActiveWorkbook.Names.Add Name:="sRow", RefersToR1C1:=Target.Row ' 以 R1C1 格式,将选定单元格的首行号赋予 名称sRow
        ActiveWorkbook.Names.Add Name:="eRow", RefersToR1C1:=Selection.Cells(Selection.Cells.Count).Row ' 以 R1C1 格式,将选定单元格的末行号赋予 名称eRow
        ActiveWorkbook.Names.Add Name:="sColumn", RefersToR1C1:=Target.Column ' 以 R1C1 格式,将选定单元格的首列号赋予 名称sColumn
        ActiveWorkbook.Names.Add Name:="eColumn", RefersToR1C1:=Selection.Cells(Selection.Cells.Count).Column ' 以 R1C1 格式,将选定单元格的末列号赋予 名称eColumn
    Else ' 当A1单元格的值为非1时,从工作表中删除 名称。
        On Error Resume Next
        ActiveWorkbook.Names("sRow").Delete
        ActiveWorkbook.Names("eRow").Delete
        ActiveWorkbook.Names("sColumn").Delete
        ActiveWorkbook.Names("eColumn").Delete
    End If

End Sub

VBA capture

条件格式的公式说明

=OR(AND(ROW()>=sRow,ROW()<=eRow),AND(COLUMN()>=sColumn,COLUMN()<=eColumn))

公式中的名称 sRow, eRow, sColumn, eColumn 的意思
在上面的VBA代码的注释中已经简单说明过,但是,可能光看注释可能还是不明白,因此下面我们结合图片来进行详细说明。

首先我们任意选定 B3:L26 区域中单元格。因为VBA代码只有在选定单元格发生变化时才会被执行,所以此时VBA代码已经被执行过了。如下图所示,我们可以看到名称管理器中上述的名称已经被自动添加,且名称的值也赋好了。
Name01
由此图可看出,我们选定的单元格区域为 D4:E5
选定区域的首行号为 4,所以 sRow = 4
选定区域的末行号为 5,所以 eRow = 5
选定区域的首列(D)号为 4,所以 sColumn = 4
选定区域的末列(E)号为 5,所以 eColumn = 5

接着,我们改变选定区域:
Name02
由此图可看出,我们选定的单元格区域为 B10
选定区域的首行号为 10,所以 sRow = 10
选定区域的末行号为 10,所以 eRow = 10
选定区域的首列(B)号为 2,所以 sColumn = 2
选定区域的末列(B)号为 2,所以 eColumn = 2

至此,sRow, eRow, sColumn, eColumn 的意思已经理清楚了。

公式中 ROW(),COLUMN() 的意思
ROW() 返回所参照的行的行号;
COLUMN() 返回所参照的列的列号;

到此,我们可以回过头来,重新解读条件格式中的公式。

=OR(AND(ROW()>=sRow,ROW()<=eRow),AND(COLUMN()>=sColumn,COLUMN()<=eColumn))
等价可以看作
=OR(A,B)

其中
A= AND(ROW()>=sRow,ROW()<=eRow)
B= AND(COLUMN()>=sColumn,COLUMN()<=eColumn)

A 意为 B3:L26 区域中,满足 sRow <= 行号 <= eRow 条件的行;
B 意为 B3:L26 区域中,满足 sColumn <= 列号 <= eColumn 条件的列;

因此,整个公式的意思为:
B3:L26 区域中,只要满足 sRow <= 行号 <= eRow 条件的行,或者满足 sColumn <= 列号 <= eColumn 条件的列,其背景色将会被涂成条件格式中指定颜色。

以上。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Qt中实现点击`QTableWidget`的单元格时,整行高亮显示,你可以使用`QTableWidget`的信号和槽机制来实现。 以下是一个示例代码,演示了如何在点击`QTableWidget`的单元格时,整行高亮显示: ```cpp // 假设有一个名为tableWidget的QTableWidget对象 // 设置整行选择模式 tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); // 连接单元格点击信号与槽函数 connect(tableWidget, &QTableWidget::cellClicked, [=](int row, int column) { // 清除之前的选择 tableWidget->clearSelection(); // 设置当前行为选中状态 tableWidget->selectRow(row); }); ``` 在上述示例中,我们首先调用`setSelectionBehavior()`函数将`QTableWidget`的选择模式设置为整行选择模式(`QAbstractItemView::SelectRows`)。这样设置后,当我们选择一个单元格时,整行都会被选中。 然后,我们使用`connect()`函数将`QTableWidget`的`cellClicked`信号连接到一个匿名的lambda槽函数上。该槽函数会在单元格被点击时被触发。在槽函数中,我们首先调用`clearSelection()`函数来清除之前的选择。然后,使用`selectRow()`函数将当前行设置为选中状态。 通过这种方式,当你点击`QTableWidget`的单元格时,整行会被高亮显示。 请注意,示例中的`tableWidget`应替换为你实际使用的`QTableWidget`对象。 你可以根据需要进一步自定义选中行的样式,例如更改选中行的背景色等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值