エクセルで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

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

A 回答 (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
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/02/08 20:52

毎回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回までしか連続でできません。わがまま言ってすみませんが
助けてください。

補足日時:2002/02/08 10:04
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング

おすすめ情報