【问题标题】:Highlighting multiple cells automatically when copy and paste more than one cell复制和粘贴多个单元格时自动突出显示多个单元格
【发布时间】:2021-02-17 10:08:10
【问题描述】:

我正在使用下面的 Excel 宏,它突出显示整行黄色,并且在进行更改时单元格变为红色。还设置了如果在同一行上更改了其他单元格,则该行保持黄色,第一个更改的单元格保持红色,第二个更改的单元格也变为红色。当您手动更改单元格或复制和粘贴另一个单元格时,宏会起作用。

问题是当我将多个单元格复制并粘贴到一行时,这些突出显示功能不起作用。有谁知道我如何修改下面的宏以突出显示黄色行并使所有单元格复制并粘贴为红色?我仍然想要这样的功能,即如果我更改同一行上的另一个单元格,它将使该行上所有先前更改的单元格保持黄色和红色。提前致谢!

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim Cl      As Long                 ' last used column
With Target
    If .CountLarge = 1 Then
        ' change .Row to longest used row number
        ' if your rows aren't of uniform length
        If Sh.Cells(.Row, "A").Interior.Color <> vbYellow And _
           Sh.Cells(.Row, "A").Interior.Color <> vbRed Then
            Cl = Sh.Cells(.Row, Columns.Count).End(xlToLeft).Column
            Sh.Range(Sh.Cells(.Row, 1), Sh.Cells(.Row, Cl)).Interior.Color = vbYellow
        End If
        .Interior.Color = vbRed
    End If
 End With
End Sub

【问题讨论】:

  • If .CountLarge = 1 Then 表示此功能仅在Target 为一个单元格时才有效。
  • 也许首先将其更改为 If .Rows.Count = 1 Then 应该可以。
  • 你的逻辑要么有缺陷,要么解释不充分。 (1) 如果要标记更改的单元格,则需要单独捕获每个单元格的更改。你的代码就是这样做的。 (2) 如果您粘贴多个单元格,all 粘贴的单元格会被更改,即使它们的新值与以前相同。在该动作中,所有单元格都会变成红色。因此,如果要粘贴多个单元格,则需要保留现有解决方案并获取另一个宏来响应该操作。
  • 一个允许您粘贴然后标记更改的宏需要在粘贴操作之前记录现有值,然后比较新旧,最后标记更改。如果要粘贴单行,则可以使用 Selection_Change 事件来保留现有值的副本作为比较的基础。但是考虑改变你的工作流程。您复制的数据必须在相同版本的 Excel 中。不能用别的方法转,比如选择源,然后运行宏转吗?

标签: excel vba cell highlight


【解决方案1】:

Workbook_SheetChange(整个工作表)

  • 以下内容很容易测试:

    • 将代码复制到新工作簿的ThisWorkbook 模块中。
    • 开始在任何工作表上输入、复制/粘贴数据,看看会发生什么。
  • 如果位于同一行中最后一个黄色或红色单元格的右侧,则此单元格不会显示为黄色。

守则

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

    ' Initialize error handling.
    Const ProcName As String = "Workbook_SheetChange"
    On Error GoTo clearError
    
    Const FirstCol As String = "A"
    
    Dim tgt As Range
    Set tgt = Target
    
    Dim yRng As Range   ' Yellow Range
    Dim rRng As Range   ' Red Range
    Dim rng As Range    ' Each Range in Areas
    Dim cel As Range    ' Each Cell in Range
    Dim LastCol As Long ' Current Last Column
    Dim CurRow As Long  ' Current Row
    
    'On Error GoTo clearError
    Application.EnableEvents = False
    
    For Each rng In tgt.Areas
        For Each cel In rng.Cells
            CurRow = cel.Row
            If Sh.Cells(CurRow, FirstCol).Interior.Color <> vbRed Then
                If Sh.Cells(CurRow, FirstCol).Interior.Color <> vbYellow _
                  Then
                    LastCol = Sh.Cells(CurRow, Columns.Count) _
                                .End(xlToLeft).Column
                    collectRanges yRng, _
                      Sh.Range(Sh.Cells(CurRow, FirstCol), _
                               Sh.Cells(CurRow, LastCol))
                End If
                collectRanges rRng, cel
            End If
        Next cel
    Next rng
    
    If Not yRng Is Nothing Then
        yRng.Interior.Color = vbYellow
    End If
    If Not rRng Is Nothing Then
        rRng.Interior.Color = vbRed
    End If
    
SafeExit:
    Application.EnableEvents = True
    GoTo ProcExit

clearError:
    Debug.Print "'" & ProcName & "': " & vbLf _
              & "    " & "Run-time error '" & Err.Number & "':" & vbLf _
              & "        " & Err.Description
    On Error GoTo 0
    GoTo SafeExit

ProcExit:

End Sub

Private Sub collectRanges(ByRef TotalRange As Range, _
                          AddRange As Range)
    If Not TotalRange Is Nothing Then
        Set TotalRange = Union(TotalRange, AddRange)
    Else
        Set TotalRange = AddRange
    End If
End Sub

Sub toggleEE()
    If Application.EnableEvents Then
        Application.EnableEvents = False
    Else
        Application.EnableEvents = True
    End If
End Sub
  • 这个不会保留左边以前的红色。

守则

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

    ' Initialize error handling.
    Const ProcName As String = "Workbook_SheetChange"
    On Error GoTo clearError
    
    Const FirstCol As String = "A"
    
    Dim tgt As Range
    Set tgt = Target
    
    Dim yRng As Range   ' Yellow Range
    Dim rRng As Range   ' Red Range
    Dim rng As Range    ' Each Range in Areas
    Dim cel As Range    ' Each Cell in Range
    Dim LastCol As Long ' Current Last Column

    Application.EnableEvents = False
    
    With CreateObject("Scripting.Dictionary")
        For Each rng In tgt.Areas
            For Each cel In rng.Cells
                If cel.Interior.Color <> vbRed Then
                    If cel.Interior.Color <> vbYellow Then
                        If Not .Exists(cel.Row) Then
                            .Add cel.Row, Empty
                            LastCol = Sh.Cells(cel.Row, Columns.Count) _
                                        .End(xlToLeft).Column
                            collectRanges yRng, _
                              Sh.Range(Sh.Cells(cel.Row, FirstCol), _
                                       Sh.Cells(cel.Row, LastCol))
                        End If
                    End If
                    collectRanges rRng, cel
                End If
            Next cel
        Next rng
    End With
    
    If Not yRng Is Nothing Then
        yRng.Interior.Color = vbYellow
    End If
    If Not rRng Is Nothing Then
        rRng.Interior.Color = vbRed
    End If
    
SafeExit:
    Application.EnableEvents = True
    GoTo ProcExit

clearError:
    Debug.Print "'" & ProcName & "': " & vbLf _
              & "    " & "Run-time error '" & Err.Number & "':" & vbLf _
              & "        " & Err.Description
    On Error GoTo 0
    GoTo SafeExit

ProcExit:

End Sub

【讨论】:

  • 您好 VBasic2008,第一个代码有效,我正在尝试第二个代码,但在“collectRanges”上出现错误,显示“在 Visual Basic 帮助中找不到您选择的关键字。您可能拼错了关键字,选择了太多或太少的文本,或者就不是有效的 Visual Basic 关键字的单词寻求帮助。你能检查一下吗?
  • 同样在第一个答案上,它确实有效,但是当我按下按钮清除红色和黄色突出显示并删除宏不再起作用的时间戳时。它应该删除 A 列中的时间戳,现在它将所有单元格变为红色,而不是删除黄色单元格。当我按下按钮时,你能纠正第一个答案,不要让它这样做吗?这是我的宏,用于清除 A 列中的亮点和时间戳:
猜你喜欢
  • 1970-01-01
  • 2017-01-09
  • 1970-01-01
  • 1970-01-01
  • 2023-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多