みなさまこんにちは!
ITソリューション事業部の林です。
前回はExcelVBA学習の初級編として、初歩のプログラム作りを行いました。
本記事でも同様に、初級編の内容を解説させていただきます。
今回の学習トピックは以下になります。
初級編は、学習を始めたばかりの方が手ごたえを感じていただけるような内容で構成しております。
技術的な細かな解説を意図的に省いておりますので、そちらについては別の機会にできたら、と考えています。
それでは、始めていきましょう!
【変数について】
最初のトピックとして、プログラミング言語における「変数」という概念について解説いたします。
変数のイメージ
変数のイメージとしては、箱のような入れ物を浮かべてもらえればよいと思います。

この箱の中にデータを記録してやり、データを取り出して使ったり、データを書き換えたり消したり、ということをコンピュータプログラムは実行しています。
また、変数はひとつだけでなく、複数用意することができます。
ここで覚えておいていただきたい変数の特徴として、記録できるデータの型(種類)を決められる、という点があります。
どういうことかというと、変数Aでは「文字」だけ入れられる、変数Bでは「数」だけ入れられる、といったように記録できるデータに制限をかけられるということです。

この特徴のおかげで、変数に想定外のデータが紛れ込むリスクを未然に防げます。
一部例外もあるのですが、解説を始めると少々長く、複雑になってしまうので……
ひとまず、基本的には上に挙げた特徴を変数は持っているということを覚えておいて、次へ進みましょう。
変数宣言
「変数宣言」とは、変数をプロシージャ内で使えるようにすることを指します。
VBAにおける変数宣言の方法はいくつかあるのですが、最もポピュラーな方法をご紹介します。
エディタを開いていただいて、標準モジュールと、任意の名前でプロシージャを用意してください。
以下の画像では、初級編の第2回目にちなんで「ExcelVBA002」という名前のプロシージャを定義しています。

変数宣言は、以下の赤枠のように記述します。

ここでは2つの変数を宣言しています。
変数宣言の書式: Dim 変数名 As データ型
変数宣言は、「Dim」句から始まります。その後ろには「変数名」を指定できます。
「データ型」というのは、先ほどの解説で取り上げた、変数で取り扱えるデータの種類の制限のことです。
ここでは、文字列を扱える「String」と、整数を扱える「Long」を定義しています。
データ型はStringとLong以外にもありますが、今回使用するのは2つだけです。
変数についてまとめると、それだけで記事1本以上のボリュームになりますので、今後の記事で別途解説させていただきます。
注意点としまして、上の解説では変数名に日本語を使用していますが、実際のマクロ開発ではアルファベット・数字・記号のみ使用します。
今回は理解しやすくするために日本語を使用しています。
【ExcelVBAはどのようにExcelを操作するのか】
次のトピックは、ExcelVBAはExcelを操作することができるのか、です。
それができる理由は「Excelをオブジェクトとして取り扱っているから」です。
オブジェクトとは「物体、対象物」のことです。
ExcelVBAというプログラミング言語は、Excelを物体として捉えているわけですね。
これには「オブジェクト指向」という少々理解の難しい概念が絡んでくるのですが、本記事では解説を省きます。
「オブジェクト指向とは」でインターネット検索するとわかりやすい記事がありますので、そちらを参照することをおすすめします。
ひとまず、ExcelVBAはExcel上のセルやワークシートや書式設定機能など、
・Excelのあらゆるものをオブジェクトとして認識すること
・認識したオブジェクトを操作することが可能ということ
の2点を理解していただければOKです。
次のトピックでは、ワークシート上の「セル」というオブジェクトについて取り扱います。
【セルを操作する】
Excelのオブジェクトの一つであるセルに対して、ExcelVBAはさまざまな操作を行えます。
オブジェクトの操作のことを、ExcelVBAでは「メソッド」と言います。
ここでは、「セルの値と書式設定を削除する」メソッドとして、Clearメソッドを紹介します。
Clearメソッド
まず、ワークシートを以下の状態にしてください。

この状態で、プロシージャに以下赤枠部分を記述して、マクロを実行してください。

ワークシートを見ると、このようになっています。

これはClearメソッドによって、A1セルの値と書式設定を削除する、という操作が行われた結果です。
先ほど記述したソースコードですが、これは2つの要素によって構成されています。
「オブジェクト」と「メソッド」の2つです。

「Range(“A1”)」はA1セルを表しています。
括弧の値を書き換えることで、他のセルを対象にすることができます。
末尾の「Clear」はClearメソッドの記述です。
「.(ドット)」は何を表すかというと、オブジェクトとメソッドをつなげる文字です。

ドットを付けることで、メソッド(操作)をどのオブジェクトに対して行うのかを示しています。
Clearメソッドは、本記事ではこれ以降使用しませんので、プロシージャから削除してもらってもかまいません。
【セルの値を変化させる】
オブジェクトの持つ値のことを、VBAでは「プロパティ」と呼びます。
プロパティには値を記録することができますので、ここではセルの値取得と入力をやってみましょう。
セルの値を取得する
まず、ワークシートを以下の状態にしてください。

エディタ画面に移り、プロシージャに以下赤枠の箇所を記述してください。

ここでは、B1セルの値を取得して変数に記録させた後(①)、Msgboxを用いて変数の値を表示(②)させています。
プロシージャを実行すると以下のようにメッセージがポップアップ表示されます。

オブジェクトについては先ほど解説しましたので、「Value」について解説します。
「Value」はプロパティです。セルはValueというプロパティを持っています。

先ほどのClearメソッドと同じように、「Range(“B1”)」と「Value」はドットでつなげます。このドットが、どのオブジェクトのプロパティを参照しているのかを示します。
変数へ値を記録するには、以下の書式を使用します。
変数名 = 値
このイコールは「代入演算子」です。イコールの右辺から左辺へと値を渡すことができます。
右辺には値以外も使用できます。セルのプロパティも指定できますし、変数から変数へ値を渡すこともできます。
A1セルの値を変数に記録する場合: 変数名 = Range(“A1”).Value
変数から変数へ値を渡す場合 : 変数名 = 変数名
変数から値を取り出して使用するには、変数名をそのまま記述します。

Msgboxは「文字列を表示する」機能を持ちますが、文字列だけでなく、変数の値も表示できます。
セルに値を入力する
セルのValueプロパティに値を入力するには、値取得の逆のことをします。
任意の値や変数の値をB2セルに入力する場合: Range(“B2”).Value = 値または変数名
実際にプロシージャに記述してみましょう。
エディタ画面に移り、プロシージャに以下赤枠の箇所を記述してください。
(Msgboxの行は不要なので削除してください)

ここでは、変数に数値を記録(①)させた後、変数の値をB2セルに入力(②)しています。
実行すると、ワークシートのB2セルに値が入力されます。

【文字列と変数を連結する】
VBAでは、変数と文字列を連結して一つの文字列にすることができます。

変数名と文字列の間には連結演算子「&(アンド)」があります。
この演算子を使用することで、複数の要素を合体させ、1つの文字列として扱えるようになります。
Msgboxを使用して、連結した文字列を表示してみましょう。
エディタ画面に移り、プロシージャに以下赤枠の箇所を記述してください。

実行すると、以下のように表示されます。

変数「文字列変数」と変数「数値変数」には異なるデータ型が宣言されていますが、どちらの値も文字列の一部として使用できます。
【文字入力画面を使用したプロシージャを作成する】
本記事のしめくくりとして、「変数」「オブジェクト」の要素を取り入れたプロシージャを作成していきましょう。
初出となりますが、VBAには「Inputbox」という文字入力画面を表示するための命令があります。
これを使用すれば、
・名前をユーザー入力
・年齢をユーザー入力
・名前と年齢をポップアップ表示
・ユーザー入力された値はセルに入力
という要件を満たしたプロシージャが作れます。
作り方
エディタ画面に移り、プロシージャの以下赤枠の箇所を書き換えてください。

Sub ExcelVBA002() Dim 文字列変数 As String Dim 数値変数 As Long 文字列変数 = InputBox("名前を入力してください") Range("B1").Value = 文字列変数 数値変数 = InputBox("年齢を入力してください") Range("B2").Value = 数値変数 MsgBox 文字列変数 + "さんの年齢は" + 数値変数 + "才です" End Sub
実行して、文字入力画面が2回表示され、

名前と年齢がポップアップ表示され、ワークシートのセルの値が変わっていれば、完成です。

Inputboxについて
Inputboxの書式(入力結果を変数に渡す場合)
変数名 = Inputbox(文字列)
文字入力画面を表示し、入力された値を変数に記録します。
キャンセルが押された場合には、変数には空文字がセットされます。
注意点として、入力画面で数値以外の文字を入力した場合に、受け取る側の変数が数値型の変数だと、エラーが表示されてしまいますので、気を付けましょう。
【終わりに】
初級編第2回目の今回は、「変数」「オブジェクト操作」をメインに解説いたしました。
オブジェクト操作という概念を理解したうえでVBAを開発できるようになると、より高度なマクロを作れるようになります。
ExcelVBAで取り扱えるオブジェクトは他にもたくさんあります。
初級編だけでは解説しきれないものもありますので、気になった方はご自身でネット検索して調べてみることをおすすめします。
今回はここまでとさせていただきます。
次回の記事では、「繰り返し処理」について解説いたします。
また次回お会いしましょう。