Excel VBA代码,用于在一个单元格的值超过另一个单元格的值时显示消息框弹出窗口

Excel VBA代码,用于在一个单元格的值超过另一个单元格的值时显示消息框弹出窗口,excel,vba,Excel,Vba,我在Excel中有一个场景,它需要一些vba代码。我是一个相对的新手,在寻找解决方案方面已经走到了死胡同 例如,用户在单元格A1中输入数值 然后,他们还必须在单元格A5、A6、A7和A8中输入值 使用通用excel sum函数,此总和的总和显示在单元格A9中 A5:A8单元格中没有一个可以留空,尽管可以接受零('0')输入 A9的值可以小于、等于但不超过A1中的值 如果A9超过A1,则必须弹出一条错误消息,提醒他们情况就是这样 无法输入字母字符。将弹出一条错误消息,提醒他们是否存在错误 输入的数

我在Excel中有一个场景,它需要一些vba代码。我是一个相对的新手,在寻找解决方案方面已经走到了死胡同

例如,用户在单元格A1中输入数值

然后,他们还必须在单元格A5、A6、A7和A8中输入值

使用通用excel sum函数,此总和的总和显示在单元格A9中

A5:A8单元格中没有一个可以留空,尽管可以接受零('0')输入

A9的值可以小于、等于但不超过A1中的值

如果A9超过A1,则必须弹出一条错误消息,提醒他们情况就是这样

无法输入字母字符。将弹出一条错误消息,提醒他们是否存在错误

输入的数字必须介于0和9999999之间。如果他们不这样做,会弹出一条错误消息提醒他们

我得到了一段vba代码(见下文),我将其用于类似的目的,效果非常好。然而,我不知道如何合并代码,如果A9中的值超过A1,代码将识别并返回错误消息。这就是我试图做的,但我知道这是错误的!代码如下:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
If Not Intersect(Target, Range("A9")) Is Nothing Then
    Application.EnableEvents = False
    For Each c In Intersect(Target, Range("A9"))
        If IsEmpty(c) Then
            Application.EnableEvents = True
            Exit Sub
        End If
        If Not VarType(c.Value2) = vbDouble Or c.Value < 0 Or c.Value > 9999999 Then
            MsgBox "Entry in cell " & c.Address(0, 0) & " must be a number from 0 and 9,999,999"
            Application.Undo
        ElseIf WorksheetFunction.Count(Range("A9")) = 1 And _
            WorksheetFunction.Sum(Range("A9")) > Range("A1").Value Then
            MsgBox "The sum of A99 cannot exceed A1 when all entries are completed"
            Application.Undo
        End If
Private子工作表\u更改(ByVal目标作为范围)
调光范围
如果不相交(目标,范围(“A9”)为零,则
Application.EnableEvents=False
对于相交中的每个c(目标,范围(“A9”))
如果我是空的,那么
Application.EnableEvents=True
出口接头
如果结束
如果不是VarType(c.Value2)=vbDouble或c.Value<0或c.Value>999999,则
MsgBox“单元格中的条目”&c.Address(0,0)&“必须是介于0和9999999之间的数字”
应用程序。撤消
ElseIf WorksheetFunction.Count(范围(“A9”))=1和_
工作表function.Sum(范围(“A9”))>范围(“A1”)。然后是值
MsgBox“当所有条目都完成时,A99的总和不能超过A1”
应用程序。撤消
如果结束
如果有人能帮我,我将不胜感激

Cal

在我看来,您的事件宏应该处理A1和A5:A8的更改,而不是A9。如果A5:A8中的值符合标准,则可以对照A1检查其总数

在调整了之后,我使用了一个函数来组织各种逻辑条件

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("A1, A5:A8")) Is Nothing Then
        On Error GoTo bm_Safe_exit
        Application.EnableEvents = False
        Dim c As Range
        For Each c In Intersect(Target, Range("A1, A5:A8"))
            If Application.Count(Range("A1, A5:A8")) < 5 Then
                Range("A9") = vbNullString
            Else
                Range("A9").Formula = "=SUM(A5:A8)"
                Select Case Range("A9").Value2
                    Case Is > Range("A1").Value2
                        MsgBox "The sum of A9 cannot exceed A1 when all entries are completed"
                        Range("A9", c).ClearContents
                        GoTo bm_Safe_exit
                    Case Is < 0, Is >= 10 ^ 7
                        MsgBox "Entry in cell " & c.Address(0, 0) & " must be a number from 0 and 9,999,999"
                        Range("A9", c).ClearContents
                        GoTo bm_Safe_exit
                    Case Else
                        'do nothing - A9 is oh-key-doh-key
                End Select
            End If
        Next c
    End If
bm_Safe_exit:
    Application.EnableEvents = True
End Sub
Private子工作表\u更改(ByVal目标作为范围)
如果不相交(目标、范围(“A1、A5:A8”))则为零
错误转到bm_安全出口
Application.EnableEvents=False
调光范围
对于相交中的每个c(目标,范围(“A1,A5:A8”))
如果Application.Count(范围(“A1,A5:A8”))小于5,则
范围(“A9”)=vbNullString
其他的
范围(“A9”)。公式=“=总和(A5:A8)”
选择案例范围(“A9”)。值2
大小写>范围(“A1”)。值2
MsgBox“当所有条目都完成时,A9的总和不能超过A1”
范围(“A9”,c)。清除内容物
转到bm_安全出口
大小写为<0,大小写为>=10^7
MsgBox“单元格中的条目”&c.Address(0,0)&“必须是介于0和9999999之间的数字”
范围(“A9”,c)。清除内容物
转到bm_安全出口
其他情况
“什么都不做-A9是oh key doh key
结束选择
如果结束
下一个c
如果结束
bm_安全出口:
Application.EnableEvents=True
端接头

这应该满足您的需要:

Private Sub Worksheet_Change(ByVal Target As Range)
   Dim rLook As Range, v1 As Variant, v5 As Variant
   Dim v6 As Variant, v7 As Variant, v8 As Variant
   Dim bad As Boolean
   Set rLook = Range("A1, A5:A8")

   If Intersect(Target, rLook) Is Nothing Then Exit Sub
   v1 = Range("A1").Value
   v5 = Range("A5").Value
   v6 = Range("A6").Value
   v7 = Range("A7").Value
   v8 = Range("A8").Value
   If v1 = "" Or v5 = "" Or v6 = "" Or v7 = "" Or v8 = "" Then Exit Sub

   bad = False
   If Not IsNumeric(v1) Then bad = True
   If Not IsNumeric(v5) Then bad = True
   If Not IsNumeric(v6) Then bad = True
   If Not IsNumeric(v7) Then bad = True
   If Not IsNumeric(v8) Then bad = True
   If bad Then
      MsgBox "non-numeric data"
      Exit Sub
   End If

   If v1 < 0 Or v1 > 9999999 Then bad = True
   If v5 < 0 Or v1 > 9999999 Then bad = True
   If v6 < 0 Or v1 > 9999999 Then bad = True
   If v7 < 0 Or v1 > 9999999 Then bad = True
   If v8 < 0 Or v1 > 9999999 Then bad = True
   If bad Then
      MsgBox "data out of bounds"
      Exit Sub
   End If

   If Range("A9").Value > v1 Then
      MsgBox "sum exceeds the value in A1"
   End If

End Sub
Private子工作表\u更改(ByVal目标作为范围)
尺寸R视为范围,v1视为变型,v5视为变型
尺寸v6作为变型,v7作为变型,v8作为变型
像布尔一样糟糕
设置rLook=范围(“A1、A5:A8”)
如果Intersect(目标,rLook)为空,则退出Sub
v1=范围(“A1”).值
v5=范围(“A5”).值
v6=范围(“A6”).值
v7=范围(“A7”).值
v8=范围(“A8”).值
如果v1=“”或v5=“”或v6=“”或v7=“”或v8=“”,则退出Sub
坏=假
如果不是数字(v1),则坏=真
如果不是IsNumeric(v5),则bad=True
如果不是数字(v6),则bad=True
如果不是数字(v7),则坏=真
如果不是数字(v8),则坏=真
如果不好的话
MsgBox“非数字数据”
出口接头
如果结束
如果v1<0或v1>9999999,则坏=真
如果v5<0或v1>9999999,则bad=True
如果v6<0或v1>9999999,则坏=真
如果v7<0或v1>9999999,则bad=True
如果v8<0或v1>9999999,则坏=真
如果不好的话
MsgBox“数据超出范围”
出口接头
如果结束
如果范围(“A9”).值>v1,则
MsgBox“总和超过A1中的值”
如果结束
端接头
当用户通过A8完成对A1A5的输入时,将触发宏


我假设总和公式已经在单元格中A9

似乎有很多代码,如果目标>范围(“A1”),那么
就足够了吗,非常感谢-此代码将去哪里/我必须更换哪些部件?@Jeeped,但如果
,则第二个
空白单元格将失败,并且永远无法达到
IsNumeric
测试。。。。。。。。。。代码明显地等待,直到感兴趣的范围中没有空格。是的。很抱歉tl;博士,当我应该仔细看的时候。