- ベストアンサー
エクセルVBAで上手く動かない?助けて下さい
- エクセルでVBAを使ってユーザー関数を作成しましたが、正常に動作しません。
- 作成した関数は、INT関数を複数回連続で実行するものであり、特定の値が正しく計算されません。
- 詳細なプログラムコードから問題箇所を見つけることが困難であり、アドバイスを求めています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
なるほどわかりました。毎回切捨てなのですね。 ならばプログラミング的にはOKです。 なぜ58799になるかというと、Optdata2はDoubleの型を持つためにおきたものではないかと思います。 >MULTINT2 * Optdata2(i) 部分では、画面のデバッグ上では欲しい値になっているのですが、PCのメモリ内部では 58799.99999999999・・・ という値になったために、切り捨て直後の値は58800にならないものと思われます。 はっきり言ってINTのバグと言ってもいいですね。 なので、別の切り捨て関数を使用しましょう。 Function MULTINT(sdata1 As Single, ParamArray Optdata2()) As Long Dim i As Integer Dim lngWork As Long lngWork = Round(sdata1) For i = LBound(Optdata2) To UBound(Optdata2) lngWork = Round(lngWork * CSng(Optdata2(i))) Next i MULTINT = CLng(lngWork) End Function
その他の回答 (1)
- TAGOSAKU7
- ベストアンサー率65% (276/422)
毎回INTをしない方が良いのでは? 返し値はLongなので、きちんとLongで返してあげましょう。 Function MULTINT(sdata1 As Single, ParamArray Optdata2()) As Long Dim i As Integer Dim sngWork As Single sngWork = sdata1 For i = LBound(Optdata2) To UBound(Optdata2) sngWork = (sngWork * Optdata2(i)) Next i MULTINT = CLng(sngWork) End Function
補足
すみません。質問の説明が不足でした。 A,B,C,D,E・・・・という不特定複数の 数値を掛け合わせて、「掛けるたびに切り捨て」というものが 作りたいのです。INTで説明すると =INT(INT(INT(INT(A*B)*C)*D)*E・・・) というものです。例えば MULTINT(2.5,2.5,2.5,2.5)=37 となってほしいのです。 INTでやると、7回までしか連続でできません。わがまま言ってすみませんが 助けてください。
お礼
親切にありがとうございます。が、残念ながらエクセル95なので Round関数が使えませんでした。(Roundは2000からみたいです) しかし、ご指摘のおかげで一度値を1000倍して、最後に1000分の1 する事で解決(?)できました。アリガト チュッ!(男です)