在将名称添加到列表时,如何分配单元格的内部随机颜色?

时间:2018-06-27 17:49:16

标签: excel vba list random colors

这是我第一次发帖,所以请留意! 我尝试将随机颜色分配给姓名列表,以便稍后可以回忆并填充人员编制表的另一个列表。

到目前为止,这是我的代码,但是由于某些奇怪的原因,它无法正常工作。 我不确定是否有人已经问过这个问题,但是我的搜索却空手而归。

谢谢!

Private Sub Worksheet_Change(ByVal Target As Range)
    Set WF = Application.WorksheetFunction
    If Target.Cells.Column = 1 Then
        If Target.Column = 3 Then
            x = 0
            On Error Resume Next
            x = WF.Match(Target.Value, _
                Range("C1").Resize(Target.Row - 1), _
                0)
            On Error GoTo 0
            If x > 0 Then
                ' duplicate value...copy the old color
                Target.Interior.Color = Cells(x, 3).Interior.Color
            Else
                ' choose a new color
                Target.Interior.Color = RGB( _
                    WF.RandBetween(0, 255), _
                    WF.RandBetween(0, 255), _
                    WF.RandBetween(0, 255))
            End If
        End If
    End If
End Sub

1 个答案:

答案 0 :(得分:0)

  1. 请勿使用Application.WorksheetFunction.Match或WorksheetFunction.Match。使用Application.Match并将结果传递回变量类型var,可以使用IsError对其进行检查而不会破坏任何内容。
  2. 如果可以轻松避免使用On Error Resume Next,请不要使用它。参见#1。
  3. 声明您的变量。更好的是,进入VBE的“工具”,“选项”,然后在“要求变量声明”旁边打勾。这会将Option Explicit放在每个新代码表的顶部。启用该功能后,将Option Explicit放在每个现有代码表的顶部。
  4. 目标很可能不只是一个单元格,否则例程将失败。应用一些错误控制并处理一个目标,而不只是一个单元格。
  5. 老实说,我不理解同时Target.Cells.Column = 1和Target.Column = 3的方式,因此我将只使用后者,因为您正试图匹配该列。
  6. 在您的情况下,您可以在整个列中查找目标值,并且将始终找到该目标值。如果在目标上方的一行中找到它,则您有一个重复值。

    Option Explicit
    
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Not Intersect(Target, Columns(3)) Is Nothing Then
            Dim t As Range, x As Long
            For Each t In Intersect(Target, Columns(3))
                Debug.Print t.Address(0, 0)
                'looking in the entire column means it will ALWAYS be found
                x = Application.Match(t.Value, Columns(3), 0)
                If x < t.Row Then
                    ' duplicate value...copy the old color
                    t.Interior.Color = Cells(x, 3).Interior.Color
                Else
                    ' choose a new color
                    t.Interior.Color = RGB( _
                        Application.RandBetween(0, 255), _
                        Application.RandBetween(0, 255), _
                        Application.RandBetween(0, 255))
                End If
            Next t
        End If
    End Sub