限制用户删除单元格内容

时间:2016-03-07 07:31:10

标签: excel vba excel-vba

是否有任何方法可以限制用户删除单元格内容 而不使用excel的保护方法 。我有这段代码:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
    If Not Intersect(Target, Range("C21:D" & ws.Range("C" & ws.Rows.Count).End(xlUp).Row)) Is Nothing Then
         Cancel = True
         MsgBox "You are not allowed to edit!", vbCritical + vbOKOnly
    EndIf
End sub

但这只是不允许编辑单元格内容。我想创建一个函数,在不使用protect方法的情况下禁止编辑和删除单元格中的数据。谢谢!

2 个答案:

答案 0 :(得分:0)

没有锁定和解锁,您可以使用它。 我们有一个全局变量来存储选择值(以保留在更改状态之前)。函数SelectionChange,更新当前单元格的值,这样我们就可以在用户尝试后恢复单元格值。

Sub worksheet_change只是控制,如果用户定位指定的行和列(可以调整整个范围),并且如果他尝试更改值,则会提示他并设置值。

Dim prevValue As Variant

Private Sub worksheet_SelectionChange(ByVal target As Range)

    prevValue = target.Value

End Sub

Private Sub worksheet_change(ByVal target As Range)



    If target.Row = 5 And target.Column = 5 Then

        If target.Value <> prevValue Then
            target.Value = prevValue


            MsgBox "You are not allowed to edit!", vbCritical + vbOKOnly

        End If

    End If


End Sub

编辑:禁用编辑非空的每个单元格

Private Sub worksheet_change(ByVal target As Range)



    If prevValue <> "" Then

        If target.Value <> prevValue Then
            target.Value = prevValue


            MsgBox "You are not allowed to edit!", vbCritical + vbOKOnly

        End If

    End If


End Sub

答案 1 :(得分:0)

尝试我的想法。将这些代码复制并粘贴到受保护范围所在的工作表模块中。在我的情况下,它称为“ Arkusz1”。保护范围是“ A1:A10”。

Private Sub Worksheet_Change(ByVal Target As Range)
    For Each cell In Range("A1:A10")
        If cell.Text <> Sheets("hidden").Cells(cell.Row, cell.Column) Then
            Call Undoing
        End If
    Next cell
End Sub

Private Sub Undoing()
    Application.EnableEvents = False
    Application.Undo
    Application.EnableEvents = True
End Sub

在“ This_worksheet”模块中,复制并粘贴以下代码:

Private Sub Workbook_Open()
    Sheets.Add
    ActiveSheet.Name = "hidden"
    Sheets("Arkusz1").Range("A1:A10").Copy
    Sheets("hidden").Select
    ActiveSheet.Paste
    Sheets("hidden").Select
    ActiveWindow.SelectedSheets.Visible = False
End Sub

Private Sub Workbook_Close()
    Sheets("hidden").Visible = True
    Sheets("hidden").Delete
End Sub

您必须将工作表的名称从“ Arkusz1”更改为“ Sheet1”或您的工作表获得的任何其他名称。 这个想法如下。打开工作簿后,该应用程序将创建一个隐藏的电子表格,将受保护的单元格的内容复制到该电子表格中。由于某些技术原因,我必须在复印操作后隐藏工作表,否则它在我的计算机上不起作用。然后,工作表“ Arkusz1”的任何更改都会触发事件,该事件会将受保护范围的内容与隐藏工作表中的相同范围进行比较。 如果存在任何差异,则应用程序将撤消用户的最后操作。

在关闭Excel的事件处理时,必须执行撤消操作,因为撤消上一个动作也是更改工作表的事件,并且我们会导致一系列事件-每个撤消操作都会触发事件“ worksheet_change”,并且它永远不会停止被激活。

 Application.EnableEvents = False
 Application.Undo
 Application.EnableEvents = True