プログラミング初心者を対象にExcelマクロ/VBAを使った業務自動化プログラムの作り方を一から解説します。今回は、VBAのオブジェクト、プロパティ、メソッド、関数、算術演算子、コメント、VBEの画面構成や使い方などについて【Windows 10、Excel 2016に対応】。
プログラミング初心者を対象にExcelマクロ/VBAを使った業務自動化プログラムの作り方を一から解説する本連載「Excelマクロ/VBAで始める業務自動化プログラミング入門」。前回の「Excelでプログラム作成を始めるメリットとマクロの基本」では、そもそもプログラミングとは何か、Visual BasicとVBAとマクロの違い、マクロの作り方、保存/削除、セキュリティ設定などについて解説した。
今回はExcel VBAプログラミングの基本的な用語解説をメインに、VBE(Visual Basic Editor、VBエディター)の画面構成や使い方も解説する。プロパティ、メソッド、オブジェクトなど専門用語が出てくるが、できるだけ分かりやすく解説したいと思う。どうか、嫌にならずに着いてきてほしい。
これらの用語はプログラミングをする上では必ず出てくるものであり、意味を知らずしてプログラミングすることはできない。意味が分かれば、これ以降の説明も理解しやすくなると思う。
何でもそうだが、全ては基本を理解するところから始めることが重要だ。これは全ての習い事に共通していることである。理解するには実践あるのみ。ぜひ実際に手を動かしながら身に付けていってほしい。
基本構文に入る前に知っておかねばならないこととして、VBAには「オブジェクト」という概念がある。「オブジェクト」とは、操作を指示する際に、操作の対象となる「物」のことを指す。
Excelの場合では、「ブック」「セル」「ワークシート」「グラフ」「フォーム」などが当てはまる。「オブジェクト」の概念がつかめたところで、VBAの基本文法を紹介しよう。
Range("{オブジェクトの名前}").{オブジェクトのプロパティ名}
Range("A1").Value
※「Range」とはセルの選択の際に使用するオブジェクトを指す。
Range("{オブジェクトの名前}").{オブジェクトのプロパティ名}={値}
Range("A1").Value=10
※「=」は「代入演算子」といい、「=」の右にある値を「=」の左側にある変数やプロパティに代入する(入れる)ことができる。
Range("{オブジェクトの名前}").{動作名}
Range("A1").Select
※Selectメソッドは「選択する」という動作を表す。メソッドの意味については後述する。
次に、先ほどから出てきている「プロパティ」について解説しよう。
「プロパティ」とはオブジェクトごとに設定されている「属性情報」のことだ。言い換えると、「オブジェクトの性格を表すデータ」のことだ。オブジェクトのプロパティに値を設定すると、オブジェクトの見た目や形が変化する。
例えば、Excelの「セル」には表1のようなプロパティがある。
プロパティ名 | 概要 |
---|---|
Value | セルに値を設定したり、セルの値を取得したりする |
Row | セルの行番号(縦軸で上から下に1、2、3……)を表す |
Column | セルの列番号(横軸で左から右に1、2、3……)を表す |
では、そのプロパティの値を取得するには、どうすればいいのだろうか。
例えば「A1セルの内容を取得する」には下記のように書く。
Dim {値を入れる器} As Integer {値を入れる器} = Range("A1").Value
「Range("A1")」はA1セルを示すオブジェクトだ。Valueはセルの内容を表すプロパティだ。よって、セルA1の値が、{値を入れる器}の中に格納されることになる。
※「Dim」とは「変数を宣言する」という意味だ。「変数」については次回で詳説する。
では、次に、プロパティの値を設定してみよう。
例えば、「A1」セルに「薬師寺」という値を設定するには下記のように書く。
Range("A1").Value="薬師寺"
前述したように、「Range("A1")」は「A1」セルを示すオブジェクトで、Valueはセルの内容を表すプロパティだから、これに「=」を使って「"薬師寺"」と指定すると、セル「A1」に「薬師寺」という値が表示される。「薬師寺」は文字列であるため、ダブルクォーテーション(")で両側を挟む。
次に、メソッドについて見ていこう。
「メソッド」とは、「命令」「操作」「動作」「振る舞い」といった意味を指す。言い換えれば「オブジェクト自身の動作によって返される結果の手続き」のことだ。
例えば、セルには次の表2のようなメソッドがある。
メソッド名 | 概要 |
---|---|
Select | ワークシートの中のセルの選択を表す |
Delete | 対象セルを削除 |
Insert | 対象セルに同サイズの空白セルを挿入 |
例えば「A1セルを選択せよ」という命令を与えるには、下記のように書く。
Range("A1").Select
「Range("A1")」はセルを表すオブジェクトで、「Select」はセルを選択するメソッドとなる。
また、「引数」を使って命令の内容を細かく指示することも可能だ。引数を指定するには、メソッド名の後に半角スペースを入力して内容を記述する。
例えば、「A2〜A5のセルの数値を昇順でソートする」には下記のように書く。
Range("A2:A5").Sort Key1:=Range("A2")
Range("A2:A5")はA2〜A5の範囲を表すセルを表すオブジェクト、Sortは「並べ替え」を行うメソッドだ。「Key1」はソートの基準となるキーを指定するという意味の「パラメータ」で、「Range("A2")」が「引数」である。「:=」でパラメータに対して引数を指定することになる。上記プログラムは、「キーにはセルの「A2」を指定してA2〜A5の範囲セルを並べ替える」ことを意味する。
実行すると、A2〜A5の数値が昇順でソートされる(図1)。
※Sort(データの並べ替え)については別の回で詳説する。
さらに、複数の引数を指定することも可能だ。
WorkSheets.Add(Before,After,Count,Type)
Beforeは、第1引数、Afterは第2引数、Countは第3引数、Typeは第4引数となる。BeforeとAfterはどちらか一方を指定する。同時に指定することはないと思っていい。
例えば、ワークシートを「住所録」シートの後ろに4枚追加する場合は、下記のように書く。
WorkSheets.Add After:=WorkSheets("住所録"),Count:=4
「After:=WorkSheets("住所録")」は第2引数、「Count:=4」は第3引数となる。
引数名を複数使って引数を指定する場合に、省略した引数の区切りの「,」を記述する必要はない。また、順番も関係なく指定できる。引数は、「{引数名}:={値}」といった形式を用いる。詳細はTIPS「コンパイルエラーにならない関数の使い方――括弧の有無、複数の引数、Callステートメント、戻り値、名前付き引数と順番」を参照してほしい。
VBAでマクロを作成する場合は、「何に対して操作を実行するのか」をオブジェクトで指定する必要がある。Excelで操作する対象が、どのようなオブジェクトとして用意されているか見てみよう。
VBAで指定できるオブジェクトには、Workbookオブジェクト、Worksheetオブジェクト、Rangeオブジェクトがある(図2)。
オブジェクトにおいて、同じ種類のオブジェクトの集まりを「コレクション(集合体)」と呼ぶ。
次は、VBAで指定できるWorksheetオブジェクトとWorksheetsコレクションについて図3で説明しよう。
オブジェクトは、Excelそのものを指定するApplicationオブジェクトを最上位とし、階層構造で構成される(図4)。
記述例として、「Book1.xlsx」ファイルの「住所録」シートのセル「A1」を指定するには下記のように書く。
Workbooks("Book1.xlsx").Worksheets("住所録").Range("A1").Select
次に「関数」について見ていこう。
「関数」とは、「計算などの手順をまとめて定義した数式」のことを指す。
例えば、文字列関数に「Len」という関数がある。これを下記のように記述する。
Dim {値を入れる器} As Integer {値を入れる器} = Len("薬師寺国安")
こう書くと{値を入れる器}には「5」という数字が入る。Len関数は指定した文字列の長さを取得する関数だ。
このようにカッコの中に何かを入れると、それを元に何かを返す、そういった働きをするものが「関数」だ。
VBAには多くの関数が用意されている。主なものとして下記の表3のようなものがある。
分類 | 関数名 | 概要 | |
---|---|---|---|
文字列操作関数 | Len | 指定された文字列の文字数を返す | |
Left | 文字列の左端から指定された文字数分の文字列を返す | ||
Right | 文字列の右端から指定された文字数分の文字列を返す | ||
Instr | ある文字列の中から指定した文字列を検索し、最初に見つかった文字列の開始位置を示す整数型(Integer)の値を返す | ||
Replace | 任意の文字列で、特定の文字列を、指定した文字列に置き換えた文字列を返す | ||
StrComp | 文字列比較の結果により、-1、0、1のいずれかを返す | ||
日付、時刻関数 | DateAdd | 任意の日付や時間に特定の間隔を追加してその結果を返す | |
DateDiff | 2つの日付型(Date)値の間の時間間隔数を指定する長整数型(Long)の値を返す | ||
Year | 年を表す、1〜9999の整数型(Integer)の値を返す | ||
Month | 月を表す、1〜12の整数型(Integer)の値を返す | ||
Day | 日付を表す、1〜31の整数型(Integer)の値を返す | ||
Now | 現在の日付と時刻に対応するシリアル値を返す | ||
数値操作関数 | Round | 指定された小数点位置で丸めた数値を返す | |
Rnd | 単精度浮動小数点数型(Single)の乱数を返す | ||
Int | 指定した数値の整数部分を返す | ||
Fix | 指定した数値の整数部分を返す | ||
※IntとFixの違いは、指定するNumberに負の値を指定した場合に現れる。Int関数はその数値以下の最大の負の整数を返すのに対して、Fix関数は最小の負の整数を返す | |||
データ変換関数 | CBool | 引数を評価してブール型(真(True)/偽(False))を返す(ブール型に変換する)関数 | |
CByte | 引数を評価してバイト型(Byte)データに変換する関数 | ||
CCur | 指定された式をバリアント型(内部処理形式が通貨型(Currency)の Variant)に変換して返す | ||
CDate | 引数を評価して日付型に変換する関数 | ||
CInt | 指定した値を数値型(Integer)に変換 | ||
CLng | 指定された式をバリアント型 (内部処理形式が長整数型(Long)の Variant) に変換して返す | ||
CStr | 指定した値を文字列型(String)に変換 | ||
CVar | 引数を評価してバリアント型に変換する関数 | ||
その他 | MsgBox | ダイアログ ボックスにメッセージを表示 | |
InputBox | 文字入力を行うボックスを表示させる | ||
※こちらの表は【VB】関数一覧 - オープンリファレンス(クリエイティブ・コモンズ 表示―継承ライセンス 2.1)の表を基に改変したものです |
プログラムの中で計算するときは、関数の他に「算術演算子」を使う。算術演算子の種類には表4のようなものがある。
演算子 | 説明 |
---|---|
+ | 足し算 |
- | 引き算 |
* | 掛け算 |
/ | 割り算 |
^ | べき乗 |
\ | 割り算の結果の整数部を返す |
Mod | 割り算の結果の余りを返す |
演算子には他に、冒頭で紹介した「=」(代入演算子)や「連結演算子」として「&(文字をつなぐ)」がある。また「比較演算子」「論理演算子」などもあるが、複雑なので、後の連載で紹介しよう。
InputBox関数を用いて、入力された値をExcelの「A1」のセルに表示させてみよう。
リスト1のようなコードをVBEで記述する。すると入力ボックスが表示され、名前を入力して[OK]ボタンをクリックすると「A1」のセルに入力した名前が表示される。
Sub お名前は() Range("A1").Value = InputBox(prompt:="お名前は?") End Sub
図5はリスト1のコードを入力した結果だ。まだ、この時点で理解しておく必要はない。
次に、ワークシート関数について見てみよう。
ワークシート関数とは、そのものずばりワークシートで使用する関数で、VBA関数とは別のものだ。ワークシート関数はWroksheetFunctionクラスのメンバーだ。VBAからワークシート関数を呼び出すにはApplicationオブジェクトのWorksheetFunctionプロパティを使用する。
※前述しているが、「メンバー」とはコレクション内の各オブジェクトのことを指す。
例えばVBAで、数値の合計を求めたいときにSUM関数を使う。では、WorksheetFunctionプロパティを使って、合計を求めてみよう。
書式は下記のようになる。
Application.WorksheetFunction.{ワークシート関数}({引数})
「ワークシート関数」にはワークシート関数を指定する。使用できるワークシート関数は、記述時に表示される入力候補の一覧で、確認できる(図6)。
「引数」にはワークシート関数の引数を指定する。セル範囲を指定する場合はRangeオブジェクトを指定すると良い。
では、コードを書いてセル「B7」に合計を表示させてみよう。図7のようなコードを記述し、上部のツールバーにある右を向いた▲アイコンをクリックすると、合計が表示される。
ここまで、まだ説明もしていないのにVBEの画面を表示してコードを書いてきたが、この辺りでVBEの画面構成について解説しておこう。
VBEを起動させるには[開発]タブにある[Visual Basic]をクリックする。
画面構成は図8のようになっている。
[プロジェクト]エクスプローラーは、Windowsの「エクスプローラー」同様にツリー状にファイルの位置などを表示する。開いているブックと、中に含まれるシートの一覧が表示される。
最上位にブックがあり、その下に「Microsoft Excel Objects」「ワークシート」「フォーム」「標準モジュール」「クラスモジュール」が存在することになる。
[プロパティ]ウィンドウでは、[プロジェクトエクスプローラー]で選択しているオブジェクトの属性が一覧で表示される。図8ではWorkbookのプロパティの一覧が表示されている。
[コード]ウィンドウ内には、VBAのプログラムを記述する。
第1回目では、操作を記録する方法でマクロを作成したが、今回はVBEを起動して一からマクロを作成してみよう。
VBEを起動してマクロを記述するには、「標準モジュール」を追加して、その中にマクロを記述する。
標準モジュールを追加するには、標準モジュールを追加するブックを選択し、VBEメニューの[挿入]→[標準モジュール]と選択する(図9)。
標準モジュールが追加された(図10)。
追加したモジュールシートを削除するには、削除する「Module1」を選択し、マウスの右クリックで表示される[Module1 の解放]をクリックする(図11)。
すると「削除する前にModule1をエクスポートしますか?」と聞いてくるので、保存する場合は[はい]を、保存しない場合は[いいえ]を選択する。
標準モジュールを追加したところで、実際にコードを入力してみよう。
図11で挿入した「標準モジュール」のModule1シートにコードを書いていく。
まず、Subの後にスペースを入れて、マクロ名を入力する。マクロ名には「日本語表記」でも「英語表記」でも、どちらでも使用が可能だ。
ただし、日本語では使用できない「記号」があるので、その都度確認すればいい。使用できない「記号」を使用するとエラーが表示されるので分かるはずだ。
[Enter]キーを押すと、マクロの最後に「End Sub」と自動的に追加される。以下を「Subプロシージャ」と呼ぶ。
Sub {マクロ名}() {マクロの処理} End Sub
これ以外に、ユーザー定義関数のように、計算を行って結果を返すタイプのマクロは「Functionプロシージャ」と呼ぶ(後の回で触れる)。
「Subプロシージャ」内にマクロコードを入力してみよう。ここでは、リスト2のようなマクロコードを入力する。
Sub 住所と名前() Range("A1").Value = "愛媛県松山市道後" Range("A2").Value = "薬師寺国安" End Sub Sub 確認() MsgBox Range("A2").Value & "さんは" & Range("A1") & "にお住まいですね。" End Sub
マクロコードを入力する場合には、入力支援機能が利用できる。例えば、「R」と入力し[Ctrl]+[スペース]キーを押すと、「R」で始まるメソッドやプロパティなどの候補の一覧が表示され、その中から目的ものを選択できる。また、「MsgBox」のように関数やメソッド名を入力して[スペース]キーを押すと、引数の情報など、ヒントが表示される。
これらの入力支援機能は、実際にマクロコードを書いてみると実感できるので、その時に確認してみてほしい。実際に自分で書いて確認することが重要だ。
ではリスト1のマクロを実行してみよう。その前に、各「Sub プロシージャ」を関連付けるボタンを配置しておく。ボタンの配置については、第1回目を参照してほしい。
図12のように2つのボタン([挿入]→[図形]から選択)を配置し、各ボタンを選択して、名前を入力する。マウスの右クリックで表示される[マクロの登録]から、表示される「住所と名前」「確認」のマクロをそれぞれのボタンに指定する。ボタンを配置してマクロを関連付ける方法の詳細については、連載第1回を参照してほしい。
[住所と名前]ボタンをクリックすると、図13のように表示され、[確認]ボタンをクリックすると、図14のようにダイアログボックスが表示される。
最後に、コメントの入力について簡単に触れておこう。「コメント」とは、マクロコードの中に書く「これはどんな処理を行っているマクロなのか」を、誰が見ても分かるようにしておく「メモ」のようなものだ。
マクロの中にコメントを書く場合は先頭に「'」を追加して記述する。図15のように記述する。
コメントを入力しておくと、複雑な処理の場合、数年後にマクロの修正が必要になった場合など、忘れていた記憶を取り戻すのに大変重要な役割を果たす。また、担当者が変わり、マクロを引き継ぐ場合にも、コメントが役に立つので、必ずコメントは記入しておくよう心掛けよう。そういう筆者自身はあまりコメントを記入しない性格なので、後々になって冷汗をかいている……。
またマクロコードの中で、今回はこのマクロは不要だが後々のために残しておきたい場合などにも、マクロの先頭に「'」を追加して「コメントアウト」しておく。
数百行のマクロに、いちいち「'」を手で追加していたのではたまらない、そこで、VBEのメニューから[表示]→[ツールバー]→[編集]と選択して[ツールバー]を表示させる。表示された[ツールバー]の[コメント ブロック]をクリックすると、選択していたマクロコードが一括でコメントアウトされる(図16)。
コメントを外したい場合は、外したいマクロコードを選択し、[ツールバー]の[コメント ブロック]の右横にある[非コメント ブロック]をクリックするとコメントアウトが解除される。
今回はこれで終わりだ。今回はプログラムに関する専門用語も出てきたが、これらは最低限、覚えておかねばならない用語だ。用語の意味をある程度理解しておかないと、マクロコードを書くことが難しくなるので、よく読んで理解して、というより、覚えておいてほしい。
次回は、Excel VBAの基礎知識の続編で、変数やデータ型について解説する予定だ。お楽しみに。
【2016/7/7】Windows 10、Excel 2016に対応しました。
PROJECT KySS 薬師寺 国安(やくしじ くにやす)
1950年生まれ。フリーVBプログラマ。高級婦人服メーカーの事務職に在職中、趣味でVBやActiveXに取り組み、記事を執筆。2003年よりフリー。.NETやRIAに関する執筆多数。Windowsストアアプリも多数公開中(約270本)。
Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。
Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。
Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。
PROJECT KySSは、1997年に薬師寺聖と結成したコラボレーション・ユニット
Copyright © ITmedia, Inc. All Rights Reserved.