【问题标题】:Allow user to input certain value in locked cells允许用户在锁定的单元格中输入特定值
【发布时间】:2017-10-01 00:05:17
【问题描述】:

我目前正在使用两段 vba 代码。我正在尝试将它们结合在一起以实现以下目的。

第一个代码

我的代码允许用户双击一个单元格,然后为该单元格添加时间戳,然后锁定相关单元格。哪个工作正常。但是,在某些情况下,用户必须输入 NA,然后运行不同的代码(第二个代码)。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

    Application.EnableEvents = False

    With Target
        If .Column = 4 Then
            Select Case .Row
                Case 20, 24, 25, 27, 28, 30, 31, 32, 33, 34, 35, 37, 38, 40, 42, 43, 44, 54, 55, 56, 58, 59, 61, 62, 63, 64, 65
                Sheets("Sheet3").Protect Password:="Test", userinterfaceonly:=True
                    .Value2 = "Prepared By" & "  " & Environ("Username")
                    .Value2 = .Value2 & "  " & Format(Now, "yyyy-MM-dd hh:mm:ss")
                     .Locked = True
                    End Select
                 End If
    End With
End Sub

用户键入不适用时的第二个代码

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
    '// Check if the target row number is in our array:
    Select Case Target.Row
        Case 20, 24, 25, 27, 28, 30, 31, 32, 33, 34, 35, 37, 38, 40, 42, 43, 44, 54, 55, 56, 58, 59, 61, 62, 63, 64, 65
            ' Do Something
            If CStr(Target.Value) Like "*NA*" Then

                Target.Value = "Not applicable" & "  " & Environ("Username") & "  " & Format(Now, "yyyy-MM-dd hh:mm:ss")

            End If

        Case Else
            ' Do nothing
            Exit Sub
    End Select
End Sub

需要克服的问题

一旦用户双击单元格并锁定,以后就无法将该单元格更改为 NA。一旦单元格被锁定,NA 应该是用户应该能够键入的唯一值。

问题

有没有一种方法可以让用户仅在单元格被锁定后才输入 NA。因此用户只有两个选项可以输入 na 或 Double click

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    显然,在单元格被锁定之前,您无法输入任何内容。添加数据验证以仅允许“NA”而不是锁定单元格。像这样的:

    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    
        Application.EnableEvents = False
        With Target
            If .Column = 4 Then
                Select Case .Row
                    Case 20, 24, 25, 27, 28, 30, 31, 32, 33, 34, 35, 37, 38, 40, 42, 43, 44, 54, 55, 56, 58, 59, 61, 62, 63, 64, 65
                        .Value2 = "Prepared By" & "  " & Environ("Username") & "  " & Format(Now, "yyyy-MM-dd hh:mm:ss")
                        With .Validation
                            .Delete
                            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Formula1:="NA"
                            .IgnoreBlank = False
                            .InCellDropdown = False
                            .ErrorTitle = "Invalid input"
                            .ErrorMessage = "NA available only"
                            .ShowError = True
                        End With
               End Select
            End If
        End With
        Application.EnableEvents = True
    
    End Sub
    

    此方法假定工作表根本不受保护。

    【讨论】:

    • 一个新颖的解决方案! (我认为验证仍然允许将非“NA”值复制到单元格中,但这对于 OP 的目的可能就足够了。)但是......(a)代码不会'在工作表受保护时为我运行(尽管它受到UserInterfaceOnly:=True 的保护!),它在尝试添加验证时崩溃(b)您需要确保,一旦工作表受到保护,该单元格将需要未锁定(即.Locked = False?),以便用户在需要时可以实际输入“NA”。所以我怀疑你根本不需要或想要保护表。
    • @omegastripes 谢谢。更新后的答案完美
    • @YowE3K 感谢您的帮助
    猜你喜欢
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多