如何在Excel中突出显示活动行/列而不使用VBA?

33

我想要实现的是突出显示活动行或列。我使用了VBA解决方案,但每次使用Selection_change事件时,我都失去了撤销工作表中任何更改的机会。

是否有一种方法可以不使用VBA来突出显示当前行/列?

10个回答

36

最好的方法是使用条件格式。

创建两个基于公式的规则:

  1. =ROW()=CELL("row")
  2. =COLUMN()=CELL("col")

如下图所示:

enter image description here

唯一的缺点是每次选择单元格都需要重新计算工作表。(您可以按"F9"键)


有趣!我不知道CELL()函数会指示选择了哪一行/列。 - e.James
直到@dick-kusleika在这个问题的答案中指出,我才知道这一点。https://dev59.com/THvaa4cB1Zd3GeqPINW4#21405600 - hstay
感谢这个公式,我将它与e.James的代码混合使用以实现自动更新,这是完美的解决方案。特别是对于不太有经验的Excel用户来说,这是一个很好的解决方案。此外,它不需要在VBA编辑器中进行太多的操作,这对于不太有经验的用户来说看起来相当可怕 :) - lowak
它对我有效!这太棒了。 提示:如果您使用的是较慢的计算机,您可能需要降低您正在处理的单元格的范围或范围。 - Freddie Fabregas
@hstay 我制定了这些规则并按下了F9,但没有任何反应。我该如何激活它? - GuidoG
从@Nybbe的答案开始:添加一个包含Range("A1").Calculate的Worksheeet_SelectionChange事件(指向工作表中的任何空单元格以避免混淆),当您更改选择时,工作表将自动计算,因此突出显示将移动。 - Fat Monk

26

按下 Shift+Space 可以临时突出显示当前行(不更改选择)。使用 Ctrl+Space 突出显示当前列。

在我尝试过的所有程序中,似乎都适用于 Excel、Google Sheets、OpenOffice Calc 和 Gnumeric。(感谢 https://productforums.google.com/forum/#!topic/docs/gJh1rLU9IRA 指出这一点)

不幸的是,这种方法不如基于公式和宏的解决方案好用(顺便说一句,对我来说它们很有效),因为当光标移动时突出显示就消失了,但它也不需要每次设置或制作一个模板(我无法使其正常工作)。

此外,我发现您可以将条件格式化公式(针对 Excel)简化为单个规则的单个公式:

=OR(CELL("col")=COLUMN(),CELL("row")=ROW())

缺点是,如果您采用这种方法,突出显示的列和行必须使用相同的格式,但对于大多数情况来说,这可能已经足够了,并且更加简单。 (感谢https://trumpexcel.com/highlight-active-row-column-excel/提供的缩写公式)


警告!不要直接复制粘贴Aaron的公式,因为它包含花式引号,在Excel中无法作为公式使用。没有错误消息,只是无法工作。 - gwideman
@gwideman 哎呀!谢谢提醒,我修正了公式,去掉了花哨的引号。希望现在可以正常工作了。 - Aaron Wallentine

17

我认为如果不使用VBA是无法完成的,但是在不丢失撤销历史记录的情况下是可以完成的:可以

在VBA中,将以下内容添加到您的工作表对象中:

Public SelectedRow as Integer
Public SelectedCol as Integer

Private Sub Worksheet_SelectionChange(ByVal Target as Range)
    SelectedRow = Target.Row
    SelectedCol = Target.Column
    Application.CalculateFull ''// this forces all formulas to update
End Sub

创建一个新的 VBA 模块,并添加以下内容:

Public function HighlightSelection(ByVal Target as Range) as Boolean
    HighlightSelection = (Target.Row = Sheet1.SelectedRow) Or _
        (Target.Column = Sheet1.SelectedCol)
End Function

最后,使用条件格式来根据“HighlightSelection”公式突出显示单元格:

条件格式规则的屏幕截图


3
根据hstay的答案,你可以通过删除全局变量和HighlightSelection函数来简化此过程。您只需在事件处理程序中保留Application.CalculateFull即可。 - e.James
它必须限制在一个工作表上吗?我的意思是这部分:HighlightSelection = (Target.Row = Sheet1.SelectedRow) Or (Target.Column = Sheet1.SelectedCol) - lowak
我相信是这样的,但如果您使用hstay的解决方案,只要强制Excel在每次选择更改时重新计算,它就应该适用于所有工作表。我相信您可以将SelectionChange事件处理程序放在工作簿VBA代码中,它将适用于所有工作表。 - e.James
更正:如果您将事件处理程序放在Workbook对象中,则必须使用Workbook_SheetSelectionChange而不是Worksheet_SelectionChange。 - e.James
嗯...很奇怪...我使用了hstay提供的公式,一切都正常(按F9键时)。我将您的代码添加到“CalculateFull”中,效果更好。但是您的函数有问题,根本不起作用... - lowak
1
无论如何,即使你的函数不能正常工作,你也向我展示了我所需要的本质。将你的答案与hstay的解决方案结合起来,给了我我需要的结果。谢谢! - lowak

6
首先感谢!我刚刚创建了一个解决方案,使用Selection_Change和更改单元格内容来突出显示单元格。我不知道它会禁用撤消功能。 我找到了一种方法,使用组合条件格式、Cell()和Selection_Change事件来实现。这就是我做的。
  • 在单元格A1中,我放置了公式=Cell("row")
  • 第2行完全为空白
  • 第3行包含标题
  • 第4行及以下是数据
  • 为了使A1中的公式更新,需要重新计算工作表。我可以使用F9来完成,但我创建了Selection_Change事件,并将唯一要执行的代码设置为Range("A1").Calculate。这样每次用户移动时都会执行,由于Selection_Change没有更改工作表中的任何值/格式等,因此不会禁用撤消功能。
  • 现在只需输入 条件格式 来突出显示与单元格A1相同行的单元格。
    • 选择整个B列
    • 条件格式,管理规则,新规则,使用公式确定要格式化的单元格
    • 输入此公式: =Row(B1)=$A$1
    • 单击“格式”并选择您希望突出显示的方式
    • 完成。在弹出窗口中单击“确定”。

这对我有用。


当运行“Calculate”时,与剪贴板链接的任何单元格都会失去链接。因此,通过在Selecte_Change事件中放置“Calculate”,有效地阻碍了在工作表内进行简单的复制和粘贴操作。您可以轻松尝试一下,选择一个单元格,按Ctrl-v,然后按F9。按下F9后,围绕单元格的移动蚂蚁消失了,不再能够粘贴该单元格。 - Nybbe
如果我使用Range("A1").Calculate,我仍然可以进行复制和粘贴。 - Nybbe
原来你可以简化这个过程...通过使用@hstay的答案,只需添加一个Worksheet_SelectionChange事件,其中包含Range("A1").Calculate(指向工作表中的任何空单元格),当您更改选择时,工作表将自动计算,因此突出显示将移动。 - Fat Monk

2

使用ActiveWindow.SmallScrollRange.Calculate的一种替代方法,唯一的缺点是在新选择后屏幕会闪烁一瞬间。 手动滚动时,您需要确保新选择完全移出屏幕(窗口),以使其起作用。这就是为什么在下面的代码中,我们需要滚动足够多的行以使所有可见行都移出屏幕视图,然后再滚回到相同的位置-以强制屏幕刷新以进行条件格式化。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
ScreenUpdating = False
ActiveWindow.SmallScroll Down:=150 'change these values to total rows displayed on screen
ActiveWindow.SmallScroll Down:=-150 'change these values to total rows displayed on screen
'DoEvents 'unable to use this to remove the screen flicker
ScreenUpdating = True
End Sub

参考文献: Rory Archibald https://www.experts-exchange.com/questions/28275889/When-is-excel-conditional-formatting-refreshed.html


1
使用条件格式,而不是突出整行和整列,可以使用以下代码突出显示单元格左侧的行和单元格上方的列:
=OR(AND(CELL("col")=COLUMN();(CELL("row")-1)>=ROW());AND(CELL("col")>=COLUMN();(CELL("row")-1)=ROW()))

0
为了突出显示活动的列和行,一直到单元格被点击时,而不给被点击的单元格上色,也不给整个列和行上色,在Excel中可以使用以下条件格式公式:
=OR(AND(CELL("col")=COLUMN(),(CELL("row")-1)>=ROW()),AND(CELL("row")=ROW(),(CELL("col")-1)>=COLUMN()))

0
在工作表的Selection_change事件中调用以下内容:
Function highlight_Row(rngTarget As Range)
    Dim strRangeRow As String
    strRangeRow = rngTarget.Row
    strRangeRow = strRangeRow & ":" & strRangeRow
    Rows(strRangeRow).Select
    rngTarget.Activate
End Function

这是为了清晰起见而采用的长格式!


0

将要格式化的数字除以另一列中它自己的小计,这将导致隐藏项目出现错误,并且可以实现使用分级颜色比例尺的运行时条件格式设置。


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - MD. RAKIB HASAN

0

同时在VBA中添加以下代码以刷新工作表(而不是使用F9)

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Application.CutCopyMode = False Then
Application.Calculate
End If
End Sub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接