【VBA】行や列の追加、削除、変更などの仕様変更に対応したプログラムの記述方法!
VBAでプログラムを書いていくうえで、
などなどのニーズで、
FOR I= 14 TO LASTY → FOR I= 20 TO LASTY → FOR I= 23 TO LASTY
のように、何度も何度もプログラムを書き換えることがよくあると思います。
かくいう私も、この問題に悩まされており、行や列を追加した後に、
・プログラムが動かない!!
・あ、ここも変更し忘れてた、、
ということが多々ありました。。
ということで、今回はそんな問題に対して、プログラムの書き方を提案したいと思います!
public constにセルの値を入れたい。
最初に考えたのは
①行列を定義するシートを作成して、
②PUBLIC CONST(どのモジュールでも使える定数)にシートのセルの値を入れる
という方法でした。
イメージとしては、こんな計算のテンプレートがあった時に、
下のような定義用シートを作って、テンプレートシートに連動して動くようにします。
すると、計算用テンプレートの最初の列にNoを入れ忘れた!!!列を追加しないと!!となった時、
・テンプレートは下記の通り、変更され、「項目」は2列目(B列)→3列目(C列)に変わってしまいます。こうなると、普通はプログラムを書き換える必要が出てきますが、
先ほど、行列定義シートを作ったことで、シートの更新に連動して、対応する列を更新することができます。(項目列が2列目→3列目に自動で変更されています。)
このセルを変数として定義することができれば、プログラムを書き換えることなく、プログラムは思い通りに動いてくれるはず。と考えたのです。
しかし、残念ながらconstには、セルの値を入れることは不可能となっているようでした。。
constが無理なら、プログラムの一つにする。
ということで、constが無理なようなので、
行列数定義というプログラムを一つ作り、そこで、セルの値を代入することにしました。
作成したプログラムは非常に簡単で、こちらに記載の通りです。
'どこでも使えるようにPublicで変数を設定
Public Cnt項目 As Long
Public Cnt単価 As Long
Public Cnt個数 As Long
Public Cnt日付 As Long
Sub 行列数定義()
'Pubkic変数に、定義シートの値を代入
Cnt項目 = Worksheets("定義").Cells(3, 4)
Cnt単価 = Worksheets("定義").Cells(4, 4)
Cnt個数 = Worksheets("定義").Cells(5, 4)
Cnt日付 = Worksheets("定義").Cells(6, 4)
End Sub
Sub TEST1()
'他のプログラムを走らせる前に、まず行列数定義を実行させる。
Call 行列数定義
'定数が変更されているか確認
Debug.Print Cnt項目
End Sub
・まずは、どこでも使える変数を設定するために、
sub外に変数定義を行う。
・【行列数定義】マクロを作成して、シートの値を代入する。
・他のプログラムを走らせる前に【行列数定義】を実行して、変数に値を代入。
デバッグ画面に正しい値が出るか確認。
という流れです。
結果は、成功。これで、メインのプログラムにおいて、特定の列数を入力する代わりに、「Cnt項目」「Cnt単価」「Cnt個数」「Cnt日付」を使用することで、テンプレートが変更されても(行列が追加削除されても、)対応ができるようになります!
しかも、ctrl+spaceが使えるように。。
これで、仕様変更に対応できるプログラムが作成できるようになりました。
しかし、実はメリットはこれだけにとどまりません。
なんと、定義した変数は「ctrl+space」で簡単に呼び出せるようになります。
行列定義シートを作成するのはめんどくさいかと思いますが、一度設定してしまえば、プログラムを書くのが非常に楽になります。
まとめ
ということで、
行や列の追加削除に悩まされていた草プログラマーの方は、上記の方法で仕様変更に耐えうるプログラムを作成してみてください!
今回の内容は、VBAを初めて8年目、、
その中でも、至高のプログラムとなります。
たったこれだけのことで今までの苦労が報われていたなんてと、何ともふがいないのですが、この方法は非常に有効だと思いますので、ぜひ参考にしてもらえればと思います!!
コメント欄