我想要实现的是突出显示活动行或列。我使用了VBA解决方案,但每次使用Selection_change
事件时,我都失去了撤销工作表中任何更改的机会。
是否有一种方法可以不使用VBA来突出显示当前行/列?
最好的方法是使用条件格式。
创建两个基于公式的规则:
=ROW()=CELL("row")
=COLUMN()=CELL("col")
如下图所示:
唯一的缺点是每次选择单元格都需要重新计算工作表。(您可以按"F9"键)
按下 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/提供的缩写公式)
我认为如果不使用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”公式突出显示单元格:
HighlightSelection = (Target.Row = Sheet1.SelectedRow) Or (Target.Column = Sheet1.SelectedCol)
- lowakRange("A1").Calculate
。这样每次用户移动时都会执行,由于Selection_Change没有更改工作表中的任何值/格式等,因此不会禁用撤消功能。这对我有用。
Range("A1").Calculate
,我仍然可以进行复制和粘贴。 - NybbeWorksheet_SelectionChange
事件,其中包含Range("A1").Calculate
(指向工作表中的任何空单元格),当您更改选择时,工作表将自动计算,因此突出显示将移动。 - Fat Monk使用ActiveWindow.SmallScroll
是Range.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
=OR(AND(CELL("col")=COLUMN();(CELL("row")-1)>=ROW());AND(CELL("col")>=COLUMN();(CELL("row")-1)=ROW()))
=OR(AND(CELL("col")=COLUMN(),(CELL("row")-1)>=ROW()),AND(CELL("row")=ROW(),(CELL("col")-1)>=COLUMN()))
Function highlight_Row(rngTarget As Range)
Dim strRangeRow As String
strRangeRow = rngTarget.Row
strRangeRow = strRangeRow & ":" & strRangeRow
Rows(strRangeRow).Select
rngTarget.Activate
End Function
这是为了清晰起见而采用的长格式!
将要格式化的数字除以另一列中它自己的小计,这将导致隐藏项目出现错误,并且可以实现使用分级颜色比例尺的运行时条件格式设置。
同时在VBA中添加以下代码以刷新工作表(而不是使用F9)
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Application.CutCopyMode = False Then
Application.Calculate
End If
End Sub
CELL()
函数会指示选择了哪一行/列。 - e.James