Excel 工作表更改:如果单元格的值在一定范围内>;c8->;其他单元格(其中包含函数)中的MsgBox和if值>;300->;消息框
我需要一个工作表更改宏,每当在范围(F14:J26)中的一个单元格中放入大于8的值时,以及如果在单元格C37中放入大于300的值时,该宏都会弹出一个消息框 我的问题是,单元格C37不是手动填写的,而是有一个公式,所以它是另外两个单元格的计算结果。我认为excel不承认这是一个值,因此当单元格中的结果高于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
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。在此方面的任何帮助都将不胜感激 您有两个(可能更多)可能的选择:
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