#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 будет представлять последний обнаруженный зеленый или розовый цвет.