VBA技術解説
文字列結合&でコンパイルエラーになる理由

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
公開日:2019-09-19 最終更新日:2019-09-19

文字列結合&でコンパイルエラーになる理由


マクロVBAでは、&(アンパサンド)記号で文字列結合を行う事は頻繁に行われますよね。
VBEで&を記述するとき、一度くらいは赤字のコンパイルエラーになったことがあるのではないでしょうか。


どのように入力した時にエラーになるのか、
なぜそれがエラーになるのか、
これらを少しく詳しく見てみましょう。

&の記述がエラーになる入力とは

VBEで、以下のように入力します。
hoge=fuga&piyo
これでEnterすると、

VBA マクロ 構文エラー

このように赤字でエラーになります。
VBAの学習の初期段階で、、
文字結合&(アンパサンド)の前後には、空白を入れるように教わった人も多いのではないでしょうか。

hoge=fuga & piyo
このように&の前後に空白を入れてEnterすれば、

VBA マクロ 構文エラー

これなら問題はありませんね。
Enterした後は、=の前後には半角スペースが自動的に挿入されます。
これは、+=*/等の四則演算でも同じです。
自動的に、前後に半角スペースが挿入されて見やすくなります。
ではなぜ、&は自動で前後に半角スペースが挿入されないのでしょうか。

いえいえ、&の前後にスペースを入れなくてもエラーにならない場合もあります。

hoge="ABC"&piyo
これでEnterすると、

VBA マクロ 構文エラー

&の前後にスペースが自動的に挿入されました。

しかし、文字定数ではなく数値定数の場合、
hoge=123&piyo
これでEnterすると、

VBA マクロ 構文エラー

これはエラーになってしまいました。
それぞれ何が違うのでしょうか。
fuga
"ABC"
123
これだけの違いだけです。

では、さらに、
hoge=huga&"ABC"
これでEnterすると、

VBA マクロ 構文エラー

あれれ、エラーになりました。
以上のようにいろいろなパターンで入れていって、そこからわかる事は、

&の前が変数や数値定数だと&の前にスペースが無いとエラーになるという事です。
つまり、
文字定数("")以外の後ろに&で文字列結合するときは、&の前にスペースが必要だという事です。

さらに、いろいろなパターンで確認していくと、
&の後ろにもスペースが必要な場合が出てきます。
hoge=fuga &haa

VBA マクロ 構文エラー

&の前にスペースをちゃんと入れてもエラーになってしまいました。
でもでも、
hoge=fuga &hii

VBA マクロ 構文エラー

これなら、エラーになりません。
こうなってくると何が何やら分からなくなってきますね。

&の前後にはスペースが必要な時がある理由

変数には、データ型があります。
これについて再確認してみましょう。

データ型 名称 格納できる範囲
Integer 整数型 -32,768 ~ 32,767
Long 長整数型 -2,147,483,648 ~ 2,147,483,647
Single 単精度浮動小数点数型 -3.402823E38 ~ -1.401298E-45(負の値)
1.401298E-45 ~ 3.402823E38(正の値)
Double 倍精度浮動小数点数型 -1.79769313486232E308 ~ -4.94065645841247E-324(負の値)
4.94065645841247E-324 ~ 1.79769313486232E308(正の値)
Currency 通貨型 -922,337,203,685,477.5808 ~ 922,337,203,685,477.00
String 文字列型 最大約20億文字まで
Date 日付型 西暦100 年1月1日~西暦9999年12月31日までの日付と時刻
Byte バイト型 0~255の範囲の単精度の正の数値。8 ビット(1 バイト)
Boolean ブール型 真 (True) または偽 (False)
Object オブジェクト型 オブジェクト
Variant バリアント型 すべてのデータ

詳しくは、以下を参照してください。
第12回.変数とデータ型(Dim)|VBA入門
・データ型 ・変数の使い方 ・変数名の規則 ・良く使われる変数名 ・自動型変換、暗黙の型変換 ・変数宣言の必要性 ・Dim変数宣言のまとめ

そして、主要なデータ型には、型宣言文字が割り当てられています。

型宣言文字 変数の型
% Integer(整数型)
& Long(長整数型)
$ String(文字列型)
! Single(単精度浮動小数点型)
# Double(倍精度浮動小数点型)
@ Currency(通貨型)
^ Longlong(64ビット符号付き数値)※64ビットExcelのみ有効

詳しくは、以下を参照してください。
第13回.定数と型宣言文字(Const)|VBA入門
・Const定数の基本 ・変数でも同じ事が出来るが・・・ ・ダブルクォーテーションについて ・型宣言文字 ・Constにデータ型を指定しない場合のデータ型 ・その他の定数 ・Const変数宣言のまとめ

お気づきになりましたか、
Long(長整数型)の型宣言文字が&なのです。
従って、

変数&
123&

これらは、Long型を定義した&と解釈されてしまうという事です。
つまり、変数や数値定数の直後の&の前にはスペースが必要になるという事です。

"文字"&
この場合は、""が文字定数を表していて、その後ろに型宣言文字が来ることは無いので、
&は文字結合としてしか解釈されないということです。

普通はやらないはずですが、もしLong型定義して、それに&で結合するなら、
hoge=fuga&&piyo
このように、&を重ねればOKという事になります。
最初の&が型宣言文字として、次の&が結合文字として解釈されます。

VBA マクロ 構文エラー

まあ、さすがにこれは現実的には使う事は無いでしょう。

以上で、&の前にスペースが必要な事については理解できたのではないでしょうか。

残るは、
hoge=fuga &haa ・・・ エラー
hoge=fuga &hii ・・・ OK
この違いという事になります。

&hは16進リテラルで使われています。

基数 プレフィックス 有効桁の値
16進数 (基数 16) &H 0-9、A~F
8進数 (基数 8) &O 0-7

つまり、
&haa
これは、
変数としてhaaが宣言されていても、&が付いている事で16進リテラルとして解釈されてしまうという事です。
つまり、&haaは&HAA(10進の170)になってしまうという事です。
しかし、
&hii
これはiiが16進数の範囲ではないので、&が付いていても16進リテラルとしては解釈されないという事です。

同様に、
&o
の後ろに、0-7が続いている場合は8進リテラルとして解釈されてしまいますので、
&o77はエラーになりますが、&o88はエラーになりません。

&の他では^(キャレット)でも同様の事がありえます

^(キャレット)は、べき乗の算術演算子です。
2^3、これは8ですね。

そしてさらに、
^(キャレット)はLongLong型の型定義文字としても使われています。
LongLong型なので、64ビット版Excelだけで使われています。
32版Excelでは、LongLong型そのものが存在しないので、型定義文字として^(キャレット)は使われません。

64ビット版Excelで、
hoge=huga^0.5
これでEnterすると、

VBA マクロ 構文エラー

このようにエラーとなります。
huga^
これがLongLong型として解釈されてしまう為です。

しかし、32版Excelでは、エラーにはならず、

VBA マクロ 構文エラー

^(キャレット)の前後にスペースが自動で挿入されます。
32版では、^(キャレット)は型宣言文字として認識しないので、べき乗としてしか認識されません。
つまり、
64ビット版Excelでは、&同様に、
^(キャレット)の前にはスペースを入力する必要があるという事になります。

最後に

VBAの言語仕様なので、どうして?と考えても仕方ない事も多々ありますが、
構文エラーになる場合は、それなりの理由があります。

特にこれらの理由について知らなくても、
&の前後はスペースを入力すると覚えて、指がそれに慣れていれば問題ない事ではあります。

しかし、
たまには手を止めて、ちょっと寄り道してみるのもVBAの良い勉強になるのではないでしょうか。



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

VBAを定型文で覚えよう
VBAこれだけは覚えておきたい必須基本例文10
エクセルVBAでのシート指定方法
文字列結合&でコンパイルエラーになる理由
手動計算時の注意点と再計算方法
VBAの用語について:ステートメントとは
オブジェクト変数とは何か
VBAの小数以下の演算誤差について
スピルでVBAの何が変わったか
CharactersプロパティとCharactersオブジェクト
ユーザーに絶対に停止させたくない場合のVBA設定


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

AIは便利なはずなのに…「AI疲れ」が次の社会問題になる|生成AI活用研究(2026-02-16)
カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




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


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



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