VBAの「+演算子」の挙動が怖すぎる

VBAで文字列と数値に「+演算子」を使用すると、他言語では見られない独特の挙動を示します。 本まとめは、Twitterで不定期で行われている #VBAクイズ@KotorinChunChun が出題した問題のまとめです。
42
リンク えくせるちゅんちゅん えくせるちゅんちゅん ことりがエクセルをちゅんちゅんするブログ 3 users

出題

ちゅん🐤 @KotorinChunChun

#VBAクイズ Debug.Print "1" + "2" Debug.Print "1" + 2 Debug.Print 1 + "2" Debug.Print -"1" + "2" 上から答えは?

2020-01-24 09:46:42
ちゅん🐤 @KotorinChunChun

良い感じの割れ具合。 正直に言うと私も間違えたtwitter.com/kotorinchunchu…

2020-01-24 12:25:08
ちゅん🐤 @KotorinChunChun

見事に割れているので、もし宜しければ、 ・どれを選んだのか ・何を根拠に選択したのか 意見が聞きたい。

2020-01-24 14:17:40

Togetter読者の皆様へ

興味のある方は、自分の答えを出してからこの先をお読みいただくと、より勉強になります。

皆の解答

FukuCyndi papa @FukucyndiP

実際に確かめちゃいましたけど、勉強になりました! あ。投票はしてないです┏○ペコ twitter.com/kotorinchunchu…

2020-01-24 19:41:17
VBA100本ノックとエクセル問題 @yamaoka_ss

@KotorinChunChun これ面白い、というか、良い問題だと思う。 悩む人多い気がしますね。 選択肢なかったら、私もちょっと悩む気がする。

2020-01-24 13:05:03
ほえほえ@スプシマン @hoehoe1234

@KotorinChunChun これ、最難関www。ワイも多分、まちがえてるとおもう。。。左型優先変換か型の広さ優先変換かまったくわからんwww。

2020-01-24 12:49:21
シンノユウキ @shinno1993

ヤバイ。全然わかんない。 最初の以外は全部エラーになるんじゃね?って思ったくらい。 なんとなくで一番上を選択。文字列の結合には&を使いたい派です。 twitter.com/KotorinChunChu…

2020-01-24 18:17:00
Taichi AOKI @aoki_taichi

そもそも文字列に&以外の演算子が使えるとは知らなかった。 どういう仕組みなんだろう?演算子が+-*/^のときは、被演算子にCDblでも働かせることになっているのかな? 自作のクラスに対しても、そういう演算子オーバーロードのようなことができるなら、面白そう。 twitter.com/kotorinchunchu…

2020-01-24 18:41:15
W.D. @WD4096

@KotorinChunChun 帰宅後確認しますけど、演算順序が最初のパラメーターの型で演算が開始されると思うのです。 で、残りのパラメーターは暗黙の型変換される理解。

2020-01-24 16:31:44
W.D. @WD4096

@KotorinChunChun 間違っていて凄くびっくり。 ううむ。わかりにくい仕様ですね。 これは気を付けないと。

2020-01-24 17:47:02
サモイタ@VBAって凄すぎ @biitarou

①が文字列と文字列の結合なのはわかる。 あとは、全部エラー。 と思ったら選択肢がない。。。 twitter.com/KotorinChunChu…

2020-01-24 18:57:54
とりにくVBA @jbaske_032j

@KotorinChunChun 1は文字列結合 2、3は数値に変換されて演算 4は想像もつかなかったけど、選択肢で4番目を回答しました。

2020-01-24 20:04:14
としじ @toshi81350036

うひゃー、最後のやつ見て4番にしたけど…後で確かめてみよう。ま、こんなコード書かないに越したことはないけどねw。この辺りが暗黙変換の落とし穴だよなあ。 twitter.com/KotorinChunChu…

2020-01-24 21:04:47
うなぎ犬 @porineshia1

あまり自信はありませんが、 1.文字列同士の結合なので、+は&と同じ 2と3. 片方が数値だと、数値と判断できる文字列は自動型変換され、計算される 4.よく分かりませんが、文字列にマイナスはないため、数値とみなされた。あとは2と3と同様。 twitter.com/KotorinChunChu…

2020-01-24 21:06:31

答え合わせ

ちゅん🐤 @KotorinChunChun

それでは、解答です。 正解は4番目の「12 3 3 1」です! まず、今回の出題では、敢えて "1" + "2" の答えを全て 12 にして、「プラス演算子でも「&」のように文字列の連結がされるんだよ」とアピールさせてもらいました。 その上で「じゃあ数値と文字列の場合はどうなるの?」を問いました。 pic.twitter.com/e7LFgoxuaI

2020-01-24 23:55:58
拡大
ちゅん🐤 @KotorinChunChun

> "1" + 2 と > 1 + "2" は、普通、以下の3パターンが考えられますが ・エラーになる ・左辺の型に合わせる ・両辺の幅広い表現に対応できる型に合わせる VBAは ・(何故か)数値に揃えて加算する という動きをするようです。

2020-01-25 00:11:52
ちゅん🐤 @KotorinChunChun

また、 > "a"+1 や > 1+"a" は、「型が一致しません。」というエラーになります。 両辺が文字列の場合のみ「+」演算子は「&」演算子の代替として機能するような感じです。

2020-01-25 00:17:58
ちゅん🐤 @KotorinChunChun

従って、「+」演算子が登場したときは、両辺の値を数値型に暗黙的にキャストが行われてから、計算が行われる仕様なのだろうと私は推測しました。 もっと詳しい検証は、ほえほえさんがしてくれました。 twitter.com/hoehoe1234/sta…

2020-01-25 00:20:23
ほえほえ@DX塾(パワクM式手組み推し) @hoehoe1234

すんません。外出するんで、ちゅんさんの問題のワイなりの推測をおいていきます。エラーケースはいれていませんが1 + "A"などは実行時エラーとなります。一旦CDblで変換して演算されると覚えると覚えやすいかもですね。(双方文字列型かつ+演算子は特例ですね。この特例は良くないかもですw)。 pic.twitter.com/Y2ox52i7E5

2020-01-24 15:14:59