ExcelマクロVBA技術解説
VBAでの括弧()の使い方、括弧が必要な場合

ExcelマクロVBAの問題点と解決策、エクセルVBAの技術的解説
最終更新日:2019-10-08

VBAでの括弧()の使い方、括弧が必要な場合


オブジェクトのメソッドや、プロシージャー(Sub、Function)を呼ぶときに、引数を括弧()で囲うのか、囲わないのか・・・
初心者が赤い文法エラーが出て悩むことの一つです。
VBAでは、どんな時に括弧を付けて、どんな時に括弧を付けないのか・・・


・括弧が必要な場合
・括弧が不要な場合

これらについて具体的な例とともに解説します。

基本文型

オブジェクト.メソッド 引数1, 引数2, …
Call オブジェクト.メソッド(引数1, 引数2, …)
変数 = オブジェクト.メソッド(引数1, 引数2, …) ・・・ 戻り値がオブジェクトならSetが必要

Subプロシージャー 引数1, 引数2, …
Call Subプロシージャー(引数1, 引数2, …)

Functionプロシージャー 引数1, 引数2, …
Call Functionプロシージャー(引数1, 引数2, …)
変数 = Functionプロシージャー(引数1, 引数2, …) ・・・ 戻り値がオブジェクトならSetが必要

関数 引数1, 引数2, …
変数 = 関数(引数1, 引数2, …)

このようになります。
なんとなく括弧が必要な場合が理解できるでしょうか。

以下は文法エラーとなります。

オブジェクト.メソッド(引数1, 引数2, …)
Call オブジェクト.メソッド 引数1, 引数2, …
変数 = オブジェクト.メソッド 引数1, 引数2, …
Call Subプロシージャー 引数1, 引数2, …
Call Functionプロシージャー 引数1, 引数2, …
変数 = Functionプロシージャー 引数1, 引数2, …


メソッドもプロシージャーも関数も、戻り値を使うか使わないかの違いで、書き方は同じです。

※上記では見やすくするために、半角空白ではなく全角空白を使用しています。

VBAにおける括弧()

括弧()は、括弧()の外から見たら一つの塊として存在します。
最もわかりやすいのは、計算式での括弧()でしょうか。

(1 + 2) * 3

計算式においての説明では、計算順の明示として説明されることが多いと思いますが、
要は括弧の中は一塊であるという事です。
(1 + 2)これで一塊、その塊に*3しているという事です。

VBAでの引数リストの括弧()は、(引数1,引数2,…)これで一塊だという記述になります。
(引数リスト)の一塊として、直前のメソッド等の付属情報になります。

VBAの括弧の意味はこれだけです。
問題は半角空白との関係で、
括弧()を書かなければならない場合、
書かなくて良い(むしろ書いてはいけない)場合があるという事です。

VBAにおける半角空白の意味

VBAにおいて半角空白は、区切として使われます。
ただし、

カンマの後ろは、区切ではなく、見やすく整形して入っているだけとして見て下さい。

さらに、=代入は、そもそも
Set 変数 =
Let 変数 = ・・・ Letは通常省略して書いているもの
これらは代入文の受側としての式になります。
そこで、
カンマで繋がっているものは一塊、代入式も一塊として見るようにすると、
※以下、半角空白は□で表記します。

メソッド□引数
Call□メソッド(引数)
代入式□メソッド(引数)
プロシージャー□引数
Call□プロシージャー(引数)
代入式□メソッド(引数)
・・・

メソッドもプロシージャーも関数も記述においては同じです。
書き方が変わるのは、戻り値を使うか使わないかという違いだけです。
そこで、わかりやすいように、この後は「メソッド」だけで説明します。
さらに説明を進めます。
括弧はその前の単語に対する追加情報になります。
このページの説明でも、単語(追加情報)のように書いたりしています。
この追加情報と同じだと考えてください。
VBAでの追加情報である括弧()は、その前の単語にくっつけて(間に空白を入れずに)記述します。
つまり、空白で区切られておらず一塊になっています。
したがって、単語(追加情報)、これで一塊だという事です。
そこで、
上記の、「メソッド(引数)」を「メソッド引数」のように書き換えてみると、

メソッド□引数
Call□メソッド引数
代入式□メソッド引数

この3パターンだけということになります。
これらは、

先□元
主体□客体
命令□オペランド

このような関係であると説明したほうが理解しやすいでしょうか。
こうしてみると、半角空白(□) は1つしか出てきません。
2つ出てくることはありません。

ですので、
Call□メソッド□引数
この指定は、ありえない指定ということで、赤字エラーになります。

では、半角空白がなくて良い場合と、1つ必要になる場合はどうかです。
もともと、
メソッド
これだけ書けば、Callが省略されている訳ですから問題ありません。
そこで、引数を追加する時に、
メソッド(引数)
メソッド□引数
どちらになるのかと言う事になります。

引数が複数ある場合
メソッド□(引数1, 引数2, …)
これは赤字エラーになります。
引数が一つの場合
引数が1つの場合、コンパイルは(つまり文法的には)どちらもOKとなります。
ただし前者の書き方をすると、
メソッド□(引数)
このように、引数の括弧の前に半角空白が自動的に付きます。
つまり、そこには、半角空白の区切が必要だと言う事です。

これは、1つの引数を括弧()で囲ったことになってしまいます。
それは、引数を渡すのではなく、引数の値を評価してその値を渡す事になります。
この場合、たとえByRefの引数であっても、
渡す前に先に値を評価して、その評価した値を渡す事になるので、ByValとして動作することになってしまいます。
ByVal、ByRefについては、値渡し、参照渡しについて(ByVal,ByRef)
ByValが値渡し、ByRefが参照渡しです。ここまでは、どこにでも書いてありますし、なんとなく理解していても、実際の活用がなかなか出来ない事が多いようです。使用例を通じて、理解して下さい。上記のsample1を実行すると、2,3の順にメッセージ表示されます。
逆に言えば、ByValなら括弧()があってもなくても同じことだという事でもあります。
このような間違いをしないように、基本としてはCallを省略しない事をお勧めします。
このようにして見ていくと、むしろ、
メソッド□引数1,引数2,・・・
この記述こそが特別なもののように見えてきます。

VBA マクロ 括弧 半角空白
VBA マクロ 括弧 半角空白

上はエクセルVBA、下はVB.NET(VisualStudioのVisualBasic)で、同じことを行った場合の動画です。
このように、VB.NETでは常に括弧()が付いて記述が統一されています。
つまり、VBAの

メソッド□引数1, 引数2, …
むしろこの記述こそが不自然なものであるという事にほかなりません。
VBAの、
メソッド□引数1, 引数2, …
これが特別な書き方だということです。

追加で説明するなら、
変数 = Functionプロシージャー 引数1, 引数2, 引数3
これは、普通に見てもおかしい感じをうけますね。
これでは、
変数 = Functionプロシージャー
これに対して引数を指定しているようにも見えてしまいます。
少なくとも、=の右辺に区切としての半角空白が入る事はありません。
(当然、演算子の前後の半角空白は除いてという事です)

戻り値を他の用途に使う時

オブジェクト式の一部
オブジェクト式として、
メソッド1(引数1, 引数2, …).メソッド2
このような記述が出てくることがあります。
これは、
Set 変数 = メソッド1(引数1, 引数2, …)
変数.メソッド2
これと同じことで、2つをくっつけて書いていることになります。
さすがに、この場合に括弧()を半角空白で書いてしまう事はないでしょう。

他の引数にネスト
他のメソッドや関数の引数に使う場合、
メソッド1(引数1, メソッド1(引数1, 引数2, …), …)
このような使い方をする場合もありますが、この場合は括弧()が必ず必要になります。
この場合は、さすがに括弧を省略しようと思う人はいないでしょう。
当然、関数の引数内でも同じことになります。

Ifステートメントで使う場合
Ifステートメントの条件式に使う場合、
If メソッド1(引数1, 引数2, …) = 値 Then
この場合も括弧()が必ず必要になりますが、
やはり括弧を省略しようと思う人はいないとは思います。
これは、
If (メソッド1(引数1, 引数2, …)) = 値 Then
このように記述することと同じになります。

括弧()の使い方の基本文型

以上いろいろ説明しましたが、以下を文型として理解してください。

メソッド 引数1, 引数2, …
Call メソッド(引数1, 引数2, …)
変数 = メソッド(引数1, 引数2, …)
(メソッド(引数1, 引数2, …))

本来は、括弧()を書く方が普通なのです。
メソッド 引数1, 引数2, …
これが特別なのです。
しかし、VBAではこの使い方が非常に多い事からわかりづらくなっていると思います。

もう一度言います。
メソッド 引数1, 引数2, …
これが特別なのです。

Callを省略しなければ全て括弧が必要になる

上で述べたように、
メソッド 引数1, 引数2, …
これだけが特別なのですが、これはCallが省略された形になります。
つまり、
常にCallを書けば、全て括弧()が必要になり記述は統一されます。
例えば以下のVBA

With Range("B3:C5")
   .Clear
   .Insert Shift:=xlDown
End With

ごく普通の書き方に感じられるでしょう。(処理内容は意味なしコードです)
本サイトで学んだ人でも、こういう書き方をしているはずです。
しかし、これらのメソッド(ClearやInsert)は、Callが省略されているのです。

With Range("B3:C5")
  Call .Clear
  Call .Insert(Shift:=xlDown)
End With

Callを省略せずに書けば、このようになります。
そして、この書き方こそが本来の書き方だと言ってよいでしょう。
しかし、多くの書籍およびWEBページでの説明は前者の書き方になっているはずです。

VBAの括弧()が、どういう時に書くのか分からなくなってしまう最大の原因はここにあるのだと思います。
つまり、最初にCall省略で書きなれてしまうため、
その後に括弧()付きの書き方が必要になった時に戸惑ってしまう事になっているのではないでしょうか。

とはいえ、
多くのサンプルでCallが省略されていますし、わざわざ書くのは面倒でもあります。
慣れてしまえば、ごく当たり前に両者を書き分けられるようになるものです。

最後に一言

括弧()については、VBAの単なる決まりでしかなく、
他の言語から見ると、むしろ特殊な感じさえあるかもしれません。
単にそういう決まりなんだと受け入れるしかないと思います。

VBA動作として気を付けなければならないのは、
メソッド□(引数1) ・・・ 括弧を付けると先に値を評価して常に値渡しになる。
その他の場合は、
間違っていれば赤字エラーになるので、エラーになったら直せば済みます。



同じテーマ「マクロVBA技術解説」の記事

実は奥が深いIfステートメント
論理積(And)論理和(Or)と真(True)偽(False)の判定
If条件式のいろいろな書き方:TrueとFalseの判定とは
VBAでの括弧()の使い方、括弧が必要な場合
VBAにおけるピリオドとカンマとスペースの使い方
変数とプロシージャーの命名について
文字列置換の基本と応用(Replace)
データクレンジングと名寄せ
ForとIfのネストこそがVBAの要点
For Next の使い方いろいろ


新着記事NEW ・・・新着記事一覧を見る

VBAにおける変数のメモリアドレスについて|VBA技術解説(11月8日)
空文字列の扱い方と処理速度について(""とvbNullString)|VBA技術解説(1月7日)
Errオブジェクトとユーザー定義エラー|VBA入門(11月5日)
シングルクォートの削除とコピー(PrefixCharacter)|VBA技術解説(11月4日)
ユーザー定義型の制限とクラスとの使い分け|VBA技術解説(11月3日)
クリップボードに2次元配列を作成してシートに貼り付ける|VBA技術解説(11月1日)
VBAクラスを使ったイベント作成(Event,RaiseEvent,WithEvents)|VBA技術解説(10月31日)
VBAクラスのAttributeについて(既定メンバーとFor Each)|VBA技術解説(10月19日)
VBAの用語について:ステートメントとは|VBA技術解説(10月16日)
VBAのマルチステートメント(複数のステートメントを同じ行に)|VBA技術解説(10月14日)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|ExcelマクロVBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.変数宣言のDimとデータ型|ExcelマクロVBA入門
6.繰り返し処理(For Next)|ExcelマクロVBA入門
7.マクロって何?VBAって何?|ExcelマクロVBA入門
8.ひらがな⇔カタカナの変換|エクセル基本操作
9.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説
10.セルに文字を入れるとは(Range,Value)|VBA入門



  • >
  • >
  • >
  • VBAでの括弧()の使い方、括弧が必要な場合

  • このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


    記述には細心の注意をしたつもりですが、
    間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
    なお、掲載のVBAコードは自己責任で使ってください。万一データ破損等の損害が発生しても責任は負いません。




    このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
    本文下部へ