Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2016)
文字列型と数値型の異なるデータ型同士でも計算出来てしまうのは何故?
投稿日時: 20/07/10 07:19:43
投稿者: かつん

お世話になります。
 
標題の通りなのですが、何故データ型が違うもの同士で計算出来てしまうのでしょうか?下記のコードのように、String型とLong型の混在する場合は、String型の変数をClngなので変換して型を数値型にしてから計算しないとエラーになるものだと思っていました。しかし、実際にはエラーになることなく出来てしまいます。
 

Sub test2()
    Dim str As String
    Dim lng As Long
    
    str = "100"
    lng = 100
    Debug.Print str + lng
    
    str = str + lng
    Debug.Print str
End Sub

計算も出来ますし、文字列型変数strに、計算結果の200(数値)を代入も出来てしまいます。内部では何が起きているのでしょうか?そもそも計算出来てしまったらダメだと思うのですが。
「そういうものだから。けど可読性が下がったりするからそういう変な使い方は辞めようね」と、割り切るものなのでしょうか?
 
何方かこの辺の事情に詳しい方いらっしゃいましたら是非解説をお願いします。

回答
投稿日時: 20/07/10 08:54:02
投稿者: simple

一言で言うと仕様ということで、そう定めたのです。
 
Excel VBAのヘルプ(*)の "+演算子" の項目に詳しい記述があります。
演算子の二つの引数の型に応じて、どう解釈し演算するか、
とても詳しく説明されています。一度ご覧になってはいかがですか?
 
# 案外、ヘルプは敬遠されがちで、読む人は少ないと思いますが、
# 一応、VBAに関する原典です。(時々、誤った記載があることがありますが)
 
(*)余談です。
・今は、ネット上のものを参照する仕組みかと思います。
・少し前は、ローカルのファイルを閲覧する方式でした。
・さらにもっと前は、冊子がExcel製品に付属していた時代もあります。
  (Excel 5.0の時には一般機能に関する電話帳のごとき冊子と、
    VBAに関する書籍が付属していました。私は、これでVBAを学びました。)

回答
投稿日時: 20/07/10 10:38:40
投稿者: Moko

最近はヘルプで探すのも一苦労ですね。
https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/plus-operator
 
> 一方の式が数値データ型で、もう一方の式が String の場合 Type mismatchエラーが発生します。
 
ということですが。
 
まあよくあること。
 
Sub test3()
    Dim str As String
    Dim lng As Long
     
    str = "100"
    lng = 100
    Debug.Print str + lng
    Debug.Print str + str + lng
    Debug.Print lng + str + str
End Sub
 
演算の優先順位は要注意です。
Clng で明示的に変換するのが紛れがなくてよろしいかと。
 

回答
投稿日時: 20/07/10 11:13:29
投稿者: WinArrow
投稿者のウェブサイトに移動

比較も大きな意味で
>計算
の範疇に入ります。
 
原理的には、引き算して、結果で判定すると聞いたことがあります。
 
四則演算では、問題になく計算できても、
比較では、エラーになることがあるので、要注意です。
 
 

回答
投稿日時: 20/07/10 11:42:08
投稿者: simple

あらら、ヘルプ内容と現実が違いますねえ。しまったなあ。
割とあるん(*)ですが、マイクロソフトに聞かないとわからないですね。
まあ、「ヘルプの書き方が不十分でした」ということになるんだろうけど。
結果そのものは、割とリーズナブルな方向への修正だと個人的には思います。
(私見を尋ねられているのではないけど。)
 
(*) 有名な例だと、Array関数の説明。
Array 関数を使用して作成した配列のインデックスの最小値は、常に 0 です。
ほかの種類の配列とは異なり、Option Base ステートメントに最小値を指定しても影響を受けません。
→ 現実には、Option Base 1 とすると、インデックスの最小値は1となります。

投稿日時: 20/07/11 06:26:16
投稿者: かつん

こんなに多くの方にご回答いただきありがとうございます。
 
「暗黙の型変換」なるものが働いているのですね。そして詳細は、教えていただいたヘルプに記載されているルールに従って演算がなされる。
 
Mokoさん
ヘルプのリンクを貼っていただきありがとうございます。ヘルプの場所が分からず困ってました笑
そして、コードもありがとうございます。ヘルプの内容がよく間違っているというのは驚きでした。こんなややこしい内容で、誤りがあるとますます混乱を招きそうですよね。よくある話であれば、こうやってコードを記述して確かめたり、有識者に聞くしかないですね。
 
質問内容である「文字列型と数値型の異なるデータ型同士でも計算出来てしまうのは何故?」の回答は、simpleさんが仰る「一言で言うと仕様ということで、そう定めたのです。」になりますね。
当初の目的である、「何故?」の部分は解消出来たので閉めたいと思います。
ありがとうございました。