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

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

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

【问题讨论】:

    标签: excel vba highlight


    【解决方案1】:

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

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

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

    如图:

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

    【讨论】:

    • 有趣!我不知道CELL() 函数会指示选择了哪一行/列
    • 直到@dick-kusleika 在stackoverflow.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
              猜你喜欢
              • 2020-08-15
              • 1970-01-01
              • 2014-02-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-11-30
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多