#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