Excel - 两个单元格,其中一个是输入,另一个是公式的结果

Excel - 两个单元格,其中一个是输入,另一个是公式的结果

我有一个 VBA,用于在 Excel 中向两个单元格中的任意一个输入内容...未获取输入的单元格将根据另一个单元格的输入填充公式结果。
示例;

单元格 B4、C4 和 D4。

B4 是手动输入的,则 C4 获取手动输入,然后 C4 公式确定 D4 的结果...或者... D4 获取手动输入,然后 D4 公式确定 C4 的结果。

代码:

Private Sub Worksheet_Change(ByVal Target As Excel.Range)

    If Target.Address = "$C$4" Or Target.Address = "$D$4" Then

        Application.EnableEvents = False

        If Target.Address = "$C$4" Then
            Range("D4").Value = B4 * C4
        Else
            Range("C4").Value = D4 / B4

        End If

    Application.EnableEvents = True

    End If

End Sub

我一直得到运行时‘6’:溢出错误 - 特别是在范围("C4").值 = D4 / B4陈述。

我尝试的任何方法似乎都无法解决这个问题...任何建议都将不胜感激。

答案1

VBE 认为这B4 * C4分别指的是名为 B4 和 C4 的两个变量。

要引用范围,应该是Range("B4").Value * Range("C4").Value

Private Sub Worksheet_Change(ByVal Target As Range)    
    If Target.Address = "$C$4" Or Target.Address = "$D$4" Then    
        Application.EnableEvents = False    
        If Target.Address = "$C$4" Then
            Range("D4").Value = Range("B4").Value * Range("C4").Value
        Else
            Range("C4").Value = Range("D4").Value / Range("B4").Value    
        End If    
        Application.EnableEvents = True    
    End If    
End Sub

你也可以使用[]范围周围的简写:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$C$4" Or Target.Address = "$D$4" Then
        Application.EnableEvents = False
        If Target.Address = "$C$4" Then
            [D4] = [B4] * [C4]
        Else
            [C4] = [D4] / [B4]
        End If
        Application.EnableEvents = True
    End If
End Sub

此外,由于EnableEvents代码结束时不会重置,因此可能会出错。我们需要在退出之前捕获错误并重新打开事件。

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$C$4" Or Target.Address = "$D$4" Then
        On Error GoTo SafeOut
        Application.EnableEvents = False
        If Target.Address = "$C$4" Then
            [D4] = [B4] * [C4]
        Else
            [C4] = [D4] / [B4]
        End If
        Application.EnableEvents = True

    End If
Exit Sub
SafeOut:
MsgBox "Error occured, check values"
Application.EnableEvents = True
End Sub

这样,如果有人输入0B4,这将导致#Div/0错误,事件将重新打开,并且消息框会告诉用户修复值。

相关内容