2017-07-06 21 views

答えて

0

あなたはそれがやりたいだけのいくつかは、(それはそれのように聞こえる)がある場合、私は私のマクロを持っているでしょうが、現在の状態を評価し、それに応じて行動します。

例では、最初にS-Uを非表示にし、次に2回目のクリックで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の文は "whatever = 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 

このスクリプトに関する素晴らしい点は、ループすることです。それをクリックし続けるだけで、ますます多くの行が徐々に隠され、すべて表示されます。

これがあなたの質問に答えることを願っています。ロジックが堅牢でなければならない、または予期しない結果が生じることに注意してください。

+0

上の例は完全に機能します。しかし、「M:O」、「J-L」、「G-I」という手順を「M-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を設定すると、もう一度やりたいことを何でもします。 3回目にしたい場合は、いつでもElse If i = 1 Thenなどを行うことができます。

Visual Basic Editorで、新しいモジュールを作成していない場合は、新しいモジュールを作成してそこに配置します。ボタンを作成し、Button1_Clickマクロをボタンに割り当てます。

0

2つのオプションを切り替えるだけでよい場合は、ブール値を使用し、その後、オフのトグルのように:

Public x As Boolean 

Private Sub CommandButton1_Click() 
If x Then MsgBox ("ON") Else MsgBox ("OFF") 
x = Not x 
End Sub 
関連する問題