Заблокировать определенные ячейки в диапазоне

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

Когда я запускаю приведенный ниже код, в результате оказывается заблокирован весь лист. Если я добавлю оператор else, лист будет разблокирован. По сути, каков бы ни был последний оператор .locked = (true, false), весь лист завершается.

Изменить 1 Возможно ли, что у меня есть какие-то настройки включения / выключения, которые мешают, поскольку я единственный, кто не может заставить что-либо из этого работать?

Sub ProtectTheSheet()
Dim chCell As Range
Dim chRng As Range

'Clear the default status
ActiveSheet.Unprotect
Range("A7:I35").Locked = False

Set chRng = ActiveSheet.Range("A7:I35")

'Check cell value in body and lock cells with content
For Each chCell In chRng.Cells
    If chCell.Value <> "" Then Cells.Locked = True
Next chCell

ActiveSheet.Protect

End Sub

person Ryan E    schedule 14.10.2011    source источник
comment
Вы пробовали записывать макрос, пока делаете это вручную? Это действительно может помочь вам изучить соответствующие команды.   -  person Jean-François Corbett    schedule 14.10.2011
comment
По вашему запросу настроек - у вас работает какой-либо другой код? Как я писал ниже, ваша ошибка указывает на проблему с объединенными ячейками, но с тех пор вы определили, что они не находятся в этом диапазоне   -  person brettdj    schedule 16.10.2011


Ответы (7)


Проверьте это: http://www.mrexcel.com/archive/VBA/15950b.html

Sub CellLocker()
Cells.Select
' unlock all the cells
Selection.Locked = false
' next, select the cells (or range) that you want to make read only, 
' here I used simply A1
Range("A1").Select
' lock those cells
Selection.Locked = true
' now we need to protect the sheet to restrict access to the cells. 
' I protected only the contents you can add whatever you want
ActiveSheet.Protect DrawingObjects:=false, Contents:=true, Scenarios:=false
End Sub

Если вы скажете Range ("A1"). Select, то будет заблокирован только A1. Вы можете указать несколько ячеек для блокировки, указав следующее:
A3: A12, D3: E12, J1: R13, W18
Это блокирует A3 до A12 и D3 до E12 и т. Д.

person Sidharth Panwar    schedule 14.10.2011
comment
Стоит отметить, поскольку OP является новым для VBA: вам не нужно выбирать ячейки, чтобы заблокировать или разблокировать их (или что-то еще делать с ними). Range (A1) .Locked = True работает нормально. - person Tim Williams; 14.10.2011
comment
Это просто предупредительный фрагмент, который разблокирует все ячейки на листе, если они заблокированы. Но я согласен, что нам не нужна эта строка для работы кода :) - person Sidharth Panwar; 14.10.2011
comment
Я имел в виду, что выбирать потом блокировать / разблокировать не нужно. Все можно сделать без выбора ... - person Tim Williams; 14.10.2011

Вы можете попробовать это.

Public Sub abc()
ActiveSheet.Unprotect Password:="1234"
ActiveSheet.Range("I8:I500, K8:K500, M8:M500, N8:N500").Cells.Locked = False
ActiveSheet.Protect Password:="1234"
End Sub
person Ragala Santosh Kumar    schedule 20.06.2017

Возможно, я что-то упускаю, но ...

Cells.Locked = True

... заблокирует все ячейки на активном листе. Если вы просто измените его на ...

chCell.Locked = True

... тогда это работает; Я думаю?! Поскольку диапазон очень мал, вы также можете не разблокировать ячейки в начале, а вместо этого разблокировать ячейки, блокируя их, например.

For Each chCell In chRng.Cells
    If chCell.Value <> "" Then 
    chCell.Locked = True
    Else
    chCell.Locked = False
    End If
Next chCell

Если вы новичок в VBA, я бы порекомендовал прокручивать код построчно, как описано в этом Видео консультанта по Excel. Если вы пошагово просматриваете код, вы можете проверить, работает ли ячейка A7 должным образом? ... вместо того, чтобы просто увидеть конечный продукт.

person Ed Bolton    schedule 14.10.2011
comment
При копировании и вставке это вообще не работает. Я должен использовать продолжение _, чтобы связать if-then-else и удалить EndIf. С EndIf он возвращает ошибку, в которой говорится, что блока If нет. Когда я удаляю его, он запускает chCell.Locked = True и выдает ошибку с той же ошибкой, что и выше. Время выполнения 1004: невозможно установить свойство Locked класса Range. - person Ryan E; 15.10.2011

Быстрый способ разблокировать непустые ячейки - использовать SpecialCells, см. Ниже.

В моем тестировании этот код обрабатывает объединенные ячейки в порядке, я думаю, что это то, что вызывает вашу ошибку в коде Тима, когда он пытается обрабатывать каждую ячейку индивидуально (что, чтобы быть ясным, не является проблемой в коде Тима, это имеет дело с неожиданным исходом)

Вы также можете найти эту мою статью Быстрый метод определения диапазона разблокированных ячеек полезно

Sub Quicktest()
    Dim rng1 As Range
    Dim rng2 As Range
    On Error Resume Next
    Set rng1 = ActiveSheet.Range("A7:I35").Cells.SpecialCells(xlFormulas)
    Set rng2 = ActiveSheet.Range("A7:I35").Cells.SpecialCells(xlConstants)
    On Error GoTo 0
    ActiveSheet.Unprotect
    ActiveSheet.Range("A7:I35").Cells.Locked = False
    If Not rng1 Is Nothing Then rng1.Cells.Locked = True
    If Not rng2 Is Nothing Then rng2.Cells.Locked = True
    ActiveSheet.Protect
End Sub
person brettdj    schedule 16.10.2011
comment
Можете ли вы опубликовать свой файл (обработать его, если необходимо) в Интернете, чтобы мы могли его просмотреть? - person brettdj; 16.10.2011
comment
Райан, ты все еще смотришь на это? - person brettdj; 23.10.2011
comment
Да, я все еще ищу, но я был изрядно завален. Спасибо за вашу помощь и интерес. Как опубликовать файл? - person Ryan E; 28.10.2011
comment
@RyanEllis, я знаю это чувство .... Предположительно, есть место, куда вы могли бы загрузить свой файл. Быстрый Google открывает такие варианты, как эти - person brettdj; 28.10.2011

Я знаю, что это старый поток, но я тоже какое-то время застрял на нем, и после некоторого тестирования в Excel 2013 вот что я делаю, если ваш диапазон включает любую объединенную ячейку

  • Объединенные ячейки должны быть полностью включены в этот диапазон (например, объединение должно полностью находиться в пределах диапазона, который блокируется / разблокируется.
  • Объединяемый диапазон может быть больше или, по крайней мере, точно соответствовать диапазону объединенных ячеек. Если это именованный диапазон, который тоже работает.

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

public sub test()
   Sheet1.range("myNameRange").locked = true
   Sheet1.protect
end sub

Дважды он сработает в первый раз и выйдет из строя во второй раз. Поэтому вам следует снять защиту с целевого диапазона (или листа) перед ....

person logicOnAbstractions    schedule 08.06.2015

Если вы хотите защитить определенные ячейки любого конкретного Excel без защиты паролем, вот решение:

Sub ProtectingSheet()

  Workbooks.Open (c\documents\....)

  Dim mainworkBook As Workbook

  Set mainworkBook = ActiveWorkbook

  Worksheets(CellValue).Activate

  mainworkBook.Sheets("Sheet1").Range("A1:AA100").Locked = True

  Range(Cells(1, 2), Cells(1, 25)).Select
  Selection.Locked = False

  ActiveSheet.Protect

End Sub
person Arjun Handa    schedule 03.07.2019

person    schedule
comment
Это приводит к ошибке времени выполнения 1004: невозможно установить свойство Locked класса Range. - person Ryan E; 15.10.2011
comment
У меня работает, поэтому в вашей настройке должно быть что-то другое. - person Tim Williams; 15.10.2011
comment
Есть идеи, что может быть по-другому? - person Ryan E; 16.10.2011
comment
Не совсем - может быть, объединенные ячейки? - person Tim Williams; 16.10.2011
comment
У меня есть несколько объединенных ячеек на листе, но они не попадают в диапазон. - person Ryan E; 16.10.2011
comment
Тогда я не знаю, что еще предложить. Код не работает в определенной ячейке или во всех ячейках? - person Tim Williams; 16.10.2011