Sub test()
a= 35 * 3600
End Sub
このたった3行を実行すると「オーバーフローしました。」との実行時エラーになる。
aのデータ型を指定しないためかと、「Long」や「Variant」にしてみたが、結果は同じ。
酒が少々入った頭だったので、目の前の出来事がどうしても信じられない。
明日、正常な頭で再度やってみようと、その時点で諦めた。
翌朝(今日の朝)、頭が一番冴えているときに再挑戦したが、 結果は同じ。
こんなことは常識では考えられないことなので、ExcelVBAのバグと言うことで片付けようと思ったが、同じことでハマッタ人がきっといるハズと思いインターネットで検索。
やはり居ました。親切にも解決方法が書かれていました。方法は以下の通り。
Sub test()
a= 35 * CLng(3600)
End Sub
定数をキャスト/型指定せよとのこと。
ホストのアセンブラ屋としては理解できない訳ではないが、高級言語で
リテラル定数の型指定又はキャストするなんて聞いたことがない。
「ExcelVBAなんて怪しい言語だなぁ」と感じたのが正直なところ。
因みに、Accessでも同じエラーが発生するので、首尾一貫している点にやや安心した。
昨日の問題が解決したと思ったら、またまたExcelVBAでハマってしまった。
以下のコードが「ByRef 引数の型が一致しません。」とのエラーになる。
Sub test()
Dim I, J, K As Integer
I = 10
J = 20
K = testF(I, J)
End Sub
Function testF(I As Integer, J As Integer) As Integer
testF = I + J
End Function
もう面倒だから、結論を先に言う。
Dim I, J, K As Integer
なんて書き方は許さないので
Dim I As Integer
Dim J As Integer
Dim K As Integer
に、書き直しなさいと言うことらしい。
ご免なさいMicrosoft様。手抜きした私が悪うございました。
素晴らしい言語でなぁ~。
これでシステムを構築しようなんて絶対考えないようにします。
3 件のコメント:
AccessVBAにて困っていた所この記事を発見しました。
全く同じ症状が出ており無事解決できました。
本当に有難うございました!!!
同じ症状でたどり着きました。
内容を見てはたと気づいて、下記の書き方にしたら解決しました。
Dim I As Integer, J As Integer, K As Integer
面倒に変わりありませんが。
変数宣言に問題があったんですね。
ありがとうございました。
コメントを投稿