在不使用 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").Calculate
的Worksheeet_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 之间的大数字?