Excel 工作表更改:如果单元格的值在一定范围内>;c8->;其他单元格(其中包含函数)中的MsgBox和if值>;300->;消息框

Excel 工作表更改:如果单元格的值在一定范围内>;c8->;其他单元格(其中包含函数)中的MsgBox和if值>;300->;消息框,excel,vba,Excel,Vba,我需要一个工作表更改宏,每当在范围(F14:J26)中的一个单元格中放入大于8的值时,以及如果在单元格C37中放入大于300的值时,该宏都会弹出一个消息框 我的问题是,单元格C37不是手动填写的,而是有一个公式,所以它是另外两个单元格的计算结果。我认为excel不承认这是一个值,因此当单元格中的结果高于300时,它不会做任何事情 Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) If Not App

我需要一个工作表更改宏,每当在范围(F14:J26)中的一个单元格中放入大于8的值时,以及如果在单元格C37中放入大于300的值时,该宏都会弹出一个消息框

我的问题是,单元格C37不是手动填写的,而是有一个公式,所以它是另外两个单元格的计算结果。我认为excel不承认这是一个值,因此当单元格中的结果高于300时,它不会做任何事情

Option Explicit

 Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Application.Intersect(Target, Range("F14:J26")) Is Nothing Then
            If Target.Value > 8 Then
                MsgBox "Was that accepted?"

          End If
    End If

   If Not Application.Intersect(Target, Range("C37")) Is Nothing Then
            If Target.Value > 300 Then
                 MsgBox "Was that accepted?"

          End If
    End If

End Sub
代码的第一部分按其应有的方式工作。但是上面解释的第二部分没有。我还尝试将其拆分为两个独立的代码,但这显示了一个bug。在此方面的任何帮助都将不胜感激

您有两个(可能更多)可能的选择:

  • 使用“工作表计算”事件,而不是“工作表更改”事件
  • 如果C37中的公式是固定的,则不监视C37,而是监视源单元格
  • 除此之外,我建议用以下方式扩展它,这样如果有人将数据范围粘贴到F14:J26中,它不会失败

    Option Explicit
    
    Private Sub Worksheet_Change(ByVal Target As Range)
        Dim AffectedRng As Range
        Set AffectedRng = Application.Intersect(Target, Range("F14:J26"))
    
        Dim FoundInvalidData As Boolean
    
        If Target.Parent.Range("C37").Value > 300 Then 
            FoundInvalidData = True
        ElseIf Not AffectedRng Is Nothing Then
            Dim Cel As Range
            For Each Cel In AffectedRng.Cells
                If Cel.Value > 8 Then
                    FoundInvalidData = True
                    Exit For
                End If
            Next Cel
        End If
    
        If FoundInvalidData Then
            MsgBox "Was that accepted?"
        End If
    End Sub
    

    当使用公式中的值时,请使用Workplace.calculate事件,而不是更改。请注意,如果
    Target
    是多个单元格,则
    Target.Value
    将返回一个值数组,并且
    Target.Value>300
    失败。可能会重复感谢@FunThomas您的解决方案工作得很好:-)这将测试
    范围(“C37”)。仅当
    目标
    范围(“F14:J26”)
    相交时,才会测试值>300,但如果
    范围(“C37”)。值因其他原因而发生变化时,则不会进行测试。因此,当C37中的公式完全依赖于
    F14:J26
    中的值时,这将起作用。另外请注意,如果
    Target
    是一个范围(多个单元格)而不是单个单元格(例如复制/粘贴多个单元格时),这仍然会失败<代码>目标。值
    将生成一个无法比较的值数组
    >8
    。因此,您需要遍历
    应用程序.Intersect(Target,Range(“F14:J26”)).Cells
    并测试每个cell的
    >8
    Option Explicit
    
    Private Sub Worksheet_Change(ByVal Target As Range)
        Dim AffectedRng As Range
        Set AffectedRng = Application.Intersect(Target, Range("F14:J26"))
    
        Dim FoundInvalidData As Boolean
    
        If Target.Parent.Range("C37").Value > 300 Then 
            FoundInvalidData = True
        ElseIf Not AffectedRng Is Nothing Then
            Dim Cel As Range
            For Each Cel In AffectedRng.Cells
                If Cel.Value > 8 Then
                    FoundInvalidData = True
                    Exit For
                End If
            Next Cel
        End If
    
        If FoundInvalidData Then
            MsgBox "Was that accepted?"
        End If
    End Sub