2017-07-06 95 views

回答

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 

當然,你可以用另外的條件和動作..擴展此像改變按鈕上的文字來代表它下一步會做什麼:

假設你擁有了它標記「隱藏行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來評估情況,你想隱藏它們。個人注意:我發現「IF whatever = true」語句比「if whatever = false」更容易遵循(從技術上講,甚至不必輸入「= True」)。但這意味着你需要從最後的可能性開始,並向後工作。否則,你需要通過「= False」來評估(就像我第一次演示的那樣),但我覺得有點難以遵循。你的結果可能有所不同

您表示想要這些隱藏的依次是: 「S:U」, 「P:R」, 「M:O型」, 「J:L」, 「G:我」。這是一個腳本,一旦隱藏了所有這些行,按鈕就會顯示所有這些行。因此,我首先評估一下最後一種可能性是否屬實 - 那就是 - 行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 

關於這個腳本的好處是它循環。你可以繼續點擊它,它會逐漸隱藏越來越多的行,然後顯示它們。

我希望這能回答你的問題。請記住,邏輯必須堅實,否則會得到意想不到的結果。

+0

頂部的例子完美地工作!然而,由於某些原因它隱藏了「M-L」和「G-I」正常工作,我無法繼續執行「M:O」,「J-L」和「G-I」程序。我錯過了一些東西。 – William63775

+0

@ William63775 - 我懷疑你有一個邏輯問題。檢查我對答案的編輯,希望能讓你朝着正確的方向前進。如果沒有,你可以發佈你有什麼,我們可以編鐘。 –

+0

工程就像一個魅力!謝謝!我對此仍然很陌生! – William63775

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宏分配給按鈕。

0

如果您只需要在兩個選項之間切換,像斷切換,然後使用一個布爾值:

Public x As Boolean 

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