Excel VBA Sub não executa quando a célula de destino é preenchida com o valor da célula de referência
Nov 24 2020
Isso funciona muito bem para o que quero fazer quando insiro manualmente o valor para "b37", mas quando coloco "= c20", por exemplo, em "b37" nada acontece. Como faço isso funcionar quando o valor na célula referenciada, "c20" muda em vez de inserir manualmente um valor para "b37"? Obrigado!
Sub Worksheet_Change(ByVal target As Range)
If Intersect(target, Range("b37")) Is Nothing Then Exit Sub
If IsNumeric(target.Value) Then
If target.Value < 0.95 Then
ActiveSheet.Shapes("Straight Connector 1").Line.ForeColor.RGB = vbRed
ElseIf target.Value >= 0.95 And target.Value < 1 Then
ActiveSheet.Shapes("Straight Connector 1").Line.ForeColor.RGB = vbGreen
Else
ActiveSheet.Shapes("Straight Connector 1").Line.ForeColor.RGB = vbYellow
End If
End If
End Sub
Respostas
TimWilliams Nov 24 2020 at 19:41
Se você precisar reagir a um cálculo e não a um valor inserido manualmente, poderá usar o worksheet_calculate
evento.
Private Sub Worksheet_Calculate()
Dim v, clr As Long
v = Me.Range("B37").value
If not isnumeric(v) or len(v) = 0 then exit sub
If v < 0.95 Then
clr = vbRed
ElseIf v >= 0.95 And v < 1 Then
clr = vbGreen
Else
clr = vbYellow
End If
Me.Shapes("Straight Connector 1").Line.ForeColor.RGB = clr
End Sub
EDIT: se você tiver várias células para verificar, você pode fatorar a lógica em um sub separado e chamá-lo para cada par de célula + forma.
Private Sub Worksheet_Calculate()
SetLineColor Me.Range("B37"), Me.Shapes("Straight Connector 1")
SetLineColor Me.Range("B40"), Me.Shapes("Straight Connector 8")
End Sub
Sub SetLineColor(c As Range, ln As Shape)
Dim v, clr As Long
v = c.value
If not isnumeric(v) or len(v) = 0 then exit sub
If v < 0.95 Then
clr = vbRed
ElseIf v >= 0.95 And v < 1 Then
clr = vbGreen
Else
clr = vbYellow
End If
ln.Line.ForeColor.RGB = clr
End Sub
SackOvergrowth Nov 25 2020 at 17:47
Private Sub Worksheet_Calculate()
SetLineColor1 Me.Range("B37"), Me.Shapes("Line 1")
SetLineColor2 Me.Range("D35"), Me.Shapes("Line 2")
End Sub
Sub SetLineColor1(c As Range, ln As Shape)
Dim v, clr As Long
v = c.Value
If Not IsNumeric(v) Or Len(v) = 0 Then Exit Sub
If v < 0.95 Then
clr = vbRed
ElseIf v >= 0.95 And v < 1 Then
clr = vbGreen
Else
clr = vbYellow
End If
ln.Line.ForeColor.RGB = clr
End Sub
Sub SetLineColor2(c As Range, ln As Shape)
Dim v, clr As Long
v = c.Value
If Not IsNumeric(v) Or Len(v) = 0 Then Exit Sub
If v < 88 Then
clr = vbRed
ElseIf v >= 88 And v < 100 Then
clr = vbGreen
Else
clr = vbYellow
End If
ln.Line.ForeColor.RGB = clr
End Sub
O que significa um erro “Não é possível encontrar o símbolo” ou “Não é possível resolver o símbolo”?
George Harrison ficou chateado por suas letras de 'Hurdy Gurdy Man' de Donovan não terem sido usadas