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

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
最終更新日: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入門
マクロVBA入門者が、まず最初につまずくのが、このDimで変数を宣言することでしょう。変数とは、数値や文字列など(すなわちデータ)を一時的に格納する入れ物 と良く説明されますが、まずはこの考えで良いでしょう。この入れ物には、いろいろなタイプの入れ物があります。

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

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

詳しくは、以下を参照してください。
第13回.定数と型宣言文字(Const)|VBA入門
前回は変数を説明しましたが、変数があれば、当然のように定数もあります。変数は値が変わる(変えられる)もの、定数は値が変わらない(変えられない)ものです。定数とは、数値や文字列の代わりに使用される、意味を持たせた名前のことです。

お気づきになりましたか、
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 ・・・新着記事一覧を見る

VBA100本ノック 37本目:グラフの色設定|VBA練習問題(12月1日)
VBA100本ノック 36本目:列の並べ替え|VBA練習問題(12月1日)
VBA100本ノック 35本目:条件付き書式|VBA練習問題(11月29日)
VBA100本ノック 34本目:配列の左右回転|VBA練習問題(11月28日)
VBA100本ノック 33本目:マクロ記録の改修|VBA練習問題(11月26日)
VBA100本ノック 32本目:Excel終了とテキストファイル出力|VBA練習問題(11月25日)
VBA100本ノック 31本目:入力規則|VBA練習問題(11月24日)
将棋とプログラミングについて~そこには型がある~|エクセル雑感(11月22日)
VBA100本ノック 30本目:名札作成(段組み)|VBA練習問題(11月22日)
VBA100本ノック 29本目:画像の挿入|VBA練習問題(11月21日)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.マクロって何?VBAって何?|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.とにかく書いてみよう(Sub,End Sub)|VBA入門
10.マクロはどこに書くの(VBEの起動)|VBA入門




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


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



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