#VBA私人子工作表_更改

时间:2018-06-27 16:05:53

标签: vba

有什么可以帮助我的人吗?我花了很多时间搜索并尝试使这两段代码正常工作,但是没用。

有什么办法可以组合这两个代码段吗?它们有两个不同的用途。

1。

Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Range("A:A")) Is Nothing Then Exit Sub
    If Len(Target) = 10 Then
        Range("I" & Target.Row & ":J" & Target.Row & ", K" & Target.Row & ", M" & Target.Row) = "N"
    End If
End Sub

2。

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 12 And Target.Value = "Y" Then
        Target.Offset(0, 1) = Date
    End If
End Sub

我很茫然。...

2 个答案:

答案 0 :(得分:1)

您可以尝试将其作为组合方法:

在宏上加载了worksheet_change事件时,进行更改时需要禁用警报,否则您可能会陷入无限循环。

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

答案 1 :(得分:1)

您可以使用下面的代码。
当您更新列I:KN中的值时,请禁用事件以停止更改事件触发。

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_PROC标签,因此该过程只有一个退出点。