条件分岐をシートで管理する方法
後編-1限目:結果から遡ってサンプルを作ってみる
おかげさまで「クソコード」を修正する方法が理解出来たけど
実は「セル選択イベント」を使うセルはまだまだ増やす予定で
シートにイベントセルのアドレスとプロシージャを記述して
管理するなんて事が出来ちゃったりする?
そうですね・・・ちょっとサンプルを作ってみましょう
こちらに「Sample_A」「Sample_B」「Sample_C」3つを用意しました
「Sample_A」は、もしセル「A1」の値が「空白」であったら
「○」を入力し、そうでなければ「空白」にする
つまり実行する度に「○」と「空白」が繰り返される事となります
又「Sample_B」は「B2」に「Sample_C」は「C3」に対して同様の処理をします
「If」はよく使うからわるが
これで何するの?
先程は手動で実行しましたが、最終的な動作は
黄色のセル「A1」「B2」「C3」を選択した際に
「○」か「空白」になります
ああ、そういう事か
結果から作ってるのね
後編-2限目:判定シートの作成と「For Each」を知る
次は、管理用のシートを作成します
シート名は何でもいいですが、今回は「判定」とします
例として、項目を「セル」と「プロシージャ」とし
クリックされたセルと、その際に実行するプロシージャを記述します
この図は、説明用にセルを挿入して文章にしてありますが
必要なのは、赤く囲んだ部分だけです
おお、文章になっているから理解しやすいね
それでは、プロシージャ名を「Cell_Judge」とし
コードの作成をしていきます
今回は「For Each~Next」というステートメントを使います
変数名を決めてRangeオブジェクトを宣言します
次に「For Each 変数名 In」と記述して、次の処理範囲は
後編-1限目で作った「判定」シートのセル範囲「A2~A4」なので
「Worksheets(“判定”).Range(“A2:A4”)」と追記します
処理を記述して、ループの最後に「Next」と記述します
「For Each~Next」なんて知らなかったな
「For ~ To ~ Next」の値は数値だったけど
数値ではないものを取り扱うって感じか
まぁ・・・ここでは細かい話はしませんが
とりあえず「For ~ To ~ Next」はカウンター
「For Each ~ In ~ Next」はコレクションと覚えておいてください
サンプルコードも貼っておきますね
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub Sample() 'ここに変数名「変数」というRangeオブジェクトを宣言します Dim 変数 As Range 'これからシート名「シート」の開始セル~終了セルの値に対して処理を繰返します For Each 変数 In Worksheets("シート").Range("開始セル:終了セル") '処理 Next End Sub |
次は、繰返す処理の内容を記述していきます
あと、先程の「For Each」で使用した変数名を
ここからは「rng」として説明させて頂きます
まずは、条件分岐「If」ステートメントを使って
「判定」シートのセルの値と、選択されたセルのアドレス値を
比較演算子「=」で一致か不一致かを判定し、その後の処理を分岐させます
又、「A1」が選択されている状態を仮定します
もし、①②「判定」シートのセルの値(「rng」に格納された値)と
③選択されたセルのアドレス値「Selection.Address(0, 0)」が
同じであれば・・・という事をコード化すると
「If rng = Selection.Address(0, 0) Then」になります
なんか見覚えが・・・と思って
イミディエイトウィンドウで確認したら
「Target.Address(0, 0)」と同じだった
後編-3限目:「Application.Run」を知る
最後は、条件を満たした場合の処理についてです
今回は、条件によって呼出すプロシージャが変化するので
変数にプロシージャ名を格納して、それを実行する必要があります
又、この場合は「Call」ではなく「Application.Run」を使います
プロシージャ名を格納する為、今回は「pcd」という名前の変数を用意します
「pcd」に格納するプロシージャ名「Sample_A~C」が記述されたセルは
「rng(A2~A4)」の位置から右に2列ずらした位置にありますので
「pcd = rng.Offset(0, 2)」という記述になります
そして「Application.Run pcd」で実行する事ができます
「Call」ではなく「Application.Run」?
わけがわか.らん(Run)
サンプルコードも貼っておきますね
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
Sub Sample() 'ここに変数名「変数A」というRangeオブジェクトを宣言します Dim 変数A As Range 'ここに変数名「変数B」という文字列を宣言します Dim 変数B As String 'これからシート名「シートA」のセルA2~A4の値に対して処理を繰返します For Each 変数A In Worksheets("シートA").Range("A2:A4") 'もし「変数A」(「シートA」シートのセルA2)の値「A1」と選択中のセルのアドレスが同じだったら If 変数A = Selection.Address(0, 0) Then '変数「変数B」に「変数A」(「シートA」シートのセルA2)から右に2列ずらした位置「C2」の値を格納します 変数B = 変数A.Offset(0, 2) 'マクロ(変数「変数B」に格納されたプロシージャ名)を実行します Application.Run 変数B End If Next End Sub |
仕上げに「セル選択イベント」を設定するシートに
「Private Sub Worksheet_SelectionChange(ByVal Target As Range)」
呼び出すコード、今回は「Call Cell_Judge」を記述し「End Sub」で完成です
シート内でセルのクリックか、矢印キーの動作をきっかけに
該当するプロシージャが実行する事を確認して下さい
なんとか動きも確認できたが
わからんことばかりだな・・・
感想をまとめておくか
※個人の感想です
これにておしまいです
今後もVBAの知識を深めていきたいと思います
ご教授いただきありがとうございました
コメント