2010-04-30 6 views
3

У меня есть код VBA в электронной таблице Excel. Он используется для установки цвета шрифта и фона в ячейке на основе значения в этой ячейке. Я делаю это в VBA вместо «Условное форматирование», потому что у меня более 3 условий. Код:Установите цвет фона для фиксированного диапазона ячеек

Private Sub Worksheet_Change(ByVal Target As Range) 
Dim c As Range, d As Range, fc As Long, bc As Long, bf As Boolean 
Set d = Intersect(Range("A:K"), Target) 
If d Is Nothing Then Exit Sub 
For Each c In d 
    If c >= Date And c <= Date + 5 Then 
     fc = 2: fb = True: bc = 3 
    Else 
     Select Case c 
      Case "ABC" 
       fc = 2: fb = True: bc = 5 
      Case 1, 3, 5, 7 
       fc = 2: fb = True: bc = 1 
      Case "D", "E", "F" 
       fc = 2: fb = True: bc = 10 
      Case "1/1/2009" 
       fc = 2: fb = True: bc = 45 
      Case "Long string" 
       fc = 3: fb = True: bc = 1 
      Case Else 
       fc = 1: fb = False: bc = xlNone 
     End Select 
    End If 
    c.Font.ColorIndex = fc 
    c.Font.Bold = fb 
    c.Interior.ColorIndex = bc 
    c.Range("A1:D1").Interior.ColorIndex = bc 
Next 
End Sub 

Проблема в строке «c.Range». Он всегда использует текущую ячейку как «A», а затем направляет четыре ячейки справа. Я хочу, чтобы он начинался в «реальной» ячейке «A» текущей строки и переходил в «реальную» ячейку «D» текущей строки. В принципе, я хочу фиксированный диапазон, а не динамический.

+0

Просто убедитесь, что вас беспокоит допустимое количество условий, потому что это будет доставлено не только пользователям с xl2007? – guitarthrower

+0

Мы используем Excel 2003, который, как представляется, допускает только три условия. У пользователя было 6 условий для проверки против включения диапазона дат, который они не могли получить в работе мастера. –

ответ

3

c.Range("A1:D1") имеет свой относительный диапазон.
Одним из решений является использование свойства диапазона рабочего листа.
Я добавил две линии к верхней части (#added) и изменил ее внизу (#changed).

Private Sub Worksheet_Change(ByVal Target As Range) 
Dim c As Range, d As Range, fc As Long, bc As Long, bf As Boolean 
Dim ws As Worksheet ''#added 

Set d = Intersect(Range("A:K"), Target).Cells 
Set ws = d.Worksheet ''#added 
If d Is Nothing Then Exit Sub 
For Each c In d.Cells 
    If c >= Date And c <= Date + 5 Then 
     fc = 2: bf = True: bc = 3 
    Else 
     Select Case c.Value 
      Case "ABC" 
       fc = 2: bf = True: bc = 5 
      Case 1, 3, 5, 7 
       fc = 2: bf = True: bc = 1 
      Case "D", "E", "F" 
       fc = 2: bf = True: bc = 10 
      Case "1/1/2009" 
       fc = 2: bf = True: bc = 45 
      Case "Long string" 
       fc = 3: bf = True: bc = 1 
      Case Else 
       fc = 1: bf = False: bc = xlNone 
     End Select 
    End If 
    c.Font.ColorIndex = fc 
    c.Font.Bold = bf 
    c.Interior.ColorIndex = bc 
    ws.Cells(c.Row, 1).Interior.ColorIndex = bc ''#changed 
    ws.Cells(c.Row, 2).Interior.ColorIndex = bc ''#added 
    ws.Cells(c.Row, 3).Interior.ColorIndex = bc ''#added 
    ws.Cells(c.Row, 4).Interior.ColorIndex = bc ''#added 
Next 
End Sub 
+0

Но это устанавливает от A до D «первой» строки (A1: D1). Я хочу от A до D «текущей» строки. Если я введу «5/1/2010» в ячейку E7, я хочу изменить A7-D7. Если я введу «5/1/2010» в ячейку c99, я хочу изменить A99-D99. В основном, первые четыре ячейки текущего столбца. –

+0

@Count: большой улов. Исправлена ​​эта проблема. Дайте мне знать, как это происходит. – bernie

+0

Поскольку вы показали мне, что «c.Row» - это номер текущей строки, я объединил последние четыре строки в один: ws.Range («A» & c.Row & «: D» & c.Row) .Interior.ColorIndex = bc Большое спасибо. –

Смежные вопросы