« かつやで鶏ガパオダブルチキンカツ丼+とん汁(小)をいただく。非常に味が濃い! | トップページ | ax²+bx+c=0の複素解(a,b,c=-25~25)を描くと結構面白い。Pythonで描いてみた。 »

2021年7月29日 (木)

Excel VBAで、関数は参照渡し(ByRef)にデフォルトでなっているが、その引数を型キャストして呼び出すと変更されない、ということに気付かなくてバグって半日潰した!

かなり昔に作ったExcel VBAの数値計算プログラムの中の関数を別のプログラムで使いたい、と言われその部分だけ抜き出そうとした。

ああ、1時間もあればできるよ、と言ったのに半日以上かかった。どこでハマっていたかというと、、、

昔のプログラムは整数にIntegerを使っていたが、別のプログラムはLongでそのまま使うと

例の「コンパイルエラー:ByRef引数の型が一致しません」がでる。

Byref_cast02

あ、もちろん最初に

Option Explicit

をつけてますよ、、、というか、数値計算のプログラムなんで意図しない変換を避けるために

これは必須。(fortranで言うところのimplicit none)

で通常動作はこれ。

Byref_cast01

デフォルトでVBAは参照渡し(ByRef)になっているので、関数内で変数を変換すると呼び出した側も変わる。

これを防ぐには値渡し(ByVal)にすればいいが、今回はByRefで変数が変換されるような仕様にしていた。

で、呼び出し側の変数をLongにしてCIntで型変換したら、、、

Byref_cast03

あれ?参照渡しなのに変換されてない、、、

というところでハマりました。言われてみれば型が違うのに参照渡しするのは変、、、ならエラーを出してほしかったり。

皆さんもしょーもないところでハマることがあるので

気を付けて。

« かつやで鶏ガパオダブルチキンカツ丼+とん汁(小)をいただく。非常に味が濃い! | トップページ | ax²+bx+c=0の複素解(a,b,c=-25~25)を描くと結構面白い。Pythonで描いてみた。 »

日記・コラム・つぶやき」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« かつやで鶏ガパオダブルチキンカツ丼+とん汁(小)をいただく。非常に味が濃い! | トップページ | ax²+bx+c=0の複素解(a,b,c=-25~25)を描くと結構面白い。Pythonで描いてみた。 »

最近の記事

最近のコメント

2022年12月
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
フォト
無料ブログはココログ