変数を立て続けに宣言した場合と、1行ずつ宣言した時で、型が異なるらしい。
参照渡しを用いて、再帰的に処理を進める関数を作っていて、
型が違うエラーが出て、はまった対応のメモ。
' 関数funcを参照渡しから値渡しにすると動くが、なぜかこのコードは動かない。 Sub ボタン2_Click() Dim val1, val2 As Integer Dim str As String val1 = 10 val2 = 20 str = "こんにちは" Call func(val1, val2, str) MsgBox ("val1=" & val1 & "val2=" & val2 & "str=" & str) End Sub Sub func(ByRef val1 As Integer, ByRef val2 As Integer, ByRef str As String) val1 = 100 val2 = 200 str = "こんばんは" End Sub
このコードを実行すると、以下のダイアログが出力されて実行できない。
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
エディタ上は、funcのval1が反転して止まってしまう。
不思議なことに参照渡しを値渡しに変えると普通に実行される。
なんで?何が違うんだ?とはまりました。
そして、次のように、変えたら動きました。
'参照渡しでもうごくコード。 Sub ボタン2_Click() Dim val1 As Integer Dim val2 As Integer Dim str As String val1 = 10 val2 = 20 str = "こんにちは" Call func(val1, val2, str) MsgBox ("val1=" & val1 & "val2=" & val2 & "str=" & str) End Sub Sub func(ByRef val1 As Integer, ByRef val2 As Integer, ByRef str As String) val1 = 100 val2 = 200 str = "こんばんは" End Sub
ウィッチで確認できないから*1、
推測だけど、
Dim val1, val2 As Integer
と、
Dim val1 As Integer Dim val2 As Integer
では型が違うのか?横並びのときは、左から読んだときに、変数の続きがあって、
まだ確定できないからobject型になるとか?
でもIntegerをObjectに変えたところで結果は同じだった。
解せないが、こういう仕様という事で理解しないとダメなのか。