我有几个单元格范围A1:A12计算百分比。我想设置一个角色,如果在这些单元格的百分比是3%和5%之间的Msg框出现。我正在尝试以下代码:
Private Sub Worksheet_Calculate()
If Range("A1:A12").Value > 2% And Range("A1:A12").Value <= 5% Then
MsgBox "Message"
Else
Exit Sub
End Sub
谁能帮我调整一下代码,使它工作,看起来它根本不接受它。
我可能会用下面的代码来做这件事。
Private Sub Worksheet_Calculate()
Dim cellsbetween As Long, c As Range
cellsbetween = 0
For Each c In Range("A1:A12").Cells
If c.Value > 0.02 And c.Value <= 0.05 Then cellsbetween = cellsbetween + 1
Next
If cellsbetween > 0 Then MsgBox "There are " & cellsbetween & " cell(s) in the 2% - > 5% range"
End Sub
每次扫描只显示一次弹出窗口。不过,仍然存在一些问题。如果你不做点什么来改变3%-5%的范围内的值,那么你将会对弹出窗口非常恼火。
一种替代方法是监视源单元格(从用户输入而不是从recalc更改的单元格),并且仅在这些单元格更改时(由Worksheet_Change()
事件检测到)才运行上述代码。
最后,这是另一种实现目标的方法,它使用更复杂的方法和更健壮的方法来识别单元格值(当它包含公式时)的变化。
Private Sub Worksheet_Calculate()
Dim cellsbetween As Long, c As Range
cellsbetween = 0
Application.EnableEvents = False
For Each c In Range("A1:A12").Cells
If c.Value > 0.02 And c.Value <= 0.05 And c.Value <> c.Offset(0, 51).Value Then
cellsbetween = cellsbetween + 1
MsgBox "Cell " & c.Address & " is in the 2% - > 5% range"
End If
c.Offset(0, 51) = c.Value
Next
Application.EnableEvents = True
End Sub
该方法将值存储在列AZ
中(如果您愿意,可以隐藏该列),以便它可以测试值是否实际发生了更改。这样,无论重新计算多少次工作表,该弹出框只会在每次实际值发生变化时出现。
试试这个:
Dim row As Range
For Each row In Range("A1:A12").Rows
If Val(row.Cells(1, 1).Value) > 0.03 And Val(row.Cells(1, 1).Value) <= 0.05 Then
MsgBox ("message")
End If
Next
这是正确的循环方式,你不能将整个范围与单个值进行比较,如果范围包含多个单元格,它就是一个数组,你需要检查每个单独的单元格。
代码有一个问题,当小数点分隔符是一个逗号(这是我的情况),但工作良好,当它是一个点(我希望这是你的情况)。