首页 > 解决方案 > If-Then 语句在 Sub 和 Calling Procedure 之间循环

问题描述

各位,我需要一些帮助...

我有一个子程序,用于检测工作表 G 列中的数据验证,并根据 C 列中的值(STD 或 OPT)触发 msgbox。这部分工作正常,但是当将 C 列从“OPT”切换回“STD”时,我试图获取一个值(PAINT,WHT)以返回(如果这发生变化)到 G 列。逻辑似乎并不复杂,但是当我放置一个 IF...Then 语句时,它不断地想要返回到调用过程,并为我的规格表中的每一行重复该过程。本质上,当我运行主过程时,它会调用并运行 Sub,但是在操作(在 IF 语句内)完成和整个主过程完成之前,我必须按 Enter 大约 45 次。有人可以查看我的代码以了解为什么会这样吗?我'

这是我的 Sub 中的代码:

Sub VerifyDVG()

    Dim aCl As Range
    Dim ws As Worksheet
    Dim dvG As Range
    Dim Cv As String
    Dim msgS As String
    Dim msgO As String
    Dim Title As String
    Dim Ntfy As String
    
    Set aCl = ActiveCell
    Set ws = Sheets("53SCT-FRCOHAR")
    
    msgS = "Please verify the correct Specification, by selecting it from the Finish Options List."
    msgO = "Please choose a Specification from the Finish Options List."
    Title = "Verify Specifications"
    
    ws.Unprotect ("******")
    On Error GoTo noval
    
    Set dvG = Range("G:G").Cells.SpecialCells(xlCellTypeAllValidation)
    Cv = aCl.Value
    
        If Intersect(dvG, aCl.Offset(0, 4)) Is Nothing Then GoTo noval
            If Cv = "STD" And aCl.Row = 53 Then
                Ntfy = MsgBox(msgS, vbExclamation + vbOKOnly, Title)
                aCl.Offset(0, 4).Value = "PAINT, WHT"
            ElseIf Cv = "STD" And aCl.Row <> 53 Then
                Ntfy = MsgBox(msgS, vbExclamation + vbOKOnly, Title)
                aCl.Offset(0, 4).Value = "UC"
            Else
                Ntfy = MsgBox(msgO, vbExclamation + vbOKOnly, Title)
            End If
            
        ws.Protect ("******")
        Exit Sub
noval:
        ws.Protect ("******")
        MsgBox (Null)
    
    On Error GoTo 0
    
End Sub

当它到达这一行时:

aCl.Offset(0, 4).Value = "PAINT, WHT"

或者

aCl.Offset(0, 4).Value = "UC"

...它成功更改了 G 列的值,但立即返回调用过程并继续循环,直到到达我的文档末尾。

注意,调用过程确实有一个参数集:

Private Sub Worksheet_Change(ByVal Target As Range)

这和它有什么关系吗?或者我如何将其他电话堆叠在其中?或者,也许,使用“ActiveCell”会导致循环发生,不知何故?

我基本上只希望子在用户浏览文档时每行运行一次。

提前感谢您的帮助!

标签: loopsif-statementmethod-call

解决方案


推荐阅读