Excel VBA でプログラミングする際には、ほとんどの場合においてセルを何かしら操作します。
セルを操作するためには、セルを指定しなければなりません。
ご存知の通り、Excel の1つ1つのセルは行番号と列番号を持っています。
Excel シート上ではデフォルトで
・行番号は数値(1、2、3、、、)
・列番号はアルファベット(A、B、C、、、)
で表示されています。
Excel VBA でプログラミングする際には、行番号と列番号を与えてセルを指定しなければなりません↓
Cells(行番号,列番号)
そして、列番号の与え方には数値を使う方法とアルファベットを使う方法の2つがあるのです。
セル「D4」を指定する方法はそれぞれ以下のようになります。
・数値を使う方法 Cells(1,4)
・アルファベットを使う方法 Cells(1,”D”)
私個人としては、列番号の指定は数値を使った方が良いと思っています。
1、列番号の指定
行番号をアルファベットで指定する場合と「変数+数値」で指定する場合について、具体例をあげますね。
次のように毎月の売上高(B列)と売上原価(C列)から原価率(D列)を計算するコードを考えてみます。
*マクロ(Excel VBA)を使う必要もない計算ですが事例として上げさせて頂きます。
①列番号をアルファベットで指定する場合のコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Sub Genkaritsu() Dim Uriagedaka '売上高' Dim Uriagegenka '売上原価' Dim Genkaritsu '原価率' Dim Row_Start '最初の行番号' Row_Start = 2 'データが始まる行番号を指定' For i = 1 To 12 Uriagedaka = Cells(Row_Start + i - 1, "B") '売上高読み込み' Uriagegenka = Cells(Row_Start + i - 1, "C") '売上原価読み込み' Genkaritsu = Application.RoundDown(Uriagegenka / Uriagedaka, 2) '原価率計算' Cells(Row_Start + i - 1, "D") = Genkaritsu '原価率出力' Next i End Sub |
②列番号を「変数+数値」で指定する場合のコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Sub Genkaritsu() Dim Uriagedaka '売上高' Dim Uriagegenka '売上原価' Dim Genkaritsu '原価率' Dim Row_Start '最初の行番号' Dim Line_Start '最初の列番号' Row_Start = 2 'データが始まる行番号を指定' Line_Start = 2 'データが始まる列番号を指定' For i = 1 To 12 Uriagedaka = Cells(Row_Start + i - 1, Line_Start) '売上高読み込み' Uriagegenka = Cells(Row_Start + i - 1, Line_Start + 1) '売上原価読み込み' Genkaritsu = Application.RoundDown(Uriagegenka / Uriagedaka, 2) '原価率計算' Cells(Row_Start + i - 1, Line_Start + 2) = Genkaritsu '原価率出力' Next i End Sub |
コードの違い
上記2つのコードで違う箇所は列番号の指定方法です。
①は売上高、売上原価の読み込みと原価率の出力の部分で列をアルファベットで指定しているのに対し、②は「変数+数値」で指定していますよね。
①の場合⇃
Uriagedaka = Cells(Row_Start + i – 1, “B”) ‘売上高読み込み’
Uriagegenka = Cells(Row_Start + i – 1, “C”) ‘売上原価読み込み’
Cells(Row_Start + i – 1, “D”) = Genkaritsu ‘原価率出力’
②の場合⇃
Uriagedaka = Cells(Row_Start + i – 1, Line_Start) ‘売上高読み込み’
Uriagegenka = Cells(Row_Start + i – 1, Line_Start + 1) ‘売上原価読み込み’
Cells(Row_Start + i – 1, Line_Start + 2) = Genkaritsu ‘原価率出力’
②では変数「Line_Start」にあらかじめ値を入れておくことで全ての列番号が決まります⇃
「Line_Start = 2 」の部分ですね。
マクロの実行結果
上記2つのマクロを実行するといずれも次のように原価率が計算できます。
計算結果は同じなので、この時点では全く問題ありません。
2、列番号の指定に数値を使うメリット
新しく列を挿入する場合
さて、列番号をアルファベットで指定するとどのような場合に不具合が生じるか説明しますね。
次のようにシートの設計を変更する必要が出てきて、一番左側に新しい列を挿入しなければならなくなったとします。
すると何が起こるでしょうか?
列番号がずれたことで、上記のコードのままだと狙い通りに動作しなくなります。
ちゃんと狙い通りに動作するように、コードを変更しなければなりません。
具体的には列番号を変更することになります。
①列番号をアルファベットで指定していた場合
さて、上記①の場合はアルファベットで指定してある列番号を次のように変更します。
変更前↓
Uriagedaka = Cells(Row_Start + i – 1, “B”)
Uriagegenka = Cells(Row_Start + i – 1, “C”)
Cells(Row_Start + i – 1, “D”) = Genkaritsu
変更後↓
Uriagedaka = Cells(Row_Start + i – 1, “C”)
Uriagegenka = Cells(Row_Start + i – 1, “D”)
Cells(Row_Start + i – 1, “E”) = Genkaritsu
列がズレたことを考慮して
・BをCに
・CをDに
・DをEに
変更しています。
②列番号を「変数+数値」で指定していた場合
一方で上記②の場合はどうでしょうか?
「Line_Start = 2」の部分を「「Line_Start = 3」に変更するだけで済みます。
列番号を指定して読み込み、出力している以下の部分は何も変更しなくても大丈夫です。
Uriagedaka = Cells(Row_Start + i – 1, Line_Start)
Uriagegenka = Cells(Row_Start + i – 1, Line_Start + 1)
Cells(Row_Start + i – 1, Line_Start + 2) = Genkaritsu
列の数が多いほど効果大
さて、アルファベットで列番号を指定していた場合、今回のケースでは売上高、売上原価、原価率の3列を作ってデータを扱っているだけなので、変更はたった3箇所アルファベットを書き換えるだけで済んでいますが
もし、列の数がもっと多かったらどうなるでしょう。
列がズレたのを治すためのアルファベットの書き換えが非常に面倒です。
ですので、列番号を「変数+数値」で指定する方法はデータの列数が多いほど効果が大きいのです。
3、まとめ
以前にも同様の記事を書いていました↓
Excel VBA でのプログラミングを楽にするために工夫は欠かせません。今日は、私が普段 VBA を使う前提で Excel シートを作るときに工夫していることを2つ紹介します。●行番号と列番号を変数で指定する ●空白の行・列を入れておくこれらはシートの設計を変更した場合に VBA コードの変更点を極力少なくて済むようにするための工夫です。1、行番号と列番号を変数で指定する行番号と列番号は変数で指定しておいた方が良いケースがあります。例えば、次の1年間の給料の一覧表があったとします。月別の「総支給額」「社会保険料」「源泉所得... マクロ(Excel VBA) を使うときは後の作業を楽にするために行番号と列番号を変数... - My タックスノロジー |
列番号はアルファベットよりも「変数+数値」を使って指定した方が、後々シートに変更があってプログラミングコードも変更しなければならないときにも融通が利きます。
私はあるシステムを作る際に、列番号をアルファベットで指定してしまい失敗した。。と思った経験がありますので、それを踏まえてこのように↑考えています。
ぜひ参考にして頂きたいです!!