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



>我有一个 excel 按钮,当我单击它时隐藏列"S-U"。我想第二次单击该按钮,它隐藏了"P-R"列等。您可以每次单击操作 excel 按钮吗?

如果你只希望它做几件事(听起来像),我会让我的宏评估当前状态并采取相应的行动。

在您的示例中,您指示首先希望它隐藏 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

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

假设您将其标记为"隐藏行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 扩展,甚至使用案例),你真的没有尽头可以做。你只需要保持逻辑直截了当。

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

个人说明:我发现"IF any =true"语句比"if what = false"更容易理解(从技术上讲,您甚至不必键入"= True")。但这意味着你需要从最后一种可能性开始,然后向后工作。否则,您需要通过"= False"进行评估(就像我第一次演示的那样),但我发现它有点难以理解。您的结果可能会有所不同。

您表示希望按顺序隐藏这些:"S:U","P:R","M:O","J:L","G:I" 。这是一个脚本,一旦所有这些行都被隐藏,按钮就会显示它们。因此,我首先评估最后一种可能性是否为真 - 也就是说 - G行:I是否已经隐藏?如果是这样,请全部显示。我还包括更新按钮文本,但这是可选的。

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

这个脚本的优点是它可以循环。您可以继续单击它,它将逐渐隐藏越来越多的行,然后显示所有行。

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

这个问题的一个解决方案是声明一个全局变量,并为其分配一个计数器:

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宏分配给该按钮。

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

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

最新更新