2016-11-15 2 views
0

У меня есть эта функция VBA, которая отлично работает для ручной смены ячеек, но она не работает для столбца, где функция = AVERAGE(). То, что я пытаюсь сделать, это изменить цвет шрифта, где средний. Если в среднем больше, чем 0,6, то шрифт ColorIndex является 3, и если среднее значение столбца меньше или равно 0,6 набора шрифтов ColorIndex 10.Excel VBA: Worksheet_change не обнаруживает пересчет

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim c As Range 
    Set c = Range(Target.Dependents.Address) 
    For Each c In Target.Cells 
     If Not Intersect(c, Range("X:AI")) Is Nothing Then 
      If c > Range("H" & c.Row).Value Or c < Range("G" & c.Row).Value Then 
       c.Font.ColorIndex = 3 
      ElseIf c <= Range("H" & c.Row).Value And c >= Range("G" & c.Row).Value Then 
       c.Font.ColorIndex = 10 
      End If 

... 

     ElseIf Not Intersect(c, Range("AX:AX")) Is Nothing Then 
      If c > 0.6 Then 
       c.Font.ColorIndex = 3 
      ElseIf c <= 0.6 Then 
       c.Font.ColorIndex = 10 
      End If 
     End If 
    Next c 
End Sub 
+1

«Worksheet_Change» не вызван изменениями ячеек по формулам: для этого вам нужно использовать «Worksheet_Calculate». –

+0

Я где-то читал, что вы не можете получить местоположение ячейки, как в Worksheet_Change (ByVal Target As Range), и мне это нужно;/ – ArnoldasM

+0

Нет - в событии Calculate нет эквивалента «Target»: вы застряли, чтобы следить за весь диапазон интересов –

ответ

0

Heres рабочий код, который я нашел работает для меня:

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim c As Range 
    For Each c In Target.Cells 
     If Not Intersect(c, Range("X:AI")) Is Nothing Then 
      If c > Range("H" & c.Row).Value Or c < Range("G" & c.Row).Value Then 
       c.Font.ColorIndex = 3 
      ElseIf c <= Range("H" & c.Row).Value And c >= Range("G" & c.Row).Value Then 
       c.Font.ColorIndex = 10 
      End If 
      Range("AK" & c.Row).Value = "=AVERAGE(X" & c.Row & ":AI" & c.Row & ")" 

     ElseIf Not Intersect(c, Range("AL:AM")) Is Nothing Then 
      If c > Range("K" & c.Row).Value Or c < Range("J" & c.Row).Value Then 
       c.Font.ColorIndex = 3 
      ElseIf c <= Range("K" & c.Row).Value And c >= Range("J" & c.Row).Value Then 
       c.Font.ColorIndex = 10 
      End If 
     ElseIf Not Intersect(c, Range("AN:AP")) Is Nothing Then 
      If c > Range("N" & c.Row).Value Or c < Range("M" & c.Row).Value Then 
       c.Font.ColorIndex = 3 
      ElseIf c <= Range("N" & c.Row).Value And c >= Range("M" & c.Row).Value Then 
       c.Font.ColorIndex = 10 
      End If 
      Range("AQ" & c.Row).Value = "=AVERAGE(AN" & c.Row & ":AP" & c.Row & ")" 

     ElseIf Not Intersect(c, Range("AR:AT")) Is Nothing Then 
      If c > Range("Q" & c.Row).Value Or c < Range("P" & c.Row).Value Then 
       c.Font.ColorIndex = 3 
      ElseIf c <= Range("Q" & c.Row).Value And c >= Range("P" & c.Row).Value Then 
       c.Font.ColorIndex = 10 
      End If 
      Range("AU" & c.Row).Value = "=AVERAGE(AR" & c.Row & ":AT" & c.Row & ")" 
     ElseIf Not Intersect(c, Range("AV:AX")) Is Nothing Then 
      If c > Range("T" & c.Row).Value Or c < Range("S" & c.Row).Value Then 
       c.Font.ColorIndex = 3 
      ElseIf c <= Range("T" & c.Row).Value And c >= Range("S" & c.Row).Value Then 
       c.Font.ColorIndex = 10 
      End If 
      Range("AY" & c.Row).Value = "=AVERAGE(AV" & c.Row & ":AX" & c.Row & ")" 
     ElseIf Not Intersect(c, Range("BE:BG")) Is Nothing Then 
      If c > Range("T" & c.Row).Value Or c < Range("S" & c.Row).Value Then 
       c.Font.ColorIndex = 3 
      ElseIf c <= Range("T" & c.Row).Value And c >= Range("S" & c.Row).Value Then 
       c.Font.ColorIndex = 10 
      End If 
     ElseIf Not Intersect(c, Range("AK:AK")) Is Nothing Then 
      If c > Range("H" & c.Row).Value Or c < Range("G" & c.Row).Value Then 
       c.Font.ColorIndex = 3 
      ElseIf c <= Range("H" & c.Row).Value And c >= Range("G" & c.Row).Value Then 
       c.Font.ColorIndex = 10 
      End If 
     ElseIf Not Intersect(c, Range("AU:AU")) Is Nothing Then 
      If c > Range("Q" & c.Row).Value Or c < Range("P" & c.Row).Value Then 
       c.Font.ColorIndex = 3 
      ElseIf c <= Range("Q" & c.Row).Value And c >= Range("P" & c.Row).Value Then 
       c.Font.ColorIndex = 10 
      End If 
     ElseIf Not Intersect(c, Range("AY:AY")) Is Nothing Then 
      If c > Range("T" & c.Row).Value Or c < Range("S" & c.Row).Value Then 
       c.Font.ColorIndex = 3 
      ElseIf c <= Range("T" & c.Row).Value And c >= Range("S" & c.Row).Value Then 
       c.Font.ColorIndex = 10 
      End If 
     End If 
    Next c 
End Sub 

Эта строка вручную обновляет среднюю ячейку, а затем Worksheet_Change выполняет эту работу.

Range("AK" & c.Row).Value = "=AVERAGE(X" & c.Row & ":AI" & c.Row & ")" 
Смежные вопросы