Vba 如何在与列进行比较时创建循环

Vba 如何在与列进行比较时创建循环,vba,excel,messagebox,Vba,Excel,Messagebox,我想要一个验证,如果列AP大于列X,则显示一条消息,但是我希望此消息只显示一次,并且只显示一次。例如,如果单元格ap7大于x7,则用户单击“确定”。然后,如果单元格ap8小于x8,我不希望来自上一次验证的消息再次出现 Dim lstrw As Long Dim i As Long With Sheets("Main") lstrw = .Range("AP" & Rows.Count).End(xlUp).Row For i = 2 To lst

我想要一个验证,如果列AP大于列X,则显示一条消息,但是我希望此消息只显示一次,并且只显示一次。例如,如果单元格ap7大于x7,则用户单击“确定”。然后,如果单元格ap8小于x8,我不希望来自上一次验证的消息再次出现

Dim lstrw As Long
Dim i As Long

    With Sheets("Main")
        lstrw = .Range("AP" & Rows.Count).End(xlUp).Row
        For i = 2 To lstrw
            If .Cells(i, "AP").value > .Cells(i, "X").value Then
                MsgBox "Your Pieces Are Over Suggested", vbOKOnly
                Exit For
            End If
        Next i
    End With
这应该做到:

Private Sub Worksheet_Calculate()

Dim lstrw As Long
Dim i As Long

With Sheets("Main")
    lstrw = .Range("AP" & Rows.Count).End(xlUp).Row
    For i = 2 To lstrw
        If .Cells(i, "AP").Value > .Cells(i, "X").Value Then
            MsgBox "Your Pieces Are Over Suggested", vbOKOnly
            Exit For
        End If
    Next i
End with 
End Sub
这应该做到:

Private Sub Worksheet_Calculate()

Dim lstrw As Long
Dim i As Long

With Sheets("Main")
    lstrw = .Range("AP" & Rows.Count).End(xlUp).Row
    For i = 2 To lstrw
        If .Cells(i, "AP").Value > .Cells(i, "X").Value Then
            MsgBox "Your Pieces Are Over Suggested", vbOKOnly
            Exit For
        End If
    Next i
End with 
End Sub

没有VBA,您可以轻松完成此操作。在第三列中(我将使用Z),将以下公式复制并粘贴到该列,并用第一行的索引替换1:

=AP1>X1
然后在附近的牢房里

=COUNTIF($Z$1:$Z$N, FALSE)

其中N是最后一行的索引。然后,您可以检查该单元格的值是否大于0。

无需VBA即可轻松完成此操作。在第三列中(我将使用Z),将以下公式复制并粘贴到该列,并用第一行的索引替换1:

=AP1>X1
然后在附近的牢房里

=COUNTIF($Z$1:$Z$N, FALSE)


其中N是最后一行的索引。然后,您可以检查该单元格的值是否大于0。

您需要循环,您不能同时将一个整列与另一个整列进行比较。@ScottCraner有什么建议吗?scott的回答很好,但是我现在才意识到,我希望它只在那一行显示一次,这是可能的。那一行显示一次是什么意思?曾经?如果X列或AP列中该行的值发生了更改,该怎么办?这是否应该重置行的验证?我认为在这个问题上,更多的信息比更少的信息更好地帮助我们提供优化的解决方案。让Excel在工作表每次计算时循环一整列数据可能会大大降低速度。@用户3561813请参阅重新措辞的问题您需要循环,您不能一次将一整列与另一整列进行比较。@ScottCraner有什么建议吗?scott的回答很好,但是我现在才意识到,我希望它只在那一行显示一次,这是可能的。那一行显示一次是什么意思?曾经?如果X列或AP列中该行的值发生了更改,该怎么办?这是否应该重置行的验证?我认为在这个问题上,更多的信息比更少的信息更好地帮助我们提供优化的解决方案。让Excel在工作表每次计算时循环一整列数据可能会大大降低速度。@用户3561813请参阅重新措辞的问题让我们希望该工作簿中有几个易失性函数。它工作正常,但随后开始调试If.Cells(i,“AP”).value>.Cells(i,“X”).valueThen@ScottCraner很好!这可能更深入,但您知道如何只验证此语句一次吗?例如,一旦消息弹出,用户单击ok,则不要为此重复该消息row@findwindow-是的,工作表_Calculate不是我放置验证代码的第一选择。根据工作表的复杂程度,它将运行很多次,而不必运行。@Luis您的最佳选择是去掉公式,对数据项执行工作表更改事件,以进行检查并在单元格中插入正确的值。希望该工作表中有几个易失性函数。它工作正常,然后开始调试If.Cells(i,“AP”).value>.Cells(i,“X”).valueThen@ScottCraner很好!这可能更深入,但您知道如何只验证此语句一次吗?例如,一旦消息弹出,用户单击ok,则不要为此重复该消息row@findwindow-是的,工作表_Calculate不是我放置验证代码的第一选择。根据工作表的复杂性,它将运行很多次,但不必运行。@Luis您最好的办法是去掉公式,对数据项执行工作表更改事件,以进行检查并在单元格中插入正确的值。这在某种程度上有效,但不完全符合我的要求,这不会显示弹出消息,而且我希望这是一个尚未计算的触发事件。您可以始终在程序中检查该值是否大于0,如果大于0,则抛出一个msgbox。我知道只需要代码中某个点的值,但您可以通过刷新确保在任何给定时间获得正确的值。这在某种程度上有效,但并不完全符合我的要求,这不会显示弹出消息,而且我希望这是一个尚未计算的触发事件。您可以始终在程序中检查该值是否大于0,如果大于0,则抛出一个msgbox。我知道只需要在代码中的某一点上使用该值,但您可以通过刷新确保在任何给定时间获得正确的值。