[英]Assign a different macro per click of VBA Button
我有一個excel按鈕,當我單擊它時隱藏“ SU”列。 我想第二次單擊該按鈕,它隱藏了“ PR”等列。您能否每次單擊操作一個excel按鈕?
解決此問題的一種方法是聲明一個全局變量,並為其分配一個計數器:
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
如果您只想做幾件事(聽起來很像),我將讓我的宏評估當前狀態並采取相應的措施。
在您的示例中,您表明您首先希望它隱藏SU,然后再次單擊PR。 這樣可以做到:
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進行擴展),您可以做的事情實際上沒有盡頭。 您只需要保持邏輯正確。
編輯以進一步擴展:如果您的情況是線性的-也就是說,如果要以相同的順序隱藏越來越多的列,則只需要執行其他操作即可評估情況,並逐步執行要隱藏它們的順序。
個人說明:我發現“ IF what = true”語句比“ if what = false”更容易理解(從技術上講,您甚至不必鍵入“ = True”)。 但這意味着您需要從最后的可能性開始,然后倒退。 否則,您需要用“ = False”進行評估(就像我第一次演示的那樣),但是我發現很難理解。 您的結果可能會有所不同。
您指示要按以下順序隱藏它們:“ S:U”,“ P:R”,“ M:O”,“ J: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
關於此腳本的好處是它會循環。 您可以一直單擊它,它會逐漸隱藏越來越多的行,然后全部顯示。
我希望這回答了你的問題。 請記住,邏輯必須牢固,否則您將得到意想不到的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.