業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、コンパイルエラーにならない関数の使い方として、括弧の有無、複数の引数、Callステートメント、戻り値、名前付き引数と順番について解説。
今回から「関数」に関するExcel VBA/マクロのTipsを紹介していく。紹介する前に、「関数」の書き方には、いろいろな方法があり、必ずしも一通りの書き方ではないことを頭に入れておいていただきたい。
また関数の書式の書き方で下記のような記述方法を採用しているが、この書式の説明は、一般的な書式の説明方式に従ったまでで、必ずしも、「関数名」の後に、必ず括弧()で囲って「引数」を指定するものではないと、認識しておいていただきたい。
関数名(引数1,引数2,……)
上記のように引数1、引数2と、複数の引数を使う場合は、省略できる引数もあるが、それについては、関数を紹介する都度解説する。
以降は、関数を使う上で「コンパイルエラー」(以降、エラー)にならないために重要な下記の事項を順に紹介する。
まずは、括弧()の有無によるエラーの発生条件について解説しよう。ここではMsgBox関数を例にする。書式は、下記のようになる。引数は、よく使用される引数だけを指定している。
MsgBox(prompt,buttons,title)
引数「prompt」には、メッセージの内容を表示する。引数「buttons」は省略可能で、表示するボタンの種類を指定する。引数「title」は省略可能で、メッセージ画面のタイトルバーに表示するテキストを指定する。
引数が1つの場合(「buttons」「title」を省略)は、下記のように書式通りに記述した場合、当然のようにエラーにはならない。
MsgBox("お元気ですか?")
また、下記のように括弧()を省略しても問題はない。
MsgBox "お元気ですか?"
しかし、引数が2つ以上になると、上記【A】のように書き方ではエラーになるので注意してほしい。上記【A】でエラーにならないのは、あくまでも引数が1個のみの場合だ。
MsgBox("これでよろしいですか?",vbOKOnly)
MsgBox "これでよろしいですか?",vbOKOnly
VBAの文法的には、エラーにはならないが、【A】の記述方法(引数が1つの場合の括弧())は本Tips連載では推奨しない。【B】【D】の書き方を採用していくし(後述するが、Callステートメントや返り値がない場合)、一般的な説明でも、【B】【D】の記述方法が採用されている。
なぜ、括弧()ありの書き方では、引数が1つでは正常【A】で、引数が2つになるとコンパイルエラーになる【C】かというと、括弧()が引数を渡すためのものではなく、引数内で演算処理が行うための括弧()だからだ。
下記のように記述すると理解できるだろう。【E】は正常に動作する。結果は「お元気ですか?これでよろしいですか?」を返す。+演算子は文字列を使う場合は連結してくれる。
MsgBox ("お元気ですか?"+"これでよろしいですか?"), vbOKOnly
MsgBoxに、引数を括弧()で囲って下記のように記述すると、コンパイルエラーになる。これは【C】と同様だ。一つ目の引数で演算が行われる
MsgBox ("お元気ですか?"+"これでよろしいですか?", vbOKOnly)
ここで、二つ目の引数を省略してみよう。
MsgBox ("お元気ですか?"+"これでよろしいですか?")
すると、エラーにならない。これは、【E】と同様、括弧()が引数を渡すためのものではなく、括弧()が一つの引数内で演算処理が行うためのものだからだ。
ここで、似たようなパターンを思い出せるだろうか。そう、【A】のパターンである。
MsgBox("お元気ですか?")
実は、【A】の括弧()は引数内で演算処理が行うためのものだったのだ。だから、コンパイルエラーにはならないが、引数を渡すためのものではないということだ。
これを基本事項として覚えておいてほしい。ところが、これが全て覆るパターンがあるので、またやっかいだ。
先ほどのエラーになった【F】だが、Callステートメントを付けて下記のようにすると、正常になる。
Call MsgBox ("お元気ですか?"+"これでよろしいですか?", vbOKOnly)
逆に、【E】をCallステートメントを付けて下記のようにすると、エラーになる。
Call MsgBox ("お元気ですか?"+"これでよろしいですか?"), vbOKOnly
Callステートメントを使用した場合は、必ず引数全部を括弧()で囲む必要がある。Callステートメントの詳細については下記のURLの「解説」を参照してほしい。
Callステートメントを使用しない場合は、前述しているが、括弧()で囲まないのが仕様なのだ。ただし、正確には、引数が1個の場合を除く、という条件が付く。この点を十分に頭に入れておいていただきたい。
ただ、これらの記述の場合は、「戻り値」(「返り値」ともいう)を使う場合は使用しても意味がないだろう。Callステートメントは戻り値を受け取ることができないので、使用する意味がない。
MsgBox関数は戻り値を使う場合、以下のような記述になる。
Dim result As Variant result=MsgBox "これでよろしいですか?",vbOKCancel,"確認"
Callステートメント同様、戻り値を使う場合も、引数に括弧()がないとエラーになる。これは引数が複数あるかないかは関係ない。下記のように引数に括弧()が必要だ。
Dim result As Variant result=MsgBox("これでよろしいですか?",vbOKCancel,"確認")
【K】のように記述すると、画面上に「これでよろしいですか?」というメッセージと「OK」と「キャンセル」ボタンが表示される。タイトルバーには「確認」と表示される(図1)
変数「result」に戻り値が入り、その戻り値を基に下記のように条件分岐ができる。
If result=vbOK then Msgbox "OKが押されました。" End If
このような戻り値を活用する記述方法が、「関数」本来の使い方だと、筆者は思う。
次に、同じ名前が関数でもありメソッドでもある例としても「InputBox」を紹介しておこう。「InputBox」関数を使うと、ユーザー入力用のダイアログボックスが表示される。
「InputBox」には、関数とメソッドが存在するが、関数とメソッドでは引数が異なる。メソッドでは、最後に「Type」引数を指定できる。また、メソッドのページで紹介されている座標を指定する引数「Left」「Top」「context」は、関数では「Xpos」「Ypos」「HelpContextID」になるので注意してほしい。
今回紹介するのは関数の方だ。下記、引数の解説では関数もメソッドも大きな差はないが、「Type」引数は関数では使用しないため、省略している。
InputBox(Prompt,Title,Default,Xpos,Ypos,HelpFile,HelpContextID)
「Prompt」は必須項目で、ダイアログボックスに表示されるメッセージを指定する。
「Title」は省略可能で、ダイアログボックスのタイトルを指定する。この引数を省略すると、既定のタイトルは「Microsoft Excel」と表示される。
「Default」は省略可能で、ダイアログボックスに表示されるテキストボックスに最初から表示しておく文字列を指定する。
「Xpos」は省略可能で、画面の左上隅を基準としてダイアログボックスのx座標を指定する。
「Ypos」は省略可能で、画面の左上隅を基準としてダイアログボックスのy座標を指定する。
「HelpFile」は省略可能で、この入力ボックスのヘルプファイルの名前を指定する。引数「HelpFile」と「HelpContextID」が共に存在する場合、ダイアログボックスで「ヘルプ」ボタンが表示される。
「HelpContextID」は省略可能で、ヘルプファイルのコンテキストID番号を指定する。
「InputBox」というシートを追加して、図2のように「お名前は」というボタンが配置されているとする。
「お名前は」ボタンをクリックして「入力ダイアログボックス」が起動し、セル「D3」に入力された名前を表示するコードはリスト1になる。
Sub InputBox関数の使い方() Dim 名前 As String 名前 = InputBox("お名前は","名前を入力",1000, 4000) Range("D3").Value = 名前 End Sub
文字列型の「名前」変数を宣言する。
「InputBox」関数で「Prompt」に「お名前は」と指定し、「Title」に「名前を入力」と指定。表示位置を「Xpos」に「1000」、「Ypos」に「4000」と指定した。
入力された「名前」はセル「D3」に表示させる。
このリスト2のマクロを「お名前は」ボタンに関連付け、実行した結果が図3だ。
関数の引数の順番は入れ替えることもできる。先ほどのInputBox関数を例に解説しよう。
先ほどのリスト2の3行目は、下記のように書くことができる。
名前 = InputBox(Prompt:="お名前は", Title:="名前を入力", Xpos:=1000, Ypos:=4000)
これは「名前付き引数」を使った書き方だ。「名前付き引数」を使うと、引数の順番を変更することができる。つまり、下記のように書いてもエラーにはならず、正常に動作する。なお、「名前付き引数」は大文字と小文字のどちらでも構わない。
名前 = InputBox(Prompt:="お名前は", Xpos:=1000, Ypos:=4000, Title:="名前を入力")
しかし、「名前付き引数」を使用しない場合は、引数は書式の順番に従って書く必要がある。「名前を入力(title)」の後には、書式を見ると「Default」を指定するようになっているので、「Default」を指定しない場合はリスト2のように記述する必要がある。
名前 = InputBox("お名前は", "名前を入力", , 1000, 4000)
この場合は、戻り値が変数「名前」に格納され、InputBox関数に入力された「名前」の取得が可能になる。
しかし、引数の順番を無視して、例えば以下のように書くとエラーになるので、注意してほしい。
名前 = InputBox("お名前は", , 1000, 4000, "名前を入力")
以上のように、「関数」の記述方法は必ずしも一通りではない。書式の説明で解説しているのと、実際のコードの書き方は異なる場合があることを頭に入れておいてほしい。
次回からExcel VBAにおけるさまざまな関数のTipsを紹介する。Excel VBAの関数にどのような種類があるかをMSDNで検索したところ、Visual Basic用の関数しか表示されず、Excel VBAに関する関数の情報がマイクロソフトのサイトにまとまっていなかった。そのため、関数の一覧については下記のVBScriptのページを参考にした。
ただし、上記ページにも含まれていないVBA特有の関数についても数点解説していく。
関数編では、筆者の独断と偏見でこれは便利だな、と思う関数を抜粋して紹介していきたいと思う。また、これまでのTips連載で出てきた関数については省略している点、ご了承願いたい。これまで紹介してきた関数や、今後紹介する関数の一覧は、下記で確認できる。
次回は、ファイル操作に関する「Shell」「CreateObject」「Dir」「FileLen」「LoadPicture」の5つを紹介するので、お楽しみに。
薬師寺国安事務所代表。Visual Basicプログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。
1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。
1997年に薬師寺聖とコラボレーション・ユニット「PROJECT KySS」を結成。
2003年よりフリーになり、PROJECT KySSの活動に本格的に参加。.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。
Windows Phoneアプリ開発を経て、現在はWindowsストアアプリを多数公開中。
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)。
Microsoft MVP for Development Platforms-Windows Platform Development (Oct 2014-Sep 2015)。
Copyright © ITmedia, Inc. All Rights Reserved.