为每次单击VBA按钮分配不同的宏

时间:2017-07-06 17:14:55

标签: vba excel-vba excel

我有一个excel按钮,当我点击它时会隐藏“S-U”列。我想第二次点击按钮,它会隐藏“P-R”等列。你可以每次点击操作一个excel按钮吗?

3 个答案:

答案 0 :(得分:0)

解决此问题的一个方法是声明一个全局变量,并为其指定一个计数器:

Private i As Integer

Sub Button1_Click()

If i = 0 Then
    Do Stuff 'This is the first click
    i = i + 1
Else
    Do Stuff the Second Time 'This is the second time and beyond.
    i = i + 1
End If

End Sub

i将自动分配值0.第一次检查i = 0时,它会在第一次运行时运行。一旦设置i = i + 1,它就会做第二次你想做的其他事情。如果你想第三次这样做,你可以随时做Else If i = 1 Then等等。

在Visual Basic编辑器下,如果您还没有新模块,请创建一个新模块。创建一个按钮并将Button1_Click宏指定给Button。

答案 1 :(得分:0)

如果您只需要在两个选项之间切换,例如就像关闭开关一样,然后使用布尔值:

Public x As Boolean

Private Sub CommandButton1_Click()
If x Then MsgBox ("ON") Else MsgBox ("OFF")
x = Not x
End Sub

答案 2 :(得分:0)

如果您只想做一些事情(听起来像这样),我会让我的宏评估当前状态并采取相应措施。

在您的示例中,您指示首先要隐藏S-U,然后再次单击P-R。这样就可以了:

Sub HideColumns()

    If Sheets("Sheet1").Range("S:S").EntireColumn.Hidden = False Then
        Sheets("Sheet1").Range("S:U").EntireColumn.Hidden = True
    Else
        Sheets("Sheet1").Range("P:R").EntireColumn.Hidden = True
    End If

End Sub

当然,您可以使用其他条件和操作进行扩展。例如更改按钮的文本以表示下一步将执行的操作:

假设你标有" Hide Rows S:U"首先,您可以在VBA中更改它以指示在下次单击时它将执行的操作:

Sub HideColumnsUpdateText()

    If Sheets("Sheet1").Range("S:S").EntireColumn.Hidden = False Then

        Sheets("Sheet1").Range("S:U").EntireColumn.Hidden = True
        Sheets("Sheet1").Buttons("Button 1").Text = "Hide Rows P:R"

    Else
        Sheets("Sheet1").Range("P:R").EntireColumn.Hidden = True

    End If

End Sub

一旦开始评估当前状态(使用ElseIf扩展,甚至使用Case),你可以做的事情真的无止境。你只需要保持逻辑直线。

编辑以进一步扩展: 如果您的情况是线性的 - 也就是说,如果想要以相同的顺序隐藏越来越多的列,您只需要执行其他ifs来评估情况,并逐步执行要隐藏它们的顺序。

个人提示:我发现"如果无论如何="语句比#34更容易理解;如果不是= false" (从技术上讲,你甚至不必输入" = True")。但这意味着你需要从最后的可能性开始,然后向后工作。否则你需要通过" = False评估" (就像我第一次演示的那样),但我发现它有点难以理解。您的结果可能会有所不

你表示你想要按顺序隐藏这些:" S:U"," P:R"," M:O"," Y:L"" G:I" 。这是一个脚本,一旦隐藏了所有这些行,按钮就会显示所有这些行。所以我首先评估最后一种可能性是否正确 - 这是行G:我已经隐藏了吗?如果是这样,那就告诉他们。我还包括更新按钮文字,但这是可选的。

Sub hideSetsOfColumnsProgressively()
    ' progressive order of button function: "S:U","P:R","M:O","J:L","G:I","Unhide Rows"
    If Sheets("Sheet1").Range("G:I").EntireColumn.Hidden = True Then
       Sheets("Sheet1").Range("G:U").EntireColumn.Hidden = False 'shows all rows
       'optionally change the text of the button to indicate the next function:
       Sheets("Sheet1").Buttons("Button 1").Text = "Hide Rows S:U"

    ElseIf Sheets("Sheet1").Range("J:L").EntireColumn.Hidden = True Then
    'then we've already hidden all of the other columns, so do the last set
        Sheets("Sheet1").Range("G:I").EntireColumn.Hidden = True
        Sheets("Sheet1").Buttons("Button 1").Text = "Unhide Rows"

    ElseIf Sheets("Sheet1").Range("M:O").EntireColumn.Hidden = True Then
        Sheets("Sheet1").Range("J:L").EntireColumn.Hidden = True
        Sheets("Sheet1").Buttons("Button 1").Text = "Hide Rows G:I"

    ElseIf Sheets("Sheet1").Range("P:R").EntireColumn.Hidden = True Then
        Sheets("Sheet1").Range("M:O").EntireColumn.Hidden = True
        Sheets("Sheet1").Buttons("Button 1").Text = "Hide Rows J:L"

    ElseIf Sheets("Sheet1").Range("S:U").EntireColumn.Hidden = True Then
        Sheets("Sheet1").Range("P:R").EntireColumn.Hidden = True
        Sheets("Sheet1").Buttons("Button 1").Text = "Hide Rows M:O"

    Else
        Sheets("Sheet1").Range("S:U").EntireColumn.Hidden = True
        Sheets("Sheet1").Buttons("Button 1").Text = "Hide Rows P:R"
    End If

End Sub

关于这个脚本的好处是它循环。你可以继续点击它,它将逐步隐藏越来越多的行,然后显示所有行。

我希望这能回答你的问题。请记住,逻辑必须是可靠的,否则您将获得意想不到的结果。