Excel VBA – 解除和保护执行macros时

我的电子表格通过单击button隐藏和显示多行。 由于电子表格是密码保护的任何macros应该应用密码,然后运行隐藏/显示,最后再次设置密码。 这是它的样子。

Sub Macro1() ActiveSheet.Unprotect Password:="abc" Rows("12:16").EntireRow.Hidden = True ActiveSheet.Protect Password:="abc" End Sub Sub Macro2() ActiveSheet.Unprotect Password:="abc" Rows("12:16").EntireRow.Hidden = False ActiveSheet.Protect Password:="abc" End Sub Sub Macro3() ActiveSheet.Unprotect Password:="abc" Rows("20:24").EntireRow.Hidden = True ActiveSheet.Protect Password:="abc" End Sub Sub Macro4() ActiveSheet.Unprotect Password:="abc" Rows("20:24").EntireRow.Hidden = False ActiveSheet.Protect Password:="abc" End Sub 

脚本工作正常,但我有16个部分需要32个macros。 它仍然正常工作,但我不知道是否会有一个更简单的方法,只需要1行申请和1x设置密码。

谢谢您的意见。

丹尼斯荷兰

 Sub Macro1 HideIt Rows("12:16"), True End Sub Sub Macro2() HideIt Rows("12:16"), False End Sub Sub HideRows(rng As Range, HideIt as Boolean) ActiveSheet.Unprotect Password:="abc" rng.EntireRow.Hidden = HideIt ActiveSheet.Protect Password:="abc" End Sub 

如果你可以命名你的button的东西,可以将名称翻译成一个范围和真/假,你可以将它们全部链接到一个单一的Sub和使用Application.Caller来获取调用button的名称,并提取参数从那。

编辑:

OK这里有一个非常简单的例子:在工作表中添加两个“表单”button,并命名一个“btn_12_5_H”和另一个“btn_12_5_S”。

下面是你如何命名每个button:

  1. 通过右键单击selectbutton
  2. 在公式栏的“名称”框中input名称,然后按Enter键

在这里输入图像说明

将这两个button链接到下面的Sub(右键单击button>>分配macros):

 Sub ShowHideRows() Dim arr 'split the calling button name into an array ' (array will be zero-based) arr = Split(Application.Caller, "_") '**EDIT** check array is expected size... If UBound(arr) <> 3 Then Exit Sub If IsNumeric(arr(1)) and IsNumeric(arr(2)) Then With Me 'if the code is in the sheet module, else "ActiveSheet" .Unprotect Password:="abc" 'arr(1) determines start row 'arr(2) determines # of rows 'arr(3) determines if rows are hidden or not .Cells(arr(1), 1).Resize(arr(2), 1).EntireRow.Hidden = (arr(3) = "H") .Protect Password:="abc" End With End If End Sub 

编辑#2:

为了完整性,请注意,您也可以直接将参数添加到OnAction (即,当您右键单击buttonselect“分配macros”)

例如,你可以使用像这样的东西:

 Book1!'ShowHideRows2 12,TRUE' 

注意整个事情使用单引号。 被调用的sub可能看起来像(非常基本的例子来certificate参数被正确传递):

 Sub ShowHideRows2(rownum, HideIt) Debug.Print rownum, HideIt End Sub 

请注意,因为Sub有参数,它不会显示在“Assign macro”列表中,您必须input它。