Считывает цвет нескольких ячеек и в зависимости от цвета возвращает цвет в другую ячейку

#excel #vba #colors

#excel #vba #Цвет

Вопрос:

Я хочу прочитать несколько ячеек подряд и, в зависимости от того, все ли они отформатированы зеленым цветом, превратить отдельную ячейку в зеленую.

Если одна ячейка в строке либо красная, либо не имеет цвета, ячейка останется с красным или без цвета, затем выполните цикл по моей таблице, чтобы прочитать каждую строку и вернуть формат в одном столбце ячеек.

И когда я нажимаю кнопку обновления, которая вводит новые данные в таблицу, столбец ячеек сбрасывается без цвета, а затем форматируется.

[! [введите описание изображения здесь][1]] [1]

 Sub CS_Click()

Range("D6:D37").Interior.ColorIndex = 0

Dim Range1 As Range

Dim Range2 As Range

    For RR = 1 To 33
     For CC = 1 To 31

        Set Range1 = Cells(RR   5, CC   6)
        Set Range2 = Cells(RR   5, CC   3)

        If Range1.Interior.ColorIndex = 0 Then
            Range2.Interior.ColorIndex = 0
        ElseIf Range1.Interior.ColorIndex = 38 Then
            Range2.Interior.ColorIndex = 38
        ElseIf Range1.Interior.ColorIndex = 50 Then
            Range2.Interior.ColorIndex = 50
        End If
    Next
 Next
End Sub
  

Комментарии:

1. Откуда CC он берется?

2. Извините, я пропускаю строку, которая звучит так: Для CC = от 1 до 31

3. Какую ячейку вы хотите отформатировать? Ячейка, отформатированная в вашем коде, переходит в другую позицию, но в вашем вопросе вы говорите только один столбец?

4. Этот код, по-видимому, сканирует строки с 6 по 38, столбцы с 6 по 39 — так что диапазон F6:AM38 — и каждый раз, когда он находит ячейку с colorindex 0,38 или 50 — он копирует тот же цвет в ячейку 3 столбца слева. Это то, что вы хотите, чтобы произошло?

Ответ №1:

Я думаю, вы могли бы использовать что-то вроде следующего. Это будет перебирать диапазон и проверять каждую строку в диапазоне для ColorIndex этой строки. Затем он обновит строку назначения ColorIndex на выбранный вами

 Sub CS_Click()
    Dim rng As Range, RowRng As Range
    Dim c As Range
    Dim RowNo As Long
    Dim ClrIndex As Long
    Dim ChangeClr As Boolean

    ' The range of your source data
    Set rng = ActiveSheet.Range("G6:AM37")

    For Each c In rng.Columns(1).Cells
        ClrIndex = -4142
        ChangeClr = False
        RowNo = c.Row - rng.Cells(1).Row   1
        On Error Resume Next
        Set RowRng = Nothing
        Set RowRng = rng.Rows(RowNo).SpecialCells(xlCellTypeConstants)
        On Error GoTo 0
        If Not RowRng Is Nothing Then
            Select Case RowRng.Interior.ColorIndex
                ' Case 50
                Case 50
                    ClrIndex = 50
                    ChangeClr = True
                ' Blank rows
                Case -4142
                    ChangeClr = False
                ' Others not defined, Null (Mixed color rows) and color 38 rows
                Case Else:
                    ClrIndex = 38
                    ChangeClr = True
            End Select

            If ChangeClr = True Then
                ' Update the 'rng.Coloumns.Count   1' with the offset of your destination cell
                c.Offset(0, -3).Interior.ColorIndex = ClrIndex
            End If
        End If
    Next c
End Sub
  

Комментарии:

1. Привет, Том, спасибо, я попробую это, и к вашему предыдущему комментарию я бы хотел, чтобы он возвращал формат в ячейки D6: D37, поэтому в зависимости от цвета ячеек в G6: AM6 верните цвет в D6, затем перебирайте строки до D37

2. @cistrat Ок, мои диапазоны немного отклонены. Итак, диапазон, с которым вы тестируете, G6:AM37 и ячейки назначения D6:D37 ?

3. да, поэтому для каждой строки от G6: AM6 до G37: AM37 и назначения — D6: D37

4. Только что понял, что он возвращает всем общим ячейкам розовый цвет, даже если все ячейки G: AM зеленые — есть ли способ изменить это?

5. Является ли colorindex ячеек определенно 50?

Ответ №2:

Я думаю, что ваш код можно упростить до:

 Sub CS_Click()

    Range("D6:D37").Interior.ColorIndex = 0

    For RR = 1 To 33
        Set Range2 = Cells(RR   5, 4)
        For CC = 1 To 31
            Set Range1 = Cells(RR   5, CC   6)
            c = Range1.Interior.ColorIndex
            If c = 38 Or c = 50 Then
                Range2.Interior.ColorIndex = c
                Exit For ' remove this line as necessary
            End If
        Next
    Next

End Sub
  

Если вы оставите Exit For строку внутри, цвет в столбце D изменится в зависимости от первой розовой или зеленой ячейки, в которую она попадает. Если вы удалите его, он изменит цвет каждой розовой или зеленой ячейки, в результате чего столбец D будет представлять последний обнаруженный зеленый или розовый цвет.