在不使用 VBA 的情况下突出显示 Excel 中的活动行/列?

Posted

技术标签:

【中文标题】在不使用 VBA 的情况下突出显示 Excel 中的活动行/列?【英文标题】:Highlight active row/column in Excel without using VBA? 【发布时间】:2014-04-16 11:07:50 【问题描述】:

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

有没有办法在不使用 VBA 的情况下以某种方式突出显示活动行/列?

【问题讨论】:

【参考方案1】:

你能得到的最好的就是使用条件格式。

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

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

如图:

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

【讨论】:

有趣!我不知道CELL() 函数会指示选择了哪一行/列 直到@dick-kusleika 在***.com/questions/21405521/…987654321@这个问题的答案中指出这一点之前我都没有。 感谢这个公式,我将它与 e.James 的代码混合以自动更新,这是完美的解决方案。特别是因为它是经验不足的 Excel 用户的解决方案。此外,它不需要在 VBA 编辑器中进行太多工作,这对于经验不足的用户来说看起来相当可怕 :) 它对我有用!这很棒。提示:如果您使用的是速度较慢的计算机。您可能希望缩小正在处理的单元格的范围或范围。 @hstay 我制定了这些规则并按了 F9 但没有任何反应。如何激活它?【参考方案2】:

我认为不使用 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”公式突出显示单元格:

【讨论】:

基于hstay's answer,您可以通过删除全局变量和 HighlightSelection 函数来简化此操作。您需要保留的只是事件处理程序中的 Application.CalculateFull 必须限制在一张纸上吗?我的意思是这部分:HighlightSelection = (Target.Row = Sheet1.SelectedRow) Or (Target.Column = Sheet1.SelectedCol) 我相信是这样,但是如果您使用 hstay 的解决方案,那么它应该适用于所有工作表,只要您强制 Excel 在每次选择更改时重新计算。我相信您可以将 SelectionChange 事件处理程序放在工作簿 VBA 代码中,它将适用于所有工作表 更正:如果将事件处理程序放在 Workbook 对象中,则必须使用 Workbook_SheetSelectionChange 而不是 Worksheet_SelectionChange 无论如何,即使您的功能无法正常工作,您也可以向我展示我所需要的精髓。将您的 anwser 与 hstay 解决方案相结合,可以得到我需要的结果。谢谢!【参考方案3】:

首先谢谢!我刚刚创建了一个突出显示单元格的解决方案,使用 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 点击“格式”并选择您希望如何突出显示 准备好了。在弹出窗口中按 OK。

这对我有用。

【讨论】:

在运行Calculate 时,任何链接到剪贴板的单元格都会丢失它。因此,通过将Calculate 放入 Selecte_Change 事件中,有效地阻碍了在工作表中进行简单的复制和粘贴。您可以通过选择一个单元格来轻松尝试,按 Ctrl-v,按 F9。按F9后,单元格周围的移动蚂蚁消失了,无法再粘贴单元格了。 如果我改为使用Range("A1").Calculate,我仍然可以进行复制和粘贴。 原来你可以简化很多...通过使用来自@hstay 的答案并简单地添加一个包含Range("A1").CalculateWorksheeet_SelectionChange 事件(指向工作表中的任何空单元格)工作表当您更改选择时会自动计算,因此突出显示会移动。【参考方案4】:

您可以通过按Shift+Space 暂时突出显示当前行(不更改选择)。带有Ctrl+Space 的当前列。

似乎可以在 Excel、Google 表格、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 哎呀!谢谢你,我修正了公式,删除了花哨的引号。希望它现在可以工作。【参考方案5】:

使用条件格式,而不是突出显示整个行和列,可以使用以下代码突出显示单元格左侧的行和单元格上方的列:

=OR(AND(CELL("col")=COLUMN();(CELL("row")-1)>=ROW());AND(CELL("col")>=COLUMN();(CELL("row")-1)=ROW()))

【讨论】:

【参考方案6】:

在工作表 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

为了清楚起见,这是长格式!

【讨论】:

【参考方案7】:

Range.Calculate 的替代方法是使用 ActiveWindow.SmallScroll 唯一的缺点是在做出新的选择后屏幕会闪烁一瞬间。 手动滚动时,您需要确保新选择完全移出屏幕(窗口),才能正常工作。这就是为什么,在下面的代码中,我们需要滚动到足以让所有可见行从屏幕视图中移出,然后滚动回同一位置 - 以强制屏幕刷新以进行条件格式设置。

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

学分: 罗里·阿奇博尔德 https://www.experts-exchange.com/questions/28275889/When-is-excel-conditional-formatting-refreshed.html

【讨论】:

【参考方案8】:

还在 vba 中添加此代码以刷新工作表(而不是 F9)

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

【讨论】:

【参考方案9】:

要突出显示活动的列和行,直到被单击的单元格,而不为被单击的单元格着色,并且不对整个列和行着色,条件格式中的这个公式在 Excel 中有效:

=OR(AND(CELL("col")=COLUMN(),(CELL("row")-1)>=ROW()),AND(CELL("row")=ROW(),(CELL("col")-1)>=COLUMN()))

【讨论】:

【参考方案10】:

将要格式化的数字除以另一列的小计,这会导致隐藏项出错,并且可以实现使用分级色标的运行时条件格式化。

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于在不使用 VBA 的情况下突出显示 Excel 中的活动行/列?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 VBA 的情况下在 Excel 中转换 HEX 和 DEC 之间的大数字?

使用 VBA 选择和突出显示 Excel 行

使用 VBA 选择并突出显示一个随机单元格

vscode中有没有办法在不保存文件的情况下启用语法突出显示? [复制]

Excel VBA:通过突出显示颜色重新计算UDF总和

excel中怎样用vba使单元格在特定条件下才可以编辑?