【发布时间】:2014-04-16 11:07:50
【问题描述】:
我想要实现的是突出显示活动的行或列。我使用了 VBA 解决方案,但每次使用 Selection_change 事件时,我都失去了撤消工作表中任何更改的机会。
有没有办法在不使用 VBA 的情况下以某种方式突出显示活动行/列?
【问题讨论】:
我想要实现的是突出显示活动的行或列。我使用了 VBA 解决方案,但每次使用 Selection_change 事件时,我都失去了撤消工作表中任何更改的机会。
有没有办法在不使用 VBA 的情况下以某种方式突出显示活动行/列?
【问题讨论】:
你能得到的最好的就是使用条件格式。
创建两个基于公式的规则:
=ROW()=CELL("row")=COLUMN()=CELL("col")如图:
唯一的缺点是每次选择单元格时都需要重新计算工作表。 (你可以按“F9”)
【讨论】:
CELL() 函数会指示选择了哪一行/列
我认为不使用 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)
首先谢谢!我刚刚创建了一个突出显示单元格的解决方案,使用 Selection_Change 并更改了单元格内容。我不知道它会禁用撤消。 我找到了一种结合条件格式、Cell() 和 Selection_Change 事件的方法。我就是这样做的。
Range("A1").Calculate。这样,每次用户四处移动时都会执行此操作,并且由于 Selection_Change 不会更改工作表中的任何值/格式等,因此不会禁用撤消。 这对我有用。
【讨论】:
Calculate 时,任何链接到剪贴板的单元格都会丢失它。因此,通过将Calculate 放入 Selecte_Change 事件中,有效地阻碍了在工作表中进行简单的复制和粘贴。您可以通过选择一个单元格来轻松尝试,按 Ctrl-v,按 F9。按F9后,单元格周围的移动蚂蚁消失了,无法再粘贴单元格了。
Range("A1").Calculate,我仍然可以进行复制和粘贴。
Range("A1").Calculate 的Worksheeet_SelectionChange 事件(指向工作表中的任何空单元格)工作表当您更改选择时会自动计算,因此突出显示会移动。
您可以通过按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/的缩写公式)
【讨论】:
使用条件格式,而不是突出显示整个行和列,可以使用以下代码突出显示单元格左侧的行和单元格上方的列:
=OR(AND(CELL("col")=COLUMN();(CELL("row")-1)>=ROW());AND(CELL("col")>=COLUMN();(CELL("row")-1)=ROW()))
【讨论】:
在工作表 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
为了清楚起见,这是长格式!
【讨论】:
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
【讨论】:
还在 vba 中添加此代码以刷新工作表(而不是 F9)
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Application.CutCopyMode = False Then
Application.Calculate
End If
End Sub
【讨论】:
要突出显示活动的列和行,直到被单击的单元格,而不为被单击的单元格着色,并且不对整个列和行着色,条件格式中的这个公式在 Excel 中有效:
=OR(AND(CELL("col")=COLUMN(),(CELL("row")-1)>=ROW()),AND(CELL("row")=ROW(),(CELL("col")-1)>=COLUMN()))
【讨论】:
将要格式化的数字除以另一列的小计,这会导致隐藏项出错,并且可以实现使用分级色标的运行时条件格式化。
【讨论】: