OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

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

  • 困ってます
  • 質問No.213911
  • 閲覧数70
  • ありがとう数1
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 27% (3/11)

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

となってしまいます。どこがいけないのでしょうか?
困っています。助けて下さい。
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.2
レベル12

ベストアンサー率 65% (276/422)

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

お礼率 27% (3/11)

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

その他の回答 (全1件)

  • 回答No.1
レベル12

ベストアンサー率 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 = L ...続きを読む
毎回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

お礼率 27% (3/11)

すみません。質問の説明が不足でした。
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
このQ&Aのテーマ
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ