ExcelVBA「え?ネスト?なんそれ?」クソコードを修正せよ

条件分岐をシートで管理する方法

 

後編-1限目:結果から遡ってサンプルを作ってみる

 

困ったアメビン
困ったアメビン

おかげさまで「クソコード」を修正する方法が理解出来たけど
実は「セル選択イベント」を使うセルはまだまだ増やす予定で
シートにイベントセルのアドレスとプロシージャを記述して
管理するなんて事が出来ちゃったりする?

めがね後輩
めがね後輩

そうですね・・・ちょっとサンプルを作ってみましょう

Excel VBA

めがね後輩
めがね後輩

こちらに「Sample_A」「Sample_B」「Sample_C」3つを用意しました
「Sample_A」は、もしセル「A1」の値が「空白」であったら
「○」を入力し、そうでなければ「空白」にする
つまり実行する度に「○」と「空白」が繰り返される事となります
又「Sample_B」は「B2」に「Sample_C」は「C3」に対して同様の処理をします

困ったアメビン
困ったアメビン

「If」はよく使うからわるが
これで何するの?

めがね後輩
めがね後輩

先程は手動で実行しましたが、最終的な動作は
黄色のセル「A1」「B2」「C3」を選択した際に
「○」か「空白」になります

困ったアメビン
困ったアメビン

ああ、そういう事か
結果から作ってるのね

 

後編-2限目:判定シートの作成と「For Each」を知る

 

めがね後輩
めがね後輩

次は、管理用のシートを作成します
シート名は何でもいいですが、今回は「判定」とします

Excel VBA

めがね後輩
めがね後輩

例として、項目を「セル」と「プロシージャ」とし
クリックされたセルと、その際に実行するプロシージャを記述します
この図は、説明用にセルを挿入して文章にしてありますが

必要なのは、赤く囲んだ部分だけです

困ったアメビン
困ったアメビン

おお、文章になっているから理解しやすいね

めがね後輩
めがね後輩

それでは、プロシージャ名を「Cell_Judge」とし
コードの作成をしていきます
今回は「For Each~Next」というステートメントを使います

Excel VBA For Each

 

めがね後輩
めがね後輩

変数名を決めて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」はコレクションと覚えておいてください
サンプルコードも貼っておきますね

めがね後輩
めがね後輩

次は、繰返す処理の内容を記述していきます
あと、先程の「For Each」で使用した変数名を

ここからは「rng」として説明させて頂きます

Excel VBA

めがね後輩
めがね後輩

まずは、条件分岐「If」ステートメントを使って
「判定」シートのセルの値と、選択されたセルのアドレス値を
比較演算子「=」で一致か不一致かを判定し、その後の処理を分岐させます
又、「A1」が選択されている状態を仮定します

Excel VBA

 

めがね後輩
めがね後輩

もし、①②「判定」シートのセルの値(「rng」に格納された値)と
③選択されたセルのアドレス値「Selection.Address(0, 0)」が
同じであれば・・・という事をコード化すると
「If rng = Selection.Address(0, 0) Then」になります

Excel VBA イミディエイト

 

困ったアメビン
困ったアメビン

なんか見覚えが・・・と思って
イミディエイトウィンドウで確認したら
「Target.Address(0, 0)」と同じだった

 

 

後編-3限目:「Application.Run」を知る

 

めがね後輩
めがね後輩

最後は、条件を満たした場合の処理についてです
今回は、条件によって呼出すプロシージャが変化するので
変数にプロシージャ名を格納して、それを実行する必要があります
又、この場合は「Call」ではなく「Application.Run」を使います

Excel VBA Application.Run

 

めがね後輩
めがね後輩

プロシージャ名を格納する為、今回は「pcd」という名前の変数を用意します
「pcd」に格納するプロシージャ名「Sample_A~C」が記述されたセルは
「rng(A2~A4)」の位置から右に2列ずらした位置にありますので
「pcd = rng.Offset(0, 2)」という記述になります
そして「Application.Run pcd」で実行する事ができます

困ったアメビン
困ったアメビン

「Call」ではなく「Application.Run」?
わけがわか.らん(Run)

めがね後輩
めがね後輩

サンプルコードも貼っておきますね

 

 

Excel VBA セル選択イベント

 

めがね後輩
めがね後輩

仕上げに「セル選択イベント」を設定するシートに
「Private Sub Worksheet_SelectionChange(ByVal Target As Range)」
呼び出すコード、今回は「Call Cell_Judge」を記述し「End Sub」で完成です

Excel VBA

めがね後輩
めがね後輩

シート内でセルのクリックか、矢印キーの動作をきっかけに
該当するプロシージャが実行する事を確認して下さい

困ったアメビン
困ったアメビン

なんとか動きも確認できたが
わからんことばかりだな・・・
感想をまとめておくか

Excel VBA

 

※個人の感想です

 

アメビン
アメビン

これにておしまいです
今後もVBAの知識を深めていきたいと思います
ご教授いただきありがとうございました

 

 

コメント

タイトルとURLをコピーしました