Vba 隐藏受保护工作表(活动工作表除外)上的锁定行

Vba 隐藏受保护工作表(活动工作表除外)上的锁定行,vba,excel,macros,Vba,Excel,Macros,我试图找出如何使用VBA代码隐藏锁定的行。 假设我有3张受密码保护的工作表,所有单元格都被锁定,UserInterfaceOnly:=True 我的ActiveX按钮在表1上。我想隐藏所有工作表(表1、表2和表3)中的行(“1:2”)。但是,该代码仅适用于按钮所在的工作表Sheet1。当涉及到隐藏Sheet2/Sheet3上的行时,Excel说我无法隐藏该范围,因为它已被锁定。但是,它也被锁定在Sheet1上,但它只是工作并隐藏/取消隐藏行1:2 我已经制定了一个解决方案,在隐藏/取消隐藏行之前

我试图找出如何使用VBA代码隐藏锁定的行。 假设我有3张受密码保护的工作表,所有单元格都被锁定,UserInterfaceOnly:=True

我的ActiveX按钮在表1上。我想隐藏所有工作表(表1、表2和表3)中的行(“1:2”)。但是,该代码仅适用于按钮所在的工作表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
正如您所看到的,我并没有取消Sheet1的保护,它可以正常工作

是否有任何方法可以实现这一点,或者它总是只在ActiveX按钮所在的工作表上工作?另外,我不想使用AllowFormatingRows:=True


谢谢

我很抱歉,您应该使用Unprotect/Protect命令。没有这一点,它就不会起作用

但是,您可以尝试使用Application.ScreenUpdate标志删除“闪烁”


我很震惊,你应该使用Unprotect/Protect命令。没有这一点,它就不会起作用

但是,您可以尝试使用Application.ScreenUpdate标志删除“闪烁”


为了防止屏幕闪烁,您可以在运行宏之前设置
Application.screenUpdate=False
,然后将其返回到
True

至于能够隐藏行而不首先保护它们所在的工作表,我认为这是不可能的。坦率地说,我很惊讶它在
ActiveSheet
上工作,而它最初是受保护的


最后,这只是我的吹毛求疵,我会限定第一行代码在哪张表上工作——明确使用您所处理的对象是防止意外行为的好方法。

要防止屏幕闪烁,您可以在运行宏之前设置
Application.ScreenUpdate=False
,然后将其返回到
True

至于能够隐藏行而不首先保护它们所在的工作表,我认为这是不可能的。坦率地说,我很惊讶它在
ActiveSheet
上工作,而它最初是受保护的


最后,这只是我的吹毛求疵,我会限定第一行代码在哪张表上工作——明确使用您所处理的对象是防止意外行为的好方法。

您可以尝试一下,但我不确定它是否有效。添加一个工作表变量(
Dim WS as worksheet
),然后循环所有工作表(
,用于此工作簿中的每个WS
),并将if语句放入循环中(
if Not WS=ActiveWorkSheet then
),然后将代码放入其中。如果活动工作表始终相同,则可以使用如下If语句:
如果WS.name“活动工作表名称在此处”,则
。试试这个,如果有用的话给我们一个简短的更新。你可以试试这个,但我不确定它是否有用。添加一个工作表变量(
Dim WS as worksheet
),然后循环所有工作表(
,用于此工作簿中的每个WS
),并将if语句放入循环中(
if Not WS=ActiveWorkSheet then
),然后将代码放入其中。如果活动工作表始终相同,则可以使用如下If语句:
如果WS.name“活动工作表名称在此处”,则
。试试这个,如果可以的话给我们一个简短的更新。
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