Excel ngăn ô và nội dung của nó bị xóa (không bảo vệ trang tính)


0

Tôi có 2 cột trong bảng excel mà tôi muốn bảo vệ theo cách bạn không thể xóa ô cũng như nội dung của nó. Tôi không muốn sử dụng bảo vệ trang tính tích hợp, thay vào đó tôi muốn sử dụng VBA (vì không cần mật khẩu). Tôi đã tìm thấy một số mã sẽ ngăn các ô bị xóa, nhưng nó không hoạt động. Ngoài ra tôi không biết VBA hoạt động như thế nào và do đó tôi sẽ rất vui nếu ai đó có thể cung cấp giải pháp hoặc hướng dẫn tôi cách tự làm.

Mã tôi tìm thấy là đây:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Range("A6:B1048576")) Is Nothing Then Exit Sub
    On Error GoTo ExitPoint
    Application.EnableEvents = False
    If Not IsDate(Target(1)) Then
        Application.Undo
    End If
ExitPoint:
    Application.EnableEvents = True
End Sub

Tại sao bạn không muốn sử dụng tấm bảo vệ?
Selkie

Hàm thay đổi Worksheet chỉ hữu ích nếu chọn một ô. Nếu họ chọn một phạm vi ô, nó sẽ báo lỗi và thoát. Bảo vệ trang tính sẽ tốt hơn khi bạn có thể ngăn họ chọn ô ở vị trí đầu tiên
DavePenn

Tôi không muốn ngăn họ chỉnh sửa. Tôi chỉ muốn ngăn người dùng xóa toàn bộ ô hoặc xóa mục nhập (không có nội dung trong ô)
XtremeBaumer

Câu trả lời:


1

Điều này tương tự như mã trong câu hỏi của bạn, nhưng ngăn bất kỳ ô nào trong các cột A: B bị xóa / đặt thành trống:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim c As Range
    Dim b As Boolean

    On Error GoTo Terminate

    With Application
        .EnableEvents = False
        .ScreenUpdating = False
    End With

    For Each c In Target.Cells
        If Not Intersect(c, Range("A:B")) Is Nothing And c.Value = "" Then
            b = True
            GoTo UndoChange
        End If
    Next c

UndoChange:
    If b Then Application.Undo

Terminate:
    If Err Then
        Debug.Print "Error", Err.Number, Err.Description
        Err.Clear
    End If

    With Application
        .EnableEvents = True
        .ScreenUpdating = True
    End With
End Sub

Nó hoạt động với nhiều lựa chọn ô, vì nó lặp qua từng ô trong phạm vi đã thay đổi và kiểm tra giá trị trống.

EDIT: Mã sửa đổi, để tích hợp Worksheet_Changechức năng hiện có của bạn ;

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim c As Range
    Dim b As Boolean

    On Error GoTo Terminate

    With Application
        .EnableEvents = False
        .ScreenUpdating = False
    End With

    For Each c In Target.Cells
        If Not Intersect(c, Range("A:B")) Is Nothing And c.Value = "" Then
            b = True
            GoTo UndoChange
        End If
        If c.Column = 10 And c.Row >= 6 Then
            c.Value = UCase(c.Value)
        End If
    Next c

UndoChange:
    If b Then Application.Undo

Terminate:
    If Err Then
        Debug.Print "Error", Err.Number, Err.Description
        Err.Clear
    End If

    With Application
        .EnableEvents = True
        .ScreenUpdating = True
    End With
End Sub

nhưng họ vẫn có thể chỉnh sửa?
XtremeBa đếm

Đúng. Bạn đã thử chưa?
Olly

Có thể là nó không thể có 2 Worksheet_Changesubs cho cùng một tờ?
XtremeBa đếm

Không, bạn không thể. Thay thế mã hiện tại của bạn bằng mã tôi đã đăng.
Olly

Vâng, điều đó là không thể. Tôi sẽ phải hợp nhất mã như mã khác mà tôi cần.
XtremeBa đếm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.