대상 셀이 참조 셀 값으로 채워지면 Excel VBA Sub가 실행되지 않음

Nov 24 2020

이것은 "b37"에 대한 값을 수동으로 입력 할 때 원하는 작업에 적합하지만 "= c20"을 "b37"에 넣을 때 아무 일도 일어나지 않습니다. 참조 된 셀의 값인 "b37"에 대한 값을 수동으로 입력하는 대신 "c20"이 변경 될 때이 작업을 수행하려면 어떻게해야합니까? 감사!

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

답변

TimWilliams Nov 24 2020 at 19:41

수동으로 입력 한 값이 아니라 계산에 반응해야하는 경우 worksheet_calculate이벤트를 사용할 수 있습니다 .

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

편집 : 확인해야 할 셀이 여러 개인 경우 논리를 별도의 하위로 추출하고 각 셀 + 모양 쌍에 대해 호출 할 수 있습니다.

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