文字列結合&でコンパイルエラーになる理由
マクロVBAでは、&(アンパサンド)記号で文字列結合を行う事は頻繁に行われますよね。
VBEで&を記述するとき、一度くらいは赤字のコンパイルエラーになったことがあるのではないでしょうか。
なぜそれがエラーになるのか、
これらを少しく詳しく見てみましょう。
&の記述がエラーになる入力とは
hoge=fuga&piyo
これでEnterすると、
VBAの学習の初期段階で、、
文字結合&(アンパサンド)の前後には、空白を入れるように教わった人も多いのではないでしょうか。
このように&の前後に空白を入れてEnterすれば、
Enterした後は、=の前後には半角スペースが自動的に挿入されます。
これは、+=*/等の四則演算でも同じです。
自動的に、前後に半角スペースが挿入されて見やすくなります。
ではなぜ、&は自動で前後に半角スペースが挿入されないのでしょうか。
これでEnterすると、
hoge=123&piyo
これでEnterすると、
それぞれ何が違うのでしょうか。
fuga
"ABC"
123
これだけの違いだけです。
hoge=huga&"ABC"
これでEnterすると、
以上のようにいろいろなパターンで入れていって、そこからわかる事は、
つまり、
文字定数("")以外の後ろに&で文字列結合するときは、&の前にスペースが必要だという事です。
&の後ろにもスペースが必要な場合が出てきます。
hoge=fuga &haa
でもでも、
hoge=fuga &hii
こうなってくると何が何やら分からなくなってきますね。
&の前後にはスペースが必要な時がある理由
これについて再確認してみましょう。
データ型 | 名称 | 格納できる範囲 |
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入門
そして、主要なデータ型には、型宣言文字が割り当てられています。
型宣言文字 | 変数の型 |
% | Integer(整数型) |
& | Long(長整数型) |
$ | String(文字列型) |
! | Single(単精度浮動小数点型) |
# | Double(倍精度浮動小数点型) |
@ | Currency(通貨型) |
^ | Longlong(64ビット符号付き数値)※64ビットExcelのみ有効 |
詳しくは、以下を参照してください。
第13回.定数と型宣言文字(Const)|VBA入門
お気づきになりましたか、
Long(長整数型)の型宣言文字が&なのです。
従って、
123&
つまり、変数や数値定数の直後の&の前にはスペースが必要になるという事です。
この場合は、""が文字定数を表していて、その後ろに型宣言文字が来ることは無いので、
&は文字結合としてしか解釈されないということです。
hoge=fuga&&piyo
このように、&を重ねればOKという事になります。
最初の&が型宣言文字として、次の&が結合文字として解釈されます。
hoge=fuga &haa ・・・ エラー
hoge=fuga &hii ・・・ OK
この違いという事になります。
基数 | プレフィックス | 有効桁の値 |
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型そのものが存在しないので、型定義文字として^(キャレット)は使われません。
hoge=huga^0.5
これでEnterすると、
huga^
これがLongLong型として解釈されてしまう為です。
32版では、^(キャレット)は型宣言文字として認識しないので、べき乗としてしか認識されません。
つまり、
64ビット版Excelでは、&同様に、
^(キャレット)の前にはスペースを入力する必要があるという事になります。
最後に
構文エラーになる場合は、それなりの理由があります。
&の前後はスペースを入力すると覚えて、指がそれに慣れていれば問題ない事ではあります。
たまには手を止めて、ちょっと寄り道してみるのもVBAの良い勉強になるのではないでしょうか。
同じテーマ「マクロVBA技術解説」の記事
VBAを定型文で覚えよう
VBAこれだけは覚えておきたい必須基本例文10
エクセルVBAでのシート指定方法
文字列結合&でコンパイルエラーになる理由
手動計算時の注意点と再計算方法
VBAの用語について:ステートメントとは
オブジェクト変数とは何か
VBAの小数以下の演算誤差について
スピルでVBAの何が変わったか
CharactersプロパティとCharactersオブジェクト
ユーザーに絶対に停止させたくない場合のVBA設定
新着記事NEW ・・・新着記事一覧を見る
TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.条件分岐(Select Case)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門
- ホーム
- マクロVBA応用編
- マクロVBA技術解説
- 文字列結合&でコンパイルエラーになる理由
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。