大家好,我需要一些帮助……
我有一个子程序,用于检测工作表 G 列中的数据验证,并根据 C 列中的值(STD 或 OPT)触发消息框。此部分工作正常,但我试图在将 C 列从“OPT”切换回“STD”时获取返回到 G 列的值(PAINT、WHT)(如果发生变化)。逻辑似乎并不复杂,但当我放置 IF...Then 语句时,它不断想要返回到调用程序,并对规格表中的每一行重复该过程。本质上,当我运行主程序时,它会调用并运行子程序,但随后我必须按 Enter 键约 45 次,操作(在 IF 语句内)才能完成,整个主程序才能完成。有人可以查看我的代码以了解为什么会发生这种情况吗?我已经用尽了我的知识,花了太多时间试图纠正这个问题。
这是我的 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”会导致循环发生?
基本上,我只是希望当用户浏览文档时,子程序每行运行一次。
在此先感谢大家的帮助!