------
VBAでシステムを作る際の考慮点 その5
まずは、この壁から。
・消費税が上がるけれど、どれだけ影響範囲があるのかわからない。
これと類似したところでは
・そこらじゅうに同じような処理があり、どこがどうなっているのか分からない。
・修正してみたけれど、結果が変わらない。
・この処理は無駄なのかもしれないけれど、今となっては分からない。
などがあるだろう。
これは、「ソースコードが整理整頓されていないから」である。記録したものをそのまま使ったり、ネットにあるソースや時には自分自身のコードをコピー&ペーストしてみたりを繰り返すとこういう事態に陥ることが結構ある。
ただ、こういう一般論を述べても「で?具体的には?」となるだろう。少し具体的に攻めてみよう。
1.消費税が上がるけれど、どれだけ影響範囲があるのかわからない。
消費税率は過去3%だったが、5%に引き上げられている。近くまた上がるとか・・。そういう消費税率が、コード内の式の中にそのままの値で、例えば 0.05 とか × 5 ÷ 100 のような形で記載されていると厄介である。もしかするとそれは消費税以外の目的の計算かもしれない。しっかりと読み解く必要が出てくるからだ。(ま、消費税ごときでこれは大げさだが・・)
こういう場合は
・定数として消費税率を定義しておく
といいだろう。
例)
Public Const SHOUHI_ZEI_RATE As Integer = 5
ただ、過去には「自動車とそれ以外の製品で消費税率が異なる」という時期もあった。今となっては歴史の遺物かもしれないが、今後商品によって消費税率が変わる可能性はないとは言い切れない。その時はターゲットをはっきりさせた定数を使うようにしよう。
例)
Public Const SHOUHI_ZEI_NOMAL As Integer = 5
Public Const SHOUHI_ZEI_CAR As Integer = 6
Public Const SHOUHI_ZEI_FOOD As Integer = 3
なお、消費税に限らず、定数化できるものは定数化してしまう方が分かりやすいだろう。
2.そこらじゅうに同じような処理があり、どこがどうなっているのか分からない。
同じ処理なのか、似て非なる処理なのか。どちらにせよ、まとめられるならまとめるに限る。このとき、プロシージャではなく関数、つまり Sub ではなく Function を使って処理を切り出し、切り出す元では Function の戻り値を使うようにする方がまとめやすいだろう。
中にはファイルの読み書きやデータベース接続のように、すでにオープンされていると使えないよ、というものもある。これはいずれ述べるが、クラスモジュールにすれば解決できる。
3.修正してみたけれど、結果が変わらない。
これも困った問題である。おそらくステップ実行をしても修正個所を通っていないか、その修正個所の結果が上塗られたり選択されなかったりなどの理由で無効になっているからだろう。
Debug.Print文やウォッチウィンドウを使って値の変遷を確認するといいだろう。
4.この処理は無駄なのかもしれないけれど、今となっては分からない。
これがあるとプログラムがどんどん肥大してしまう。
プロシージャ名や関数名をプロジェクト全体で検索するとか、Debug.PrintやMsgBoxで「通ったらわかる」ようにしておくのもいいだろう。
ただ、ワークシート関数として使われていたり、イベントであったりするかもしれないので、ワークシートモジュールに書かれている場合は注意が必要である。
VBAでシステムを作る際の考慮点 その5
まずは、この壁から。
・消費税が上がるけれど、どれだけ影響範囲があるのかわからない。
これと類似したところでは
・そこらじゅうに同じような処理があり、どこがどうなっているのか分からない。
・修正してみたけれど、結果が変わらない。
・この処理は無駄なのかもしれないけれど、今となっては分からない。
などがあるだろう。
これは、「ソースコードが整理整頓されていないから」である。記録したものをそのまま使ったり、ネットにあるソースや時には自分自身のコードをコピー&ペーストしてみたりを繰り返すとこういう事態に陥ることが結構ある。
ただ、こういう一般論を述べても「で?具体的には?」となるだろう。少し具体的に攻めてみよう。
1.消費税が上がるけれど、どれだけ影響範囲があるのかわからない。
消費税率は過去3%だったが、5%に引き上げられている。近くまた上がるとか・・。そういう消費税率が、コード内の式の中にそのままの値で、例えば 0.05 とか × 5 ÷ 100 のような形で記載されていると厄介である。もしかするとそれは消費税以外の目的の計算かもしれない。しっかりと読み解く必要が出てくるからだ。(ま、消費税ごときでこれは大げさだが・・)
こういう場合は
・定数として消費税率を定義しておく
といいだろう。
例)
Public Const SHOUHI_ZEI_RATE As Integer = 5
ただ、過去には「自動車とそれ以外の製品で消費税率が異なる」という時期もあった。今となっては歴史の遺物かもしれないが、今後商品によって消費税率が変わる可能性はないとは言い切れない。その時はターゲットをはっきりさせた定数を使うようにしよう。
例)
Public Const SHOUHI_ZEI_NOMAL As Integer = 5
Public Const SHOUHI_ZEI_CAR As Integer = 6
Public Const SHOUHI_ZEI_FOOD As Integer = 3
なお、消費税に限らず、定数化できるものは定数化してしまう方が分かりやすいだろう。
2.そこらじゅうに同じような処理があり、どこがどうなっているのか分からない。
同じ処理なのか、似て非なる処理なのか。どちらにせよ、まとめられるならまとめるに限る。このとき、プロシージャではなく関数、つまり Sub ではなく Function を使って処理を切り出し、切り出す元では Function の戻り値を使うようにする方がまとめやすいだろう。
中にはファイルの読み書きやデータベース接続のように、すでにオープンされていると使えないよ、というものもある。これはいずれ述べるが、クラスモジュールにすれば解決できる。
3.修正してみたけれど、結果が変わらない。
これも困った問題である。おそらくステップ実行をしても修正個所を通っていないか、その修正個所の結果が上塗られたり選択されなかったりなどの理由で無効になっているからだろう。
Debug.Print文やウォッチウィンドウを使って値の変遷を確認するといいだろう。
4.この処理は無駄なのかもしれないけれど、今となっては分からない。
これがあるとプログラムがどんどん肥大してしまう。
プロシージャ名や関数名をプロジェクト全体で検索するとか、Debug.PrintやMsgBoxで「通ったらわかる」ようにしておくのもいいだろう。
ただ、ワークシート関数として使われていたり、イベントであったりするかもしれないので、ワークシートモジュールに書かれている場合は注意が必要である。