Excel vba - 执行宏时取消保护和保护

时间:2016-10-30 16:32:22

标签: excel vba macros password-protection

我的电子表格通过单击按钮隐藏并显示多行。由于电子表格受密码保护,任何宏都应该应用密码,然后运行hide / show并最终再次设置密码。这就是它的样子。

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个宏。它仍然可以正常工作,但我想知道是否会有一个更简单的方法,只需要1行申请和1x用于设置密码。

感谢您的评论。

丹尼斯 荷兰

1 个答案:

答案 0 :(得分:1)

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

如果您可以使用能够将名称转换为范围和true / False的内容命名您的按钮,您可以将它们全部链接到单个Sub并使用Application.Caller获取调用按钮的名称和从中提取参数。

修改

好的,这是一个非常简单的例子:添加两个"表格"按钮到您的工作表并命名一个" btn_12_5_H"和另一个" btn_12_5_S"。

以下是每个按钮的命名方式:

  1. 通过右键单击
  2. 选择按钮
  3. 在"名称"中输入名称公式栏中的框和按Enter键
  4. enter image description here

    将两个按钮链接到下面的Sub(右键单击按钮>>分配宏):

    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添加参数(即右键单击按钮时选择&#34;分配宏&#34;)

    例如,您可以使用以下内容:

    Book1!'ShowHideRows2 12,TRUE' 
    

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

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

    请注意,因为Sub有参数,它不会出现在&#34;分配宏&#34;列表,你必须输入。