Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 工作簿更改事件中的每个循环语句两个_Excel_For Loop_Event Handling_Vba - Fatal编程技术网

Excel 工作簿更改事件中的每个循环语句两个

Excel 工作簿更改事件中的每个循环语句两个,excel,for-loop,event-handling,vba,Excel,For Loop,Event Handling,Vba,当我尝试在工作簿更改事件中为每个循环运行两个循环时,只有第二个循环正在执行,并且msgbox窗口会重复弹出,而不是关闭。我怎样才能找到一个有利的解决方案呢?请参考以下代码 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Set a = Worksheets("first").Range("q2:q417") ' first foreachloop -------------------

当我尝试在工作簿更改事件中为每个循环运行两个循环时,只有第二个循环正在执行,并且msgbox窗口会重复弹出,而不是关闭。我怎样才能找到一个有利的解决方案呢?请参考以下代码

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Set a = Worksheets("first").Range("q2:q417")

    ' first foreachloop
    -------------------

    For Each b In a
        If b.Value <> "" And Not IsDate(b) Then
            b.ClearContents
            MsgBox ("please enter valid date")
        End If
    Next b

    'second foreach loop
    --------------------
    Set c = Worksheets("first").Range("s2:s417")
    For Each C In a
        If C.Value <> "A" Or _
           C.Value <> "B" Or _
           C.Value <> "EF" Or _
           C.Value <> "CE" Then
            C.ClearContents
            MsgBox ("PLEASE ENTER VALID STATUS")
        End If
    Next C
End Sub
Private子工作表\u selection更改(ByVal目标作为范围)
集合a=工作表(“第一”)范围(“第二季度:第417季度”)
“第一个前驱循环
-------------------
对于a中的每个b
如果b.值“”而不是IsDate(b),则
b、 清晰内容
MsgBox(“请输入有效日期”)
如果结束
下一个b
'第二个foreach循环
--------------------
集合c=工作表(“第一”)范围(“s2:s417”)
对于a中的每个C
如果C.值为“A”,或_
C.值“B”或_
C.价值“EF”或_
C.那么,将“CE”作为值
C.ClearContents
MsgBox(“请输入有效状态”)
如果结束
下一个C
端接头

我的理解是,您试图在更改时监视指定范围的单元格内容

因此:

a) 您需要将
工作表\u选择更改
事件更改为
工作表\u更改

b) 您需要检查更改了哪个单元格,如果它在指定范围内,请验证其内容

将下面的代码放在“第一”页后面的模块上

选项显式
私有子工作表_更改(ByVal目标作为范围)
使范围变暗
设置a=范围(“q2:q417”)
如果不相交(目标,a),则什么都不是
有目标
如果不是IsEmpty(.Value)和IsDate(.Value),则
.ClearContents
MsgBox“请输入有效日期”
如果结束
以
如果结束
变暗b为范围
设置b=范围(“s2:s417”)
如果不相交(目标,b)则为零
有目标
如果不是空的(.Value),则
如果。值为“A”,并且_
.值“B”和_
.价值“EF”和_
.那么,你的价值是“CE”
.ClearContents
MsgBox“请输入有效状态”
如果结束
如果结束
以
如果结束
端接头

设置c=工作表(“第一”).范围(“s2:s417”)
-->
设置a=…
。还有一个建议:使用
选项Explicit
并定义变量。您说的是更改事件,但您的代码用于选择更改事件。因此,每次更改工作表上的选择时,都会触发代码,如果满足条件,您将获得一个msgbox。在这里,您试图通过选择更改事件实现什么?您确实意识到
工作表\u change
事件的目的是捕获通常发生在
工作表(“第一次”)
上的事件。因此,使用
设置a=Range(“Q2:Q417”)
就足够了。您试图用
ErrProc
捕获哪些错误?确实如此。谢谢你的留言。
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim a As Range
    Set a = Range("q2:q417")

    If Not Intersect(Target, a) Is Nothing Then
        With Target
            If Not IsEmpty(.Value) And Not IsDate(.Value) Then
                .ClearContents
                MsgBox "please enter valid date"
            End If
        End With
    End If

    Dim b As Range
    Set b = Range("s2:s417")

    If Not Intersect(Target, b) Is Nothing Then
        With Target
            If Not IsEmpty(.Value) Then
                If .Value <> "A" And _
                    .Value <> "B" And _
                    .Value <> "EF" And _
                    .Value <> "CE" Then
                    .ClearContents
                    MsgBox "PLEASE ENTER VALID STATUS"
                End If
            End If
        End With
    End If
End Sub