今回はVBAの初心者講座第5弾です。
【VBAの押さえておきたい用語とRangeとCellsの使い方の違い】についてのお話です。
専門用語ばかりでは飽きてしまうのでセルの操作の基本的な使い分けについてお話してきましょう
VBAは聞き慣れない横文字が結構出てきますが、全部を覚えなくても大丈夫です。
全体的に耳慣れしておけば、問題無いのでサクッと用語などを押さえていきましょう。
それでは、早速本編へ行ってみましょう!!!
目次を使って読みたい項目へ
プロジェクト・モジュール・プロシージャ・ステートメントって何?
VBAには「プロジェクト」「モジュール」「プロシージャ」「ステートメント」という用語があります。
聞き慣れない横文字が多くて混乱しますが、この4つを簡単に例えると「マトリョーシカ」みたいなものです。
ロシア土産として有名なマトリョーシカは、大きな人形の中に小さな人形がたくさん入っていますよね。
ちみにマトリョーシカは、こんなオモチャです。
大きさ順に 「プロジェクト→モジュール→プロシージャ→ステートメント」といった感じで、規模がだんだん小さくなっていきます。
では、実際にどの部分が何なのか? 画像で見てみましょう
まず、プロジェクトについてです。
VBAProject(用語集.xlsm)というのがプロジェクト(Project)という部分です。
()内はファイル名なので「用語集.xlsm」というファイルのプロジェクトという意味になります
プロジェクトとは、直訳すると「大規模な計画」という意味なのでこれから細かいことを決めていく「大枠」のようなものですね。
次はモジュールについてです
モジュール(module)は、「ブック・シート・標準」などに分かれていて、簡単に言うとコードを書く場所のことです。
コードは「標準モジュール」に書くということだけ分かっていれば大丈夫です。
モジュールとは、直訳すると「基本単位」という意味です。
VBAの場合「基本的にコードを書く場所」だよと思っておけば大丈夫です。
次はプロシージャについてです
プロシージャ(procedure)は、コードを書く枠のことです。
この場合は、Sub~End SubがプロシージャでSubプロシージャと言います
プロシージャとは、直訳すると「手順」という意味です。
今回は、「Module1」というモジュールの中に「プロシージャA」と 「プロシージャB」という2つの手順の中にそれぞれのメッセージを表示してね。
というコード(手順)を書いているということですね。
最後は、ステートメントについてです
ステートメント(statement)は、Sub~End Sub・Dim・Callなど最小単位のプログラムのことを言います
「Subステートメント」や「Ifステートメント」などと言い表すことができますね
ステートメントとは、直訳すると「述べること」という意味です。
要はこれは「Subステートメント」だよと宣言するような感じです。
正確にはそういう呼び方をするんだな。くらいの認識で大丈夫です。
こんな風に大きさがだんだんと小さくなって収納されているマトリョーシカのように、範囲がだんだんと小さくなっていく呼び方の専門用語があると思っていれば大丈夫です。
「モジュール」はよく出てくるのでこれだけは、覚えておいて損はないですよ。
RangeとCellsの違いと使い分け
VBAの基本でもあるセルの選択には、2種類の方法があります。
Range(レンジ)を使う方法とCells(セルス)を使う方法の2種類です。
どちらも基本は、ワークシートのセルに対して何かを行う時に使います。
同じセルに対して操作するなら、どうして2種類なのかよく分からないしどっちを使ったら良いか迷いますよね。
私がオススメする使い分けの方法はシンプルです。
「セルの範囲を対象にしたいならRange」を使いましょう
「単体のセルを対象にするならCells」を使いましょう
ただ、RangeとCellsを合体させる使い方も結構多いので両方セットで覚えるのがベストです。
では早速、Cellsの基本的な使い方について知っておきましょう。
Rangeの基本的な使い方は第2弾で解説しているのでそちらを見て下さいね。
Cellsの使い方は、すごく簡単です。
「Cells(行数,列数)」で指定してターゲットのセルの値を取得したり、書き込んだりすることが出来ます。
今回の場合は「1行1列」つまり「A1」のセルの内容を取得したということですね。
それをメッセージボックスで表示させているのが今回のコードです。
RangeとCellsの大きな違いは、Rangeはセル範囲を指定出来ますがCellsは1つのセルしか指定できません。
そう聞くとRangeの方が使い勝手が良さそうですが、Rangeには大きな弱点があります。
それは、柔軟な範囲選択が苦手なことです。
例えば行数が増えたり減ったりする範囲を選択する場合、両方を組み合わせる必要が出てきます。
文章だけでは伝わりづらいので次は、柔軟な範囲を選ぶ方法について触れていきましょう。
RangeとCellsを使って柔軟にセル範囲を選択してみよう
まず、Rangeを使って指定の範囲を選択してみましょう。
範囲の指定は、「Range(“a2:b11”).Select」で指定できます。
コレを日本語にすると「Range(“A2セル~B11セル”)を選択する」という意味になります。
「”a2:b11″」がポイントで「”」(ダブルクォーテーション)で範囲を囲むのは基本と同じで「:」(コロン)で2つのセルを結ぶと、「~」という意味になります。
なので 「A2セル~B11セル」を指定したという意味になりますよね。
さらに 「.Select」(選択するという意味)は、いわゆる「RangeオブジェクトのSelectプロパティ」を使ったので「Rangeで指定した範囲を選択してね」という意味になります。
これが、Rangeの使い方でCellsでは出来ない操作方法になります。
では、ランキングが15位まで増えたとしましょう
その場合は、どうしますか?
もちろんこの方法も有りです。
単純に「B16セル」まで範囲を伸ばしました。
ここで重要なのは、この対策方法では実務では到底使えないですよね。
理由は範囲が変わるたびにいちいちコードを書き直さないといけないからです。
これじゃ、VBAが使える人じゃないと変更出来ないし項目が減ったり増えたりするたびに書き換えるのか?
って話になっちゃうので考え方を変える必要があります。
じゃあ、どうすればコードを書き換えること無く項目に増減があっても範囲を自由に変更出来ると思いますか?
答えは、入力されている最終行数を自動的に取得して、Rangeの範囲も最終行数に自動的に変更されれば良い訳です。
つまり、こんな感じです。
注目するのは「Range(Cells(2, 1), Cells(MaxRow, 2))」の部分ですね。
Range(“a2:b16”)の「”」「:」が無くなって「,」に変わっています。
そして「a2」→ Cells(2, 1) になって「b16」→ Cells(MaxRow, 2) になっていますよね。
「”」は必要が無くなり「:」→「,」に変わりますが意味は同じです。
「MaxRow」には最終行数である16という数字が入っているので結果は変わりません
今回のパターンは、変数が出てきたり最終行数を取得する方法が追記されていますが、追記分は今は無視して大丈夫です。
「Range(Cells(2, 1), Cells(MaxRow, 2)).Select」の部分は、行数が増えても減ってもコードを書き換える必要もなく自動的に範囲を調整してくれます。
今は、難しいですがこれを日本語に変えて解説すると次のような感じになります。
「Range(Cells(2行,1列)~Cells(最終行,2列))の範囲を選択する」という意味になります。
こんな風に RangeとCellsを組み合わせることで柔軟なセル範囲を選択出来るようになります。
Rangeだけでも柔軟な範囲選択をすることは出来ますが、分かりづらいのでこんな風にRangeとCellsで自由な範囲を選択出来るということを覚えておいて下さい。
この方法は、実務でよく使う技なので柔軟な範囲を選びたい時の定番はこれなんだ。
というところまで覚えておいてくださいね。
これが、RangeとCellsの上手な使い方です。
VBAの基本中の基本でちゃんと分かっていれば、いつまでも活躍するスキルなので是非覚えておきましょう。
まとめ
今回は、プロジェクト・モジュール・プロシージャ・ステートメントやRangeとCellsの違いについてお話してきました。
プロジェクトなどは、VBAを書いていく場所の大きさ(階層)や単位にはそういった言い方があるんだよということでしたね。
また、RangeとCellsではセルの範囲と1箇所のセルを指定するという違いがあり、2つを組み合わせることで柔軟な範囲選択ができるということが分かってもらえたでしょうか?
今の段階では、まだ難しく感じると思いますがこの方法はいつまでも使える応用力のある方法なので、何となくでいいので覚えておいてほしい方法の紹介でした。
色々な用語やセルの選択の方法の違いなど、最初は覚えることが多いですが詳しい用語は後で覚え直してもOKです。
もちろん、今は全て覚えなくても問題は無いですよ。
少しずつ用語に耳慣れして、セル選択の使い方も何度も出てくるのでそのうち手が慣れてきます。
続けることが大切なので、分からないところで立ち止まらずまずは、一つでも自由に扱えるようになることを当面の目標にして頑張ってみて下さい。
それでは、また次回お会いしましょう。
またな!!!
コメントを残す