Vba 返回在Excel表格中自动更新数据时所更新内容的确切信息

Vba 返回在Excel表格中自动更新数据时所更新内容的确切信息,vba,excel,Vba,Excel,我希望在单元格D7中的值大于0时显示一个消息框。消息框应询问支票是否为低风险项目。如果No,则在单元格D9中输入0,然后转到D11。如果是,则应显示一个文本框以在中输入数字。此号码将复制到单元格D9 听起来很简单,我想不出来 Private Sub Worksheet_Change(ByVal Target As Range) ' Code goes in the Worksheet specific module Dim rng As Range Dim Response As Long

我希望在单元格D7中的值大于0时显示一个消息框。消息框应询问支票是否为低风险项目。如果
No
,则在单元格D9中输入
0
,然后转到D11。如果
,则应显示一个文本框以在中输入数字。此号码将复制到单元格D9

听起来很简单,我想不出来

Private Sub Worksheet_Change(ByVal Target As Range)
'   Code goes in the Worksheet specific module
Dim rng As Range
Dim Response As Long
Dim Risk As Long
    '   Set Target Range, i.e. Range("A1, B2, C3"), or Range("A1:B3")
    Set rng = Target.Parent.Range("D7")
         '   Only look at single cell changes
        If Target.Count > 1 Then Exit Sub
        '   Only look at that range
        If Intersect(Target, rng) Is Nothing Then Exit Sub
        '   Action if Condition(s) are met (do your thing here...)
        If Target.Value > 0 Then
            Response = MsgBox("Is the check a low risk item?", vbQuestion + vbYesNo, "Item Risk Assessment")
            Select Case Response
                Case 6 '    Yes
                    Risk = Application.InputBox("Enter a new value", "Value required", Type:=1)
                    Range("D9").Value = Risk
                Case 7  '   No
                  Range("D9").Value = 0
                    Range("D11").Select
            End Select
        End If
End Sub

这仅在手动修改单元格时有效,但我正在尝试进行设置,以便在单元格没有手动更新而是自动更新时发出消息,因为它具有计算数据的公式。

如果您知道D7的所有直接和间接先例,则可以在这些单元格上使用更改事件。因此,如果D7包含
=SUM(D5:D6)
并且D5和D6是输入单元,那么您可以

If Not Intersect(Target, Me.Range("D5:D6")) Is Nothing Then
    If Me.Range("D7").Value = 0 Then
如果有很多先例,这会变得有点笨拙

或者您可以使用工作表\u Calculate事件并持续检查D7的值。这通常是个坏主意。首先,它将一直运行,可能会降低工作表的性能。其次,如果每次计算工作表时都弹出一个消息框,我可能会辞职。如果执行计算事件路径,则该过程可能如下所示

Private Sub Worksheet_Calculate()

    '   Code goes in the Worksheet specific module

    Dim lResponse As Long

    Application.EnableEvents = False

    If Me.Range("D7").Value > 0 Then
        lResponse = MsgBox("Is the check a low risk item?", vbQuestion + vbYesNo, "Item Risk Assessment")
        If lResponse = vbYes Then
            Me.Range("D9").Value = Application.InputBox("Enter a new value", "Value required", Type:=1)
        Else
            Me.Range("D9").Value = 0
            Me.Range("D11").Select
        End If
    End If

    Application.EnableEvents = True

End Sub
最后,你可以考虑把提示直接放在电子表格上。将此文本放在C9中:

Enter a new value for low risk, enter 0 for high risk:
并使文本颜色和内部颜色相同,以便隐藏。然后添加条件格式,使其在D7=0时可见。您需要进行最后一次检查,就像保存之前一样,以确保用户输入了一个数字。或者,当D7=0且D9为空时,可以将D9条件格式设置为亮红色


如果看不到实际的工作表,很难得到比这更具体的结果。

驱动同一工作表中单元格的公式是什么?如果是这样,您可以重新配置代码,在每次输入后检查D7的值,并可能进行检查,以确保它只检查特定的单元格条目,这样,如果有人在单元格旁边随机输入数据,并且D7=0,它不会无意中触发它?嘿,斯科特,是的,公式在同一张表中。也许我没有完全理解你,你能再重复一遍吗?山姆-我指的是迪克在下面答案的第一部分所说的话。如果您知道公式的先例,您可以将
工作表\u Change
事件限制为仅对这些单元格执行检查。啊,请复制,抱歉误解。迪克提供了方便的信息,非常感谢你的回复斯科特。嘿,迪克,非常感谢,我想我确实需要进行计算,但我不知道我当前脚本的语法是什么。是的,每次更新时弹出一条消息听起来可能很烦人,但更新不是每周发生一次。有关计算事件示例,请参阅编辑。注意,在计算整个表时,没有“目标”。是的,迪克!就是这样,非常感谢!谢谢大家。知道了。