Force пользователю выбрать только одну конкретную ячейку

Обновить

November 2018

Просмотры

962 раз

3

Я не могу заблокировать мой лист, потому что мне нужно, чтобы получить доступ к некоторым клеткам запускать макросы.

Я хочу, чтобы макрос, который выбирает ячейку (F1), когда пользователь попытается выбрать любую другую ячейку.

Мне нужен макрос, как этот, я думаю:

    Private Sub Worksheet_Change(ByVal Target As Range)


    End Sub

3 ответы

0

Здесь 2 варианта:

,

1. Без защиты листа - в каждом модуле листа , чтобы настроить «разблокированы» клетки (Ex «C3».)


Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
    With Target
        If .Column <> 3 Or .Row <> 3 Or .CountLarge > 1 Then Application.Undo
    End With
    Application.EnableEvents = True
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Application.EnableEvents = False
    With Target
        If .Column <> 3 Or .Row <> 3 Or .CountLarge > 1 Then Cells(3, 3).Select
    End With
    Application.EnableEvents = True
End Sub

,

2. Защита листа - в модуле ThisWorkbook


Private Sub Workbook_Open()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        protectWS ws
    Next
End Sub
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    protectWS Sh
End Sub

Public Function protectWS(Optional ByRef ws As Worksheet = Nothing) As Boolean
    If ws Is Nothing Then Set ws = Application.ActiveSheet
    If Not isWSProtected(ws) Then
        ws.Protect Password:=vbNullString, _
                   DrawingObjects:=True, _
                   Contents:=True, _
                   Scenarios:=True, _
                   UserInterfaceOnly:=True, _
                   AllowFormattingCells:=False, _
                   AllowFormattingColumns:=False, _
                   AllowFormattingRows:=False, _
                   AllowInsertingColumns:=False, _
                   AllowInsertingRows:=False, _
                   AllowInsertingHyperlinks:=False, _
                   AllowDeletingColumns:=False, _
                   AllowDeletingRows:=False, _
                   AllowSorting:=False, _
                   AllowFiltering:=False, _
                   AllowUsingPivotTables:=False
    End If
End Function

Private Function isWSProtected(Optional ByRef ws As Worksheet = Nothing) As Boolean
    isWSProtected = ws.ProtectContents Or _
                    ws.ProtectDrawingObjects Or _
                    ws.ProtectScenarios
End Function

  • Вариант 1 вынуждает пользователей ячейки C3

    • могут быть перемещены в ThisWorkbook модуль, с параметрами для строки и столбца
  • Вариант 2 использует пустой пароль, и позволяет выполнять VBA ( UserInterfaceOnly)

1

Как и другие ребята писали, лучше снять защиту листа, играть макрос и защитить лист, но, если вы считаете, что отключить все ячейки, за вычетом клеток, что вы определить, является лучшим способом, вы можете использовать этот код:

Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
    If Not Intersect(Target, Range("F10")) Is Nothing Then 'use your free cell
        do
    Else
        Application.Undo
        MsgBox "you can modify only the cell(F10)" 'Just to inform what is the cell editable
        Range("F10").Select
    End If
    Application.EnableEvents = True
End Sub
2

Поместите этот код в модуль листа:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Call Cells(1, 6).Select
End Sub