Vba 使用工作表计算行数更改时的行数
我在x列和y列中有一系列数据: 我想比较x列和y列,并在x>2y时发送通知。这是代码:(请注意,此代码运行良好)Vba 使用工作表计算行数更改时的行数,vba,excel,Vba,Excel,我在x列和y列中有一系列数据: 我想比较x列和y列,并在x>2y时发送通知。这是代码:(请注意,此代码运行良好) Private子工作表_Calculate() 如果范围(“A2”)。值PrevValb,则 PrevValb=范围(“A2”).值 如果范围(“A2”).值>2*范围(“B2”).值,则 Dim result1作为VbMsgBoxResult 结果1=MsgBox(“A2已超出范围”,vbOKCancel,“超出范围”) 如果result1=vbCancel,则 停止 如果结束
Private子工作表_Calculate()
如果范围(“A2”)。值PrevValb,则
PrevValb=范围(“A2”).值
如果范围(“A2”).值>2*范围(“B2”).值,则
Dim result1作为VbMsgBoxResult
结果1=MsgBox(“A2已超出范围”,vbOKCancel,“超出范围”)
如果result1=vbCancel,则
停止
如果结束
如果结束
如果结束
如果范围(“A3”)。值PrevValc,则
PrevValc=范围(“A3”).值
如果范围(“A3”)值>2*范围(“B3”)值,则
Dim result2作为VbMsgBoxResult
结果2=MsgBox(“A3已超出范围”,vbOKCancel,“超出范围”)
如果result2=vbCancel,则
停止
如果结束
如果结束
如果结束
如果范围(“A4”)。值前置值,则
PrevVald=范围(“A4”).值
如果范围(“A4”)值>2*范围(“B4”)值,则
Dim result3作为VbMsgBoxResult
result3=MsgBox(“A4已超出范围”,vbOKCancel,“超出范围”)
如果result3=vbCancel,则
停止
如果结束
如果结束
如果结束
如果范围(“A5”)。值为前置值,则
PrevVale=范围(“A5”).值
如果范围(“A5”)值>2*范围(“B5”)值,则
Dim结果4作为VbMsgBoxResult
结果4=MsgBox(“A5已超出范围”,vbOKCancel,“超出范围”)
如果result4=vbCancel,则
停止
如果结束
如果结束
如果结束
端接头
但行数每天都在变化,单元格值(A2、A3、A4、A5)也是如此。我已经为x列和y列中的所有值创建了一个NamedRange。有没有办法使单元格值动态化?我想使用一个带整数的循环,其中每个整数表示行号,循环一直持续到最后一行。但我不确定如何将其与现有代码结合起来
如果您需要任何澄清,请告诉我。您需要循环代码,因为最后一行是这样的:
Private Sub Worksheet_Calculate()
Dim rangeName As String
rangeName = "NamedRange"
firstRowNamedRange = Range(rangeName).Row
lastRowNamedRange = Range(rangeName).Row + Range(rangeName).Rows.count
For i = firstRowNamedRange To lastRowNamedRange Step 1
If Range("A" & i).Value <> PrevValb Then
PrevValb = Range("A" & i).Value
If Range("A" & i).Value > 2 * Range("B2" & i).Value Then
Dim result1 As VbMsgBoxResult
result1 = MsgBox("A" & i & " has exceeded range", vbOKCancel, "Range Exceeded")
If result1 = vbCancel Then
Stop
End If
End If
End If
Next i
End Sub
Private子工作表_Calculate()
将rangeName设置为字符串
rangeName=“NamedRange”
firstRowNamedRange=范围(rangeName).Row
lastRowNamedRange=范围(rangeName).Row+范围(rangeName).Rows.count
对于i=firstRowNamedRange到lastRowNamedRange步骤1
如果范围为(“A”&i)。则值为PrevValb
PrevValb=范围(“A”&i).值
如果范围(“A”&i).Value>2*范围(“B2”&i).Value,则
Dim result1作为VbMsgBoxResult
result1=MsgBox(“A”&i&“已超出范围”,vbOKCancel,“超出范围”)
如果result1=vbCancel,则
停止
如果结束
如果结束
如果结束
接下来我
端接头
多亏了@JC Guidicelli,这是最后一段工作完美的代码
表1:
Private Sub Worksheet_Calculate()
Dim rangeName As String
rangeName = "RangeOfValues"
firstRowNamedRange = Range(rangeName).Row
lastRowNamedRange = Range(rangeName).Row + Range(rangeName).Rows.Count - 1
For i = firstRowNamedRange To lastRowNamedRange Step 1
If Range("A" & i).Value <> PrevValb Then
PrevValb = Range("A" & i).Value
If Range("A" & i).Value > 2 * Range("B" & i).Value Then
Dim result As VbMsgBoxResult
result = MsgBox("A" & i & " has exceeded range", vbOKCancel, "Range Exceeded")
If result = vbCancel Then
Stop
End If
End If
End If
Next i
End Sub
这很有效!除非我希望它在到达NamedRange的最后一行后停止检查。我在这个名称范围下有一些细胞,无论x>2y与否都不需要测试。这可能吗?尝试取消变量lastrow中的“+1”并让我知道:)当NamedRange之外的单元格发生更改时,我仍然会收到通知:/此外,此代码是否允许我在NamedRange上方插入行?“i=2”会改变吗?你认为可以从名字栏的第一行开始,到名字栏的最后一行结束吗?因为这样我就可以在不改变代码的情况下在上面和下面插入行了?谢谢你的帮助!看看编辑过的代码。我添加了循环中的第一行和最后一行。让met知道它是否有效本手册中的sub的目的是什么。您具有“i”变量的范围,但未定义“i”
Private Sub Worksheet_Calculate()
Dim rangeName As String
rangeName = "RangeOfValues"
firstRowNamedRange = Range(rangeName).Row
lastRowNamedRange = Range(rangeName).Row + Range(rangeName).Rows.Count - 1
For i = firstRowNamedRange To lastRowNamedRange Step 1
If Range("A" & i).Value <> PrevValb Then
PrevValb = Range("A" & i).Value
If Range("A" & i).Value > 2 * Range("B" & i).Value Then
Dim result As VbMsgBoxResult
result = MsgBox("A" & i & " has exceeded range", vbOKCancel, "Range Exceeded")
If result = vbCancel Then
Stop
End If
End If
End If
Next i
End Sub
Public PrevValb As Variant