変数を立て続けに宣言した場合と、1行ずつ宣言した時で、型が異なるらしい。

ysK_Tech2015-01-12

参照渡しを用いて、再帰的に処理を進める関数を作っていて、
型が違うエラーが出て、はまった対応のメモ。

' 関数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

このコードを実行すると、以下のダイアログが出力されて実行できない。

                                                    • -
Microsoft Visual Basic for Applications
                                                    • -
コンパイル エラー: ByRef 引数の型が一致しません。
                                                    • -
OK ヘルプ
                                                    • -

エディタ上は、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に変えたところで結果は同じだった。


解せないが、こういう仕様という事で理解しないとダメなのか。

*1:コンパイルできませんと出て、emptyになってしまう