VBAは自由なのになぜ関数?

と思うくらい、ExcelはVBA派です。
そもそも、SumとAverage、三角関数(sin, cos, tan)以外の関数を知らないうちからVBAを使っていたと思います。

関数と比べてとても便利だと思うのが、後から思うとVLookUp関数のような使い方をしていたVBAコードで、

sub 情報照合()
for i=1 to 10
for j=1 to 10
if cells(i,1)=cells(j,5) then
cells(j,6)=cells(i,2)
next j
next i
end sub

と、たった8行で書ける物です。
1列目と2列目に、
Aさん 東京都
Bさん 神奈川県

Jさん 沖縄県
と、氏名と都道府県がセットで10個書かれているデータがあり、
5列目に、
Eさん
Jさん
Aさん
Dさん

と、1列目に別の順番でAさんから、Jさんが並んでいる時、対応する都道府県を6列目に書いて下さい。
というプログラムです。

10人くらいなら、10回、Aから順にコピーして、探して、貼り付けでも良いかもしれません。
もし、100人、1000人、10000人いて、コピーする項目も都道府県だけでなくて、30項目あったら?

それでも、基本的に、8行という同じ行数のプログラムで書けてしまいます。

sub 情報照合2()
for i=1 to 10000
for j=1 to 10000
if cells(i,1)=cells(j,100) then
range(cells(i,1),cells(i,30)).copy destination:=cells(j,101) 'だったかな?
next j
next i
end sub

5行目のrangeから始まる行が少しうろ覚えですが、恐らくこんな感じだったと・・・思います。
複数のセル同士をイコールで結んで代入ではプログラム1行で出来ないので、30セル分の範囲を指定してコピーして、貼り付け先を指定しています。
10000行のリストが、1列目から30列目と、100列目から130列目まであるような想定です。
便宜上、見出し行を作っていません。
for i=2 to 101, では、何となく表現上切りが悪いので・・・。
(普段プログラム書く時は、タイトルや見出しの分、下の行へずらしています)
なお、各10000のfor文が最後まで回るのにどのくらい時間がかかるか・・・可能か・・・までは確認していません。

ちなみに、ifを二重入れ子にも出来るので、2つの項目が両方のリスト同士で一致する物についてコピーを行なうということも出来ます。2つの項目が一致する物が複数あっても、別の物として次々に取り出していくことも出来ます。VLookUpではそこまでは恐らく出来ないのではないでしょうか。

このプログラムだけマスターしても、かなりの自動化が行なえると思うので、おすすめです。私には、このプログラムとその応用形をメインに、データ処理を行なっていた時期もありました。

この記事が気に入ったらサポートをしてみませんか?