如果尚未设置,则更改单元格中的值

时间:2016-01-04 12:35:57

标签: excel excel-vba vba

为什么这段代码不起作用?

Private Sub Worksheet_Change(ByVal Target As Range)

    If Target.Cells.Count > 1 Or IsEmpty(Target) Then Exit Sub
    If Not Intersect(Target, Columns(1)) Is Nothing Then
        If Len(Target.Value) <> 14 Then
            Target.Value = Format(Now(), ["yyyymmddhhmmss"])
            Target.NumberFormat = "0"
        Else
            With Application
                .EnableEvents = False
                .Undo
                .EnableEvents = True
            End With
        End If
    End If
    If Not Intersect(Target, Columns(18)) Is Nothing Then
        If Len(Target.Value) <> 10 Then
            Target.Value = Format(Date, ["yyyy.mm.dd"])
        Else
            With Application
                .EnableEvents = False
                .Undo
                .EnableEvents = True
            End With
        End If
    End If
End Sub

如果尚未设置(我检查字符串len),我需要更改单元格中的值,因此如果设置了值,我需要阻止此值通过此宏进行更改,并且只能手动更改。

怎么做?

1 个答案:

答案 0 :(得分:2)

首先在更改任何值之前使用Application.EnableEvents = False,然后在退出之前使用Application.EnableEvents = True。通过更改值,您将触发另一个在原始文件上运行的事件,并可能尝试撤消您开始的事件。

Private Sub Worksheet_Change(ByVal Target As Range)

    If Target.Cells.Count > 1 Or IsEmpty(Target) Then Exit Sub
    Application.EnableEvents = False
    If Not Intersect(Target, Union(Columns(1), Columns(18))) Is Nothing Then
        Dim tmp As Variant
        tmp = Target.Value
        Application.Undo
        If Not Intersect(Target, Columns(1)) Is Nothing Then
            If Len(Target.Value) <> 14 Then
                Target.Value = Format(Now(), ["yyyymmddhhmmss"])
            End If
        ElseIf Not Intersect(Target, Columns(18)) Is Nothing Then
            If Len(Target.Value) <> 10 Then
                Target.Value = Format(Date, ["yyyy.mm.dd"])
            End If
        End If
    End If

    Application.EnableEvents = True
End Sub

逻辑中的另一个漏洞是检查当前的目标值的长度。您需要首先撤消,以便在输入新内容之前查看的值。