Mutable_Yunの業務改善ブログ

VBA勉強中の非エンジニア会社員向けのブログです。業務改善についても触れています。

VBA MsgBoxは関数

VBAで便利なMsgBox関数があります。私の身近にMsgBoxを関数ではなくメソッドだと思っている人がいたので要点を簡潔に解説します。

目次

「関数」とは何かについての認識を合わせておく

VBAにおける関数は何かの入力値に対して、値を返すものです。VBAの場合、関数といえばSum関数のように、引数に対して何らかの値を返す、一つの構文です。

そもそもメソッドなら、オブジェクトにくっついていないとおかしい

私の身近にいる人でMsgBoxをメソッドだと思っていた人は、下の例のように戻り値を受け取らないMsgBox関数の使い方しか知りませんでした。

Sub 単に表示させるだけ()
    
    MsgBox "こんにちは"

End Sub

しかし、これをもってメソッドだと思ってしまうのも間違いです。メソッドはオブジェクトが持っているSubプロシジャやFunctionプロシジャのようなものです。よってメソッドは必ずSheets.Addのように何かのオブジェクトにくっついて使います。

MsgBoxにカッコをつける場合とつけない場合

カッコをつけないとエラーになる場合

関数なら戻り値を受け取れるはずなので、下記の様に書き換えてみます。

Sub これはエラーになる()
    
    Dim MsgBoxの戻り値を受け取る変数
    MsgBoxの戻り値を受け取る変数=MsgBox "こんにちは"

End Sub

関数は普通()が付いていますよね。だから、()をつければエラーになりません。

Sub これはエラーにならない()
    
    Dim MsgBoxの戻り値を受け取る変数
    MsgBoxの戻り値を受け取る変数 = MsgBox("こんにちは")

End Sub

カッコをつければ戻り値を受け取らなくてもエラーにはならない

初めの「単に表示させるだけ」のプロシジャがエラーにならなかったのは、戻り値を使わないので()を省略できただけです。MsgBoxが関数である事に変わりはありません。というわけで、()をつけて、戻り値を受け取らなくてもエラーにはなりません。

Sub これもエラーにならない()
    
    MsgBox ("こんにちは")

End Sub

MsgBoxの戻り値を確かめる

関数なので戻り値があります。調べてみます。

Sub MsgBoxの戻り値を実験する()
    
    Debug.Print MsgBox("こんにちは")    '1が返る
    Debug.Print MsgBox("こんにちは", vbYesNo) 'Yesを押すと6が返る
    Debug.Print MsgBox("こんにちは", vbYesNo) 'Noを押すと7が返る
    
End Sub

このようにMsgBoxは整数を返します。よって、戻り値を利用すればユーザーの反応によってその後の処理を分岐させることができます。戻り値は整数なのでLong型で宣言した変数で受けてあげればOKです。

まとめ

この記事の内容をまとめると、下記の様になります。

  • MsgBoxは関数
  • MsgBox関数は引数を受けないときはカッコの省略が可能
  • MsgBox関数は引数を受けるときはカッコの省略が不可
  • MsgBox関数はカッコをつけておけばエラーにはならない

恥ずかしい思いをしなくて済むよう、いつも使っている簡単な構文の理解を曖昧にしないようにして、レベルアップしていきましょう!