Вопрос или проблема
У меня есть два столбца, E и G, в которых находятся формулы, поэтому я заблокировал эти столбцы и защитил лист, на котором они находятся. У меня есть две кнопки на листе: кнопка Скрыть и Показать. После блокировки этих столбцов и защиты листа макросы, назначенные на эти кнопки, больше не работают. Когда я выбираю кнопки, я получаю ошибку времени выполнения ‘1004’, невозможно установить свойство Hidden класса Range.
Код макроса следующий:
Sub Hide()
'
' Макрос Скрыть
'
' Горячая клавиша: Ctrl+Shift+H
'
For Each c In Range("C7:C446")
If IsEmpty(c.Value) Then
'Если (c.Value) = "" Тогда
c.EntireRow.Hidden = True
End If
Next c
End Sub
Макрос Показать:
Sub UH()
'
' Макрос UH
'
'
Rows("6:447").Select
Selection.EntireRow.Hidden = False
End Sub
Я думаю, что мне нужно добавить команду снятия защиты, которую я пробовал, но она, похоже, не работает. Я пытался:
Worksheets("JE").Unprotect Password:="ImportLCPA17", UserInterfaceOnly:=True
Кто-нибудь знает, какие изменения я могу внести, чтобы эти макросы скрытия и показа, связанные с кнопками, работали, оставаясь с заблокированными столбцами?
Вот что сработало для меня:
Чтобы первоначально снять защиту с листа:
Worksheets("name").Unprotect Password:="password"
Чтобы снова защитить лист:
Worksheets("name").Protect Password:="password"
Ответ или решение
Решение проблемы с макросами «Скрыть» и «Показать» после защиты листа в Excel
Если вы столкнулись с проблемой, связанной с неработоспособностью макросов в таком контексте, как защита листа Excel, это может быть довольно распространенной ситуацией. Давайте подробным образом разберем причины возникновения ошибки и потенциальные решения.
Причина проблемы
Ошибка «Run-time error ‘1004’: unable to set the Hidden property of the Range class» возникает из-за того, что при защите листа Excel ограничения не позволяют изменять состояние видимости строк. Поэтому ваши макросы «Скрыть» и «Показать» не работают, пока лист защищен.
Решение
Для решения этой проблемы необходимо внести некоторые изменения в код ваших макросов. Вам действительно нужно использовать команды для снятия защиты с листа перед выполнением задач, а затем повторно активировать защиту. Вот как можно реализовать этот процесс:
- Снятие защиты с листа перед выполнением макроса.
- Выполнение необходимого действия (скрытие или показ строк).
- Снова защита листа после выполнения действий.
Вот обновленный код для ваших макросов:
Макрос «Скрыть»:
Sub Hide()
' Снятие защиты с листа
Worksheets("JE").Unprotect Password:="ImportLCPA17"
On Error GoTo ErrorHandler ' Обработка ошибок
For Each c In Range("C7:C446")
If IsEmpty(c.Value) Then
c.EntireRow.Hidden = True
End If
Next c
' Защита листа после выполнения макроса
Worksheets("JE").Protect Password:="ImportLCPA17"
Exit Sub
ErrorHandler:
MsgBox "Произошла ошибка: " & Err.Description
' Защита листа в случае ошибки
Worksheets("JE").Protect Password:="ImportLCPA17"
End Sub
Макрос «Показать»:
Sub UH()
' Снятие защиты с листа
Worksheets("JE").Unprotect Password:="ImportLCPA17"
On Error GoTo ErrorHandler ' Обработка ошибок
Rows("6:447").Hidden = False
' Защита листа после выполнения макроса
Worksheets("JE").Protect Password:="ImportLCPA17"
Exit Sub
ErrorHandler:
MsgBox "Произошла ошибка: " & Err.Description
' Защита листа в случае ошибки
Worksheets("JE").Protect Password:="ImportLCPA17"
End Sub
Объяснение изменений:
-
Снятие защиты: Этот код сначала снимает защиту с рабочего листа, что позволяет выполнять изменение свойств строк.
-
Обработка ошибок: Важно учитывать возможность ошибок. Здесь используется
On Error GoTo ErrorHandler
, чтобы обеспечить корректное поведение даже в случае возникновения ошибок. Если возникнет ошибка, то будет показано сообщение об ошибке, и лист будет защищен. -
Защита листа: После выполнения всех необходимых действий документ снова защищается.
Заключение
С помощью предложенных изменении и подхода вы сможете успешным образом управлять видимостью строк на защищенном листе Excel. Это позволит вам работать более эффективно, сохраняя необходимые уровни безопасности данных и возможности настройки интерфейса пользователя.
Если у вас возникнут дополнительные вопросы или потребуется дальнейшая помощь, не стесняйтесь обращаться.