Блокировка определенных ячеек в диапазоне

#vba #excel #excel-2010

#vba #excel #excel-2010

Вопрос:

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

Когда я запускаю приведенный ниже код, результатом является блокировка всего листа. Если я добавлю оператор 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
  

Комментарии:

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

2. В вашем запросе «настройки» — выполняется ли у вас какой-либо другой код? Как я написал ниже, ваша ошибка указывает на проблему с объединенными ячейками, но с тех пор вы определили, что они не находятся в этом диапазоне

Ответ №1:

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

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

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

    ActiveSheet.Protect

End Sub
  

Комментарии:

1. Это приводит к ошибке времени выполнения 1004: невозможно установить заблокированное свойство класса Range.

2. Работает для меня, поэтому в вашей настройке должно быть что-то другое.

3. Есть идеи, что может быть по-другому?

4. Может быть, не совсем — объединенные ячейки?

5. У меня есть несколько объединенных ячеек на листе, но не в пределах диапазона.

Ответ №2:

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

 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
  

Ответ №3:

Проверьте это: 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»).Выберите, затем он блокирует только A1. Вы можете указать несколько ячеек, которые будут заблокированы, указав следующее:
A3: A12, D3:E12,J1: R13, W18
Это блокирует A3 до A12 и D3 до E12 и т.д.

Комментарии:

1. Стоит отметить, поскольку OP является новым для VBA: вам не нужно выбирать ячейки, чтобы заблокировать или разблокировать их (или делать с ними практически что-либо еще). Диапазон («A1»). Locked = True работает нормально.

2. Это просто предупредительный фрагмент, который разблокирует все ячейки на листе, если они заблокированы. Но я согласен, что нам не обязательно нужна эта строка для работы кода 🙂

3. Я имел в виду, что нет необходимости выбирать, а затем блокировать / разблокировать. Все это можно сделать без выбора…

Ответ №4:

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

 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 так, как ожидалось?» … вместо того, чтобы просто видеть конечный продукт

Комментарии:

1. При копировании и вставке этот не работает вообще. Я должен использовать продолжение _, чтобы связать if-then-else и удалить EndIf . С EndIf в нем возвращается ошибка, в которой говорится, что нет блока If. Когда я удаляю его, он переходит в chCell. Заблокировано = True и выдает ошибку с той же ошибкой, что и выше. Время выполнения 1004: не удалось установить свойство Locked для класса Range.

Ответ №5:

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

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

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

 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
  

Комментарии:

1. можете ли вы опубликовать свой файл (при необходимости очищенный) в Интернете, чтобы мы могли его просмотреть?

2. райан, ты все еще смотришь на это?

3. Да, я все еще ищу, но я был довольно завален. Спасибо за вашу помощь и интерес. Как мне опубликовать файл?

4. @RyanEllis, я знаю это чувство…. Предположительно, есть какое-то место, которое вы могли бы использовать для загрузки вашего файла. Быстрый поиск в Google выдает такие параметры, как

Ответ №6:

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

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

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

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

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

Ответ №7:

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

 Sub ProtectingSheet()

  Workbooks.Open (cdocuments....)

  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