2016-03-02 4 views
0

Я пытаюсь выяснить, как скрыть заблокированные строки с помощью кода VBA. Предположим, у меня есть 3 защищенных паролем листа, со всеми заблокированными ячейками и UserInterfaceOnly: = True.Скрытие заблокированных строк на защищенном листе, отличном от активного листа

Моя кнопка ActiveX находится на Sheet1. Я хочу скрыть строки («1: 2») во всех листах (Sheet1, Sheet2 и Sheet3). Тем не менее, код работает нормально только для Листа, кнопка включена, Sheet1. Когда дело доходит до сокрытия строк на Sheet2/Sheet3, Excel говорит, что я не могу скрыть этот диапазон, потому что он заблокирован. Однако он также заблокирован на Sheet1, но он просто работает и скрывает/скрывает строки 1: 2.

Я уже сделал решение, сняв защиту с этих двух других листов прямо перед тем, как спрятать/развернуть строки, а затем снова защитить их. Это, однако, не выглядит хорошо для меня и заставляет Excel перемещаться между всеми этими листами, которые требуют некоторого (очень мало) времени и «вспышек» при этом. Это нежелательно для меня. Код выглядит следующим образом:

Rows("1:2").EntireRow.Hidden = True 

Sheet2.Unprotect Password:=pwd 
Sheet2.Rows("1:2").EntireRow.Hidden = True 
Sheet2.Protect Password:=pwd, AllowFormattingCells:=True, UserInterfaceOnly:=True 

Sheet3.Unprotect Password:=pwd 
Sheet3.Rows("1:2").EntireRow.Hidden = True 
Sheet3.Protect Password:=pwd, AllowFormattingCells:=True, UserInterfaceOnly:=True 

Как вы можете видеть, я не Лист1 снятия защиты, и это работает.

Есть ли способ достичь этого или он будет работать только на листе, на котором включена кнопка ActiveX? Кроме того, Я не хочу использовать AllowFormatingRows: = True.

Благодаря

+0

Вы можете попробовать это, я не уверен, что он работает. Добавьте переменную рабочего листа ('Dim WS as WorkSheet'), а затем пропустите все листы (« Для каждого WS в этой книге ») и поместите оператор if внутри цикла (' If Not WS = ActiveWorkSheet Then'), и вы введите там свой код. Если активный рабочий лист всегда один и тот же, вы можете сделать оператор if следующим образом: «Если имя рабочей таблицы WS.name <>» появляется здесь «Тогда». Попробуйте это и дайте нам короткое обновление, если оно будет работать. – RobK

ответ

2

Я напуган, что вы должны использовать Unprotect/Защита команд. Без этого это не сработает.

Но вы можете попробовать использовать флаг Application.ScreenUpdating для удаления «вспышек».

Application.ScreenUpdating = False 

Rows("1:2").EntireRow.Hidden = True 

Sheet2.Unprotect Password:=pwd 
Sheet2.Rows("1:2").EntireRow.Hidden = True 
Sheet2.Protect Password:=pwd, AllowFormattingCells:=True, UserInterfaceOnly:=True 

Sheet3.Unprotect Password:=pwd 
Sheet3.Rows("1:2").EntireRow.Hidden = True 
Sheet3.Protect Password:=pwd, AllowFormattingCells:=True, UserInterfaceOnly:=True 

Application.ScreenUpdating = True 
2

Чтобы предотвратить экран мигает, вы можете установить Application.ScreenUpdating = False перед запуском макроса, и вернуть его в True впоследствии.

Что касается возможности спрятать строки без снятия защиты с листа, то они на первом месте, я не думаю, что это возможно. Честно говоря, я удивлен, что он работал над ActiveSheet, в то время как это было защищено в первую очередь.

Наконец-то, и это только я никпикинг, я бы квалифицировал, на каком листе работает первая строка кода, - явное указание того, с какими объектами вы работаете, - хороший способ предотвратить неожиданное поведение.

Смежные вопросы