2008年3月31日月曜日

ExcelVBAにハマる

Microsoftは認めないだろうが、こんなのはVBAのバグじゃないのか?

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

面倒に変わりありませんが。

Unknown さんのコメント...

変数宣言に問題があったんですね。
ありがとうございました。

ただいま作業中

2022/04/13 MySTの翻訳環境作り サイドメニューをプログラムで変換可能にすること 作業の中心場所 – jupyter notebook : g:\jupyter\python pythonをwebでも可能に – g:\webapp\Doc-tools ...