VBA代码不允许用户选择带有特定文本的单元格

时间:2019-01-31 14:51:47

标签: excel vba

我正在使用电子表格来复制前一天的用户数据,然后删除所有数值,但将单元格保留为“ NA”。我想要的是用户无法更改/删除仍带有“ NA”的单元格。我发现一些代码,如果选择了某个单元格,则使用OFFSET向下移动一个单元格(基于行和列),但是我无法弄清楚如何使用OFFSET如果当前单元格向下移动一个单元格包含“ NA”。 (https://www.extendoffice.com/documents/excel/3820-excel-lock-cell-without-protecting-sheet.html)此工作表已经使用质量设置密码锁定,因此我无法做任何事情来解锁电子表格,然后选择要锁定的“ NA”单元格,然后重新锁定电子表格,从而寻找一种防止选择或更改单元格的创新方法。此外,代码将需要一直运行,而不仅仅是选择了要运行的宏。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

如果用户可以在未启用宏的情况下打开书,那么我不确定您要问的内容是否可能。

但是,如果可以假定启用了宏,则可以使用事件来防止用户选择单元格(类似于您提到的OFFSET),也可以手动将更改跟踪到隐藏的选项卡上以记录更改并进行处理他们认为合适。您可以通过多种方式实现后者,只需搜索“ VBA跟踪对工作表的更改”等。

这是您使用OFFSET方法的方式:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Cells(1, 1).Text = "NA" Then
        Beep
        Cells(Target.Row, Target.Column).Offset(0, 1).Select
    End If
End Sub

请记住,这是一种非常简单的方法。这不会阻止用户选择多个单元格(一个范围)并删除内容。也不会阻止将值粘贴到包含“ NA”的范围内。

更新: 以下是改进的版本,如果其中一个单元格包含“ NA”,它将至少阻止用户选择多个单元格(用于粘贴或删除)。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim testarea As Range
    Set testarea = Intersect(UsedRange, Target.Cells)
    If Not (testarea Is Nothing) Then
        Application.EnableEvents = False
        For Each cell_to_check In Intersect(UsedRange, Target.Cells)
            If cell_to_check.Text = "NA" Then
                Beep
                Cells(cell_to_check.Row, cell_to_check.Column).Offset(0, 1).Select
                Do Until Selection.Text <> "NA"
                    Selection.Offset(0, 1).Select
                Loop
                Exit For
            End If
        Next
        Application.EnableEvents = True
    End If
End Sub

但是,这仍然存在一些缺陷,因为仍然可以从包含“ NA”的单元格中的其他区域拖动单元格。