Vba 使用工作表计算行数更改时的行数

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,则 停止 如果结束

我在x列和y列中有一系列数据:

我想比较x列和y列,并在x>2y时发送通知。这是代码:(请注意,此代码运行良好)

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