Как назначить случайный цвет интерьера ячеек при добавлении имен в список? - PullRequest
0 голосов
/ 27 июня 2018

Это мой первый пост, поэтому, пожалуйста, помилуйте! Я попытался назначить случайные цвета для списка имен, чтобы потом мог вспомнить и заполнить другой список штатным расписанием.

Пока это мой код, но по какой-то странной причине он не работает. Я не уверен, что кто-то уже задавал этот вопрос, но мой поиск оказался с пустыми руками.

Спасибо!

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 голосов
/ 27 июня 2018
  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
    
...