Sub Sample() Dim buf1 As String, buf2 As String buf1 = InputBox("数値1を入力してください。") '100を入力 buf2 = InputBox("数値2を入力してください。") '200を入力 MsgBox buf1 + buf2 End Sub
Sub hoge()
Dim s1 As String
Dim s2 As String
s1 = 1
s2 = 2
Debug.Print s1 + s2
Debug.Print CInt(s1) + s2
Debug.Print s1 + CInt(s2)
End Sub
Sub Sample()
Dim buf1 As String, buf2 As String
buf1 = InputBox("数値1を入力してください。") '100を入力
buf2 = InputBox("数値2を入力してください。") '200を入力
MsgBox buf1 + buf2
MsgBox CInt(buf1) + buf2
MsgBox buf1 + CInt(buf2)
End Sub
受講生さんの投稿
(投稿ID: 801)
"Long型の変数に文字列は代入できないが、String型の変数に数値を代入してもエラーにはならない。
ただし、文字列であるため計算はできない。"
という解釈でよろしいでしょうか?
小川 慶一さんのコメント
(コメントID: 1703)
もしまだでしたら、テスト用のサンプルをいろいろ作って試してみてください。
デキる方には、そのほうがよいかと。
それでしっくりこないことがあればまた質問してください。
仮説は、以下の3つということですか。
[1] Long型の変数に文字列は代入できない
[2] String型の変数に数値を代入してもエラーにはならない
[3] [2]のとき使った変数は数値計算には使えない
受講生さんのコメント
(コメントID: 1717)
最初に質問する前に、試してみたコードは以下のものでした。
Sub Sample()
Dim buf1 As String, buf2 As String
buf1 = InputBox("数値1を入力してください。") '100を入力
buf2 = InputBox("数値2を入力してください。") '200を入力
MsgBox buf1 + buf2
End Sub
この例ですと「100200」となり、計算はできないのかと思ったのですが、
"+"以外の演算子の場合は、うまく計算できるようです。
最初に例外っぽいものに当たってしまった運の悪さもありますが、検証不足だったかもしれません。
小川 慶一さんのコメント
(コメントID: 1720)
いただいたサンプルを見て、僕もちょっと試してみました。
左右両辺とも文字列型のときのみ、「 + 」演算子が「 & 」と同様に文字列結合をするみたいですね。
そんなことしたこともなかったので、僕も勉強になりました。
最も、実務で文字列型のもの同士を加算演算子で加算しようとするマクロを書く段階でもちょっと心配ですが、さらにテストもしないで結果に疑いを持たないようだったら別の意味でヤバいですね (^^;
くうちゃんさんのコメント
(コメントID: 7376)
文字列を+で結合できるのは、Lotusの式ではこう書くからです。
(昔の人しか知らないと思いますが、Lotus123というExcelより人気だったソフトがあり、互換性を狙った機能がたまにExcelに残っています。)
小川 慶一さんのコメント
(コメントID: 7379)
なお、たとえば JavaScript では、 1 + 0 と 1 + "0" の結果が異なったりします。VBで学んだことが他所でもそのまま通じるということはないので注意しましょう。
JS
くうちゃんさんのコメント
(コメントID: 7380)
言語によって、文字列と数値の扱いが変わるのですか。複数の言語を覚えるとどっちがどっちのことだったか混乱しそうです。テストが大事ですね。
Excelの正攻法でない機能のルールを見つけようとする方もいらっしゃるのが面白かったです。
小川 慶一さんのコメント
(コメントID: 7381)
> 言語によって、文字列と数値の扱いが変わるのですか。
ですね。
複数言語を使っていると、ときどき取りまちがえをしそうになります。
とはいえ、さらに複数の言語を学ぶと、言語ごとの仕様の違いのありそうなところについての勘も養われるので、主要なハマりどころには自然に気づくようにもなります。
> 正攻法でない機能のルールを見つけようとする方もいらっしゃるのが面白かったです。
いろいろありますね。
そういう工夫をした経験も、あとあと腕力で問題解決しなくてはならなくなった場合のためのよい財産になります。言語仕様について学びが深まるという点でも良いですね。