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

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
公開日:2013-10-22 最終更新日: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(参照渡し) ・普通の変数(プリミティブ型)の場合 ・オブジェクト変数の場合 ・サイト内のByVal,ByRefの記事
逆に言えば、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ステートメント

プログラムと言うものは、条件により処理を分ける。これにつきます。つまり、この条件が一番問題となります。そして、その記述をするものが、Ifステートメントになります。IFステートメントの基本 まずはIFステートメントの基本を確認しましょう。
論理積(And)論理和(Or)と真(True)偽(False)の判定
・Trueとは何か、Falseとは何か ・論理積(And) ・論理和(Or) ・Ifステートメントにおける真偽の判定 ・例.指定のフルパスがフォルダかの判定
If条件式のいろいろな書き方:TrueとFalseの判定とは
If条件式の書き方で、VBAプログラムは大きく様相が変わってきます、VBAを習い始めは、比較演算子で比較した結果が 正しければTrue、間違っていればFalse という事で理解するはずです。しかし、いろいろなサンプルコードを見ていると、「あれっ」比較演算子が無い… というようなIfステートメントやSelectCas…
VBAでの括弧()の使い方、括弧が必要な場合
VBAにおけるピリオドとカンマとスペースの使い方
・ピリオド「.」 ・カンマ「,」 ・スペース「 」
変数とプロシージャーの命名について
VBAを習い始めると、「変数」について学びます、変数に付ける名前を変数名と呼び、若干の規則はあるが、好きな名前を付けて良いと教わります。好きな名前って…ケイコ、ハルカ、アツコ… まあ、それでも良いけど、入れるデータが分かるような名前がよいですね、わかり易い名前を付けましょう。
文字列置換の基本と応用(Replace)
マクロVBAの処理において文字列置換は頻出の処理ですが、これに苦労している初心者の方が多いようです、そこで文字列置換の基本と応用について解説します。・文字列内の空白(半角・全角)を取り除く VBA関数のTrimは前後の空白が削除されるだけです、そこで、Replace関数を使います。
データクレンジングと名寄せ
複数の名簿を突き合わせて一つにする、いわゆる「名寄せ」名寄せを行うためには、その前にデータクレンジングを行う必要があります、データクレンジングとは、データの中から、重複の排除、誤記、表記の揺れの修正などを行い、データの品質を高めることです。データを整形して、扱いやすいデータに変換します。
ForとIfのネストこそがVBAの要点
・第1に考える事・・・大外の繰り返しを作成 ・第2に考える事・・・1支店だけを作成 ・第3に考える事・・・昨対比の判定 ・第4に考える事・・・3支店の繰り返し ・第5に考える事・・・3支店の繰り返しを全体の中に組み込む ・最後に考える事・・・最後の仕上げ ・目指すべきVBAの書き順・・・VBAが上達したら
For Next の使い方いろいろ
VBAの繰り返し処理としては、ForNextまたはDoLoop この二つを最初に学んだのではないでしょうか。プログラムにおける繰り返し処理は、基本中の基本です。特に使用頻度の高いForNextを重点的に学んでいることと思いますが、書き方、使い方は、いくつかのパターンがあります。


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

ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)
VBAでクリップボードへ文字列を送信・取得する3つの方法|VBA技術解説(2023-12-07)
難しい数式とは何か?|エクセル雑感(2023-12-07)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.並べ替え(Sort)|VBA入門
8.条件分岐(IF)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門




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


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



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