Excel - VBA - я не могу обновить условное форматирование формы, связанное с формулами, после обновления ячейки - PullRequest
0 голосов
/ 20 ноября 2018

Мне нужна твоя помощь.контекст: у меня есть VBA, чтобы изменить цвета (зеленый, оранжевый, красный) на несколько фигур, связанных со значением%.Значения будут меняться в зависимости от списка.Однако, если% изменяется, форматирование не следует.

Макрос выглядит следующим образом - знаете ли вы, как «принудительно» обновить, чтобы форматирование формы следовало за любыми изменениями ячейки?приведенная ниже попытка форсировать его не удалась.

Private Sub Worksheet_Change(ByVal Target As Range)

    EnableFormatConditionsCalculation = True    
    If Target.Address = "$K$16" Then 
    With Sheets("Resources").Shapes("Oval 1")    
    If Sheets("Resources").Cells(16, 11).Value < 0.95 Then 
    .Fill.ForeColor.RGB = RGB(255, 0, 0)    
    Else If 
    Sheets("Resources").Cells(16, 11).Value > 0.99 Then 
    .Fill.ForeColor.RGB = RGB(0, 255, 0)    
    Else 
    .Fill.ForeColor.RGB = RGB(255, 153, 0)    
    End If    
    End If    
    End With    
    ElseIf Target.Address = "$L$16" Then 
    With Sheets("Resources").Shapes("Oval 2")    
    If Sheets("Resources").Cells(16, 12).Value < 0.95    Then 
    .Fill.ForeColor.RGB = RGB(255, 0, 0)    
    Else If Sheets("Resources").Cells(16, 12).Value > 0.99    Then 
    .Fill.ForeColor.RGB = RGB(0, 255, 0)    
    Else 
    .Fill.ForeColor.RGB = RGB(255, 153, 0)     
    End If    
    End If    
    End With 
    Range("K16:W16").Calculate    
    End If    

End Sub

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Попробуйте это:

Private Sub Worksheet_Calculate()

    CheckFormat Me.Range("K16"), "Oval 1"
    CheckFormat Me.Range("L16"), "Oval 2"

End Sub

Sub CheckFormat(valueRange As Range, shapeName As String)
    Dim v, clr As Long
    v = valueRange.Value 

    If Len(v) = 0 Then
        clr = RGB(255, 255, 255) '<< EDIT: use white if no value
    Else
        If v < 0.95 Then
            clr = RGB(255, 0, 0)
        ElseIf v > 0.99 Then
            clr = RGB(0, 255, 0)
        Else
            clr = RGB(255, 153, 0)
        End If
    End If
    Me.Shapes(shapeName).Fill.ForeColor.RGB = clr
End Sub
0 голосов
/ 20 ноября 2018

Worksheet_Change будет запущено, если какая-либо из ячеек будет изменена пользователем вручную.Он не будет запущен, если какая-либо из ваших формул, например RANDBETWEEN , принесет новое значение.

Возможно, вас заинтересует переформирование вашей процедуры в формулу VBA VOLATILE тип.Нажмите на ссылку, чтобы следовать некоторым инструкциям.Короче говоря, вы можете поместить специальную команду в пользовательскую функцию, чтобы она выполнялась каждый раз, когда что-то меняется в вашей книге.И эту формулу вы можете поместить в клетку $ K $ 16 .

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...