2009-08-13 2 views
1

Я работаю над защищенной таблицей Excel и сталкивался с проблемой с ячейками, которые я программно заблокировал, которые по-прежнему можно выбрать. Я не могу нажимать на них напрямую, чтобы выбрать их, но если я выберу ячейку в правом нижнем углу заблокированной ячейки, а затем перетащил ее в верхний левый, все 9 ячеек (включая «заблокированный») выбран. Я также могу щелкнуть мышью, чтобы выбрать 9 ячеек. Я использую следующий код VBA, чтобы защитить и установить критерии отбора:Почему не блокирует ячейку в защищенном листе в Excel, предотвращает выбор?

Worksheets("Sheet1").Protect UserInterfaceOnly:=True 
Worksheets("Sheet1").EnableSelection = xlUnlockedCells 

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

Я также использовал меню форматирования/защиты ячейки Excel, чтобы сделать то же самое и получить те же результаты.

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

ответ

1

Я думаю, вам нужно создать какой-то код в событии Worksheet_SelectionChange, который проверяет, включены ли ваши защищенные ячейки в новый выбор и, если да, выбирает другую ячейку (возможно, следующий незащищенный справа или ниже).

Я еще не просмотрел код, но беглый поиск «Выбор защищенных ячеек Worksheet_SelectionChange» поднял http://www.vbaexpress.com/kb/getarticle.php?kb_id=383.

1

Вы ничего не пропустили, это просто Excel, поддерживающий форму выбора, предпочитая статус защиты ячеек.

Клетки по-прежнему защищены, но могут быть скопированы.

Использование события Worksheet_SelectionChange позволит вам запустить код для перенаправления выбора защищенных ячеек в другую ячейку. Этот код необходимо сохранить в листе, который вы пытаетесь защитить.

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    Dim Selectedrange As Range 
    Dim ProtectedRange As Range 
    Dim ws As Worksheet 

    Application.EnableEvents = False 

    Set ProtectedRange = ActiveSheet.Range("A1:A10") 

    Set Selectedrange = Intersect(Target, ProtectedRange) 

    If Selectedrange Is Nothing Then 
     Exit Sub 
    Else 
     ActiveSheet.Range("B1").Select 
    End If 

    Application.EnableEvents = True 

End Sub 

Если вы просто хотите, чтобы остановить копирование пользователя из формул, то просто добавьте в свой код, чтобы установить «Формулу Hidden» истину. Если защищенные ячейки будут скопированы, будут скопированы только значения.

Worksheets("Sheet1").Range("A1:A10").Locked = True 
Worksheets("Sheet1").Range("A1:A10").FormulaHidden = True 
Worksheets("Sheet1").Protect UserInterfaceOnly:=True, Password:="123" 
Worksheets("Sheet1").EnableSelection = xlUnlockedCells 

Альтернативным является не перемещать защищенные данные в другой лист и установить его visibilty к «очень скрытый», так что она больше не видна через пользовательский интерфейс. Значения на «очень скрытом» листе все еще можно получить по формуле.

Worksheets("Sheet2").Visible = xlVeryHidden 
Смежные вопросы