![Excel - 两个单元格,其中一个是输入,另一个是公式的结果](https://linux22.com/image/1542864/Excel%20-%20%E4%B8%A4%E4%B8%AA%E5%8D%95%E5%85%83%E6%A0%BC%EF%BC%8C%E5%85%B6%E4%B8%AD%E4%B8%80%E4%B8%AA%E6%98%AF%E8%BE%93%E5%85%A5%EF%BC%8C%E5%8F%A6%E4%B8%80%E4%B8%AA%E6%98%AF%E5%85%AC%E5%BC%8F%E7%9A%84%E7%BB%93%E6%9E%9C.png)
我有一个 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
这样,如果有人输入0
B4,这将导致#Div/0
错误,事件将重新打开,并且消息框会告诉用户修复值。