みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセルVBAで上手く動きません。

エクセルでVBAをつかって、ユーザー関数を作ったのですが、
うまく動きません。助けて下さい。
内容はINT関数が7回までしか連乗できないので、
何回でも掛けて切り捨てる関数を作りましたが・・・
プログラムは以下の通りです

Function MULTINT(sdata1 As Single, ParamArray Optdata2()) As Long
Dim i As Integer

MULTINT = sdata1

For i = 0 To UBound(Optdata2())
MULTINT = Int(MULTINT * Optdata2(i))
Next i

End Function

本来は、

MULTINT(84000,0.7)=58800

となって欲しいのですが、

MULTINT(84000,0.7)=58799

となってしまいます。どこがいけないのでしょうか?
困っています。助けて下さい。

投稿日時 - 2002-02-08 08:17:50

QNo.213911

困ってます

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

なるほどわかりました。毎回切捨てなのですね。
ならばプログラミング的には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

投稿日時 - 2002-02-08 11:29:29

お礼

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

投稿日時 - 2002-02-08 20:52:32

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.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

投稿日時 - 2002-02-08 09:48:42

補足

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

投稿日時 - 2002-02-08 10:04:14

あなたにオススメの質問