Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.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
#VBA专用子工作表\u更改_Vba - Fatal编程技术网

#VBA专用子工作表\u更改

#VBA专用子工作表\u更改,vba,Vba,任何善良的灵魂都能帮助我吗?我花了相当多的时间搜索并试图让这两段代码正常工作,但都做不到 有没有办法把这两个片段结合起来?它们有两个不同的用途 一, 二, 我不知所措……您可以尝试将此作为一种组合方法: 在宏上加载工作表更改事件时,进行更改时需要禁用警报,否则您可能会发现自己处于无限循环中 Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("A:A")) Is Nothing Or

任何善良的灵魂都能帮助我吗?我花了相当多的时间搜索并试图让这两段代码正常工作,但都做不到

有没有办法把这两个片段结合起来?它们有两个不同的用途

一,

二,


我不知所措……

您可以尝试将此作为一种组合方法:

在宏上加载工作表更改事件时,进行更改时需要禁用警报,否则您可能会发现自己处于无限循环中

Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Range("A:A")) Is Nothing Or Target.Column <> 12 Then Exit Sub

    If Len(Target) = 10 Then
        Application.EnableEvents = False
            Range(Cells(Target.Row, "I"), Cells(Target.Row, "K")) = "N"
            Range("M" & Target.Row) = "N"
        Application.EnableEvents = True
    End If

    If Target.Column = 12 And Target.Value = "Y" Then
        Application.EnableEvents = False
            Target.Offset(0, 1) = Date
        Application.EnableEvents = True
    End If

End Sub
Private子工作表\u更改(ByVal目标作为范围)
如果Intersect(目标,范围(“A:A”))为Nothing或Target.12列,则退出Sub
如果Len(目标)=10,则
Application.EnableEvents=False
范围(单元格(Target.Row,“I”)、单元格(Target.Row,“K”)=“N”
范围(“M”和目标行)=“N”
Application.EnableEvents=True
如果结束
如果Target.Column=12且Target.Value=“Y”,则
Application.EnableEvents=False
目标偏移量(0,1)=日期
Application.EnableEvents=True
如果结束
端接头

您可以使用下面的代码。
禁用事件以在更新列
I:K
N
中的值时停止更改事件触发

Private Sub Worksheet_Change(ByVal Target As Range)

    On Error GoTo ERR_HANDLE

    Application.EnableEvents = False

    With Target

        If .Column = 12 Then
            If .Value = "Y" Then
                .Offset(, 1) = Date
            End If
        ElseIf .Column = 1 Then
            If Len(.Value) = 10 Then
                Cells(.Row, 9).Resize(, 3) = "N" 'Column I:K
                Cells(.Row, 13) = "N" 'Column M
            End If
        End If

    End With

EXIT_PROC:

    Application.EnableEvents = True
    On Error GoTo 0

Exit Sub

ERR_HANDLE:
    Select Case Err.Number
        Case 13 'Type mismatch.
            Resume EXIT_PROC
        Case Else 'Any unhandled errors.
            MsgBox "Error " & Err.Number & vbCr & _
                Err.Description, vbOKOnly, "Error in " & ThisWorkbook.Name
            Resume EXIT_PROC
    End Select
End Sub
接受后编辑:

根据@MathieuGuindon的建议,我在代码中添加了一个错误处理程序。处理错误后,代码跳回
EXIT\u PROC
标签,因此该过程只有一个退出点。

是否愿意与大家分享哪些不起作用?您的问题是什么?请至少描述您想用代码归档的内容。我真的不明白为什么很难从中生成一个例程。我的第一个代码可以工作,但第二个代码不起作用,我尝试了许多方法来组合,但都没有效果。我是VBA新手,如果我的问题不清楚,我很抱歉。我知道在同一个过程中不能有两个工作表更改,所以我尝试将其合并为一个,但是第二个代码没有拾取任何内容。向上投票,但无限循环将由
应用程序引起。启用事件
被切换,并且当单元格被修改时,
工作表更改
重新进入。禁用警报无法解决此问题;-)唉,我的脑子迟钝了。这就是我的意思,谢谢你们,非常感谢!杰出的唯一缺少的是一些错误处理,因此如果
.Value
包含一个错误值,例如
if.Value=“Y”,则
抛出一个类型不匹配错误,执行会突然退出,从而使
应用程序.EnableEvents
处于关闭状态。
Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Range("A:A")) Is Nothing Or Target.Column <> 12 Then Exit Sub

    If Len(Target) = 10 Then
        Application.EnableEvents = False
            Range(Cells(Target.Row, "I"), Cells(Target.Row, "K")) = "N"
            Range("M" & Target.Row) = "N"
        Application.EnableEvents = True
    End If

    If Target.Column = 12 And Target.Value = "Y" Then
        Application.EnableEvents = False
            Target.Offset(0, 1) = Date
        Application.EnableEvents = True
    End If

End Sub
Private Sub Worksheet_Change(ByVal Target As Range)

    On Error GoTo ERR_HANDLE

    Application.EnableEvents = False

    With Target

        If .Column = 12 Then
            If .Value = "Y" Then
                .Offset(, 1) = Date
            End If
        ElseIf .Column = 1 Then
            If Len(.Value) = 10 Then
                Cells(.Row, 9).Resize(, 3) = "N" 'Column I:K
                Cells(.Row, 13) = "N" 'Column M
            End If
        End If

    End With

EXIT_PROC:

    Application.EnableEvents = True
    On Error GoTo 0

Exit Sub

ERR_HANDLE:
    Select Case Err.Number
        Case 13 'Type mismatch.
            Resume EXIT_PROC
        Case Else 'Any unhandled errors.
            MsgBox "Error " & Err.Number & vbCr & _
                Err.Description, vbOKOnly, "Error in " & ThisWorkbook.Name
            Resume EXIT_PROC
    End Select
End Sub