• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルVBAで上手く動きません。)

エクセルVBAで上手く動かない?助けて下さい

このQ&Aのポイント
  • エクセルでVBAを使ってユーザー関数を作成しましたが、正常に動作しません。
  • 作成した関数は、INT関数を複数回連続で実行するものであり、特定の値が正しく計算されません。
  • 詳細なプログラムコードから問題箇所を見つけることが困難であり、アドバイスを求めています。

質問者が選んだベストアンサー

  • ベストアンサー
  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.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

kasaeru
質問者

お礼

親切にありがとうございます。が、残念ながらエクセル95なので Round関数が使えませんでした。(Roundは2000からみたいです) しかし、ご指摘のおかげで一度値を1000倍して、最後に1000分の1 する事で解決(?)できました。アリガト チュッ!(男です)

その他の回答 (1)

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.1

毎回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

kasaeru
質問者

補足

すみません。質問の説明が不足でした。 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回までしか連続でできません。わがまま言ってすみませんが 助けてください。

関連するQ&A