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入門
前回は変数を説明しましたが、変数があれば、当然の定数もあり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技術解説」の記事

複雑な条件(複数除外等)のオートフィルター(AutoFilter)
クリップボードを使わないセルのCopy
Rangeの使い方:最終行まで選択を例に
フルパスをディレクトリ、ファイル名、拡張子に分ける
Colorプロパティの設定値一覧
VBAを定型文で覚えよう
VBAこれだけは覚えておきたい必須基本例文10
エクセルVBAでのシート指定方法
文字列結合&でコンパイルエラーになる理由
手動計算時の注意点と再計算方法
VBAの用語について:ステートメントとは


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

SQL関数と演算子|SQL入門(12月1日)
データの取得:集約集計、並べ替え(DISTINKT,GROUP BY,ORDER BY)|SQL入門(11月30日)
データの取得:条件指定(SELECT,WHERE)|SQL入門(11月29日)
データの挿入:バルクインサート|SQL入門(11月28日)
データの挿入(INSERT)と全削除|SQL入門(11月26日)
テーブル名変更と列追加(ALTER TABLE)とテーブル自動作成|SQL入門(11月25日)
テーブルの作成/削除(CREATE TABLE,DROP TABLE)|SQL入門(11月24日)
データベースに接続/切断|SQL入門(11月23日)
SQLiteのインストール|SQL入門(11月22日)
SQL入門:VBAでデータベースを使う|エクセルの神髄(11月22日)


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

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



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

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


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



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