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 ・・・新着記事一覧を見る

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)
スピらない スピル数式 スピらせる|エクセル雑感(2023-12-06)


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

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」をお願いいたします。
本文下部へ