【问题标题】:Highlight Entire Row when cell is selected without lose the original formats of the orignal row?选择单元格时突出显示整行而不丢失原始行的原始格式?
【发布时间】:2023-03-18 18:41:01
【问题描述】:

问题是当我用某种颜色突出显示一行时,该行的原始颜色消失了,所以我尝试了这段代码,它再次删除了该行的原始格式和颜色

这是来自http://www.mcgimpsey.com/excel/highlightrow.html的代码

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
        Const cnNUMCOLS As Long = 256
        Const cnHIGHLIGHTCOLOR As Long = 36  'default lt. yellow
        Static rOld As Range
        Static nColorIndices(1 To cnNUMCOLS) As Long
        Dim i As Long
        If Not rOld Is Nothing Then 'Restore color indices
            With rOld.Cells
                If .Row = ActiveCell.Row Then Exit Sub 'same row, don't restore
                For i = 1 To cnNUMCOLS
                    .Item(i).Interior.ColorIndex = nColorIndices(i)
                   Next i
            End With
        End If
        Set rOld = Cells(ActiveCell.Row, 1).Resize(1, cnNUMCOLS)
        With rOld
            For i = 1 To cnNUMCOLS
                nColorIndices(i) = .Item(i).Interior.ColorIndex
            Next i
            .Interior.ColorIndex = cnHIGHLIGHTCOLOR
        End With
    End Sub

那么,这个问题我该怎么办呢?如何保留范围的历史颜色,以便当我取消选择该行时它会正确恢复?

【问题讨论】:

  • 我看不出这段代码有什么问题——它对我来说很好用。不过,我使用的是 2003,目前无法访问 2010。您是否有任何其他可能干扰此的代码?时间不是很长,你有没有通过它来确保它在做你认为的事情?
  • 感谢您的重播,但代码适用于 gr8 与 excel 2003,但与 excel 2010 失败,那我该怎么办???。
  • 好的,在 2007 年尝试过,工作正常,但它会在宏停止时留下突出显示(通过在 VBE 中使用 stop/setback 做到这一点),但之后它再次正常工作 - 也许这将为您指明正确的方向。您是否在干净的工作簿上尝试过代码?

标签: excel excel-2010 vba


【解决方案1】:

用条件格式伪造它。

使用条件格式将单元格设置为所需的颜色。作为条件,使用公式=ROW()=$C$12

然后(在本例中)将C12 更改为您想要突出显示的行。将其设置为超出范围的行以删除突出显示。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
ActiveSheet.Cells(12, 3) = Target.Row
End Sub

【讨论】:

  • 这是一个聪明的主意,+1。我可以建议您为 OP 提供一些代码吗?冒着冒犯的风险,我不确定他是否会通过这个描述得到它。
  • 如何使用特定范围的条件格式,那么为什么要使用特定范围C12???
  • $C$12 只是一个参考点 - 您可以将其设置为您想要的任何单元格。通过在参考单元格中放置一个行号,该行将被突出显示
  • 此方法的缺点是用户无法撤消之前的任何操作。本质上,每次用户更改选择时,撤消堆栈都会被清除。
【解决方案2】:

这是一种在每次用户更改选择时都不会清除撤消堆栈的方法。这保留了正常的撤消行为,这很重要且通常必不可少。

定义名称

这不是一个命名范围。它将是一个存储值而不必将其存储在单元格内的名称。我们将使用它来存储活动/选定行的编号。通过将其存储在定义的名称而不是单元格中,我们保留了 Excel 的撤消堆栈。

  1. 转到公式 > 名称管理器 > 新建

  2. 设置以下字段值:

    名称: ActiveRow

    范围:工作簿

    指: 1

  3. 点击确定

将 VBA 代码添加到工作表模块

将以下代码添加到要突出显示活动行的工作表模块中。

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
    Excel.ThisWorkbook.Names("HighlightRow").Value = Excel.Selection.Row
End Sub

向工作表添加条件格式

  1. 选择整个工作表中的所有单元格。

  2. 转到首页 > 条件格式 > 新规则

  3. 在 - 选择规则类型 - 下,点击使用公式确定要设置格式的单元格

  4. 单击格式并定义您的格式。

  5. 将公式设置为:

    =ROW()=ActiveRow

    (“ActiveRow”是您之前设置的定义名称。)

就是这样!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-22
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    • 2018-05-22
    相关资源
    最近更新 更多