簡體   English   中英

每次點擊VBA按鈕分配一個不同的宏

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM