VBAで割り算を行う方法について

このQ&Aのポイント
  • VBAを使って割り算を行う際、整数しか使えないMOD関数や整数専用の割り算記号である¥関数を使用するため、小数点以下の割り算ができない問題があります。
  • この問題を解決する方法として、「割られる数 - (割られる数 ¥ 割る数) * 割る数)」の計算式を使用することが考えられます。しかし、この方法も整数しか使えないため、小数点以下については対応できません。
  • 現在のところ、VBAで小数点以下の割り算を行うためには、FOR文を使用して何度も「割られる数-割る数」を繰り返し計算し、マイナス値が出た時点で終了するという方法が最も適していると言えます。
回答を見る
  • ベストアンサー

たびたびすいません。VBAです。

たびたびすいません。VBAです。 EXCEL2002の、SP-2です。 さきほど、MOD 関数で、0.5で割ると「0除算」エラーが出ると質問して、「MODは整数しか使えない」と回答を頂ました。 なので、 「割られる数 - (割られる数 ¥ 割る数) * 割る数)」 とすればあまりが戻ってくると思ったのですが、「¥」関数も整数しか使えないみたいです。 「/」だとあまりが出ない為(完全に割り切ってしまう為)使えません。 ・小数点以下の入力を制限して、「*1000」をする ・FOR文で、ひたすら「割られる数-割る数」をして、マイナス値になったらそこで判定 しかないのでしょうか・・・ もしいい方法があったら宜しくお願いします

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

  • ベストアンサー
回答No.2

割り算して、整数値で切り捨てたら? WorksheetFunction.RoundDown( 3.5 / (0.0005) , 0)

kapibaraPG
質問者

お礼

回答ありがとうございます 切り捨てた数値は割り算の商と同じ値でしたね; 目から鱗です・・・ 散々騒がせておいてすいません、この方法を使わせていただきます

その他の回答 (4)

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.5

訂正です Dim x As Double, mx As Double Dim y As Double, my As Double Dim m_str As String x = 1 y = 0.4 m_str = CStr(y) p = Len(m_str) - InStrRev(m_str, ".") mx = 10 ^ p * x my = 10 ^ p * y Debug.Print (mx Mod my) / 10 ^ p

kapibaraPG
質問者

お礼

回答、ありがとうございます この方法なら小数点以下がいくつあっても平気ですね 質問で、具体的なやりたいことを書かなくてすいません; あまりがあるか知りたいだけなので、下の方法を取らせていただきます 別ですが、「InStrRev」という関数初めて知りました これがあれば、ファイルパスの取得が楽になりそうです(今まで左から「¥」を探すという方法を使っていたので) 本当に参考になりましたありがとうございます!

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.4

Dim x As Integer, mx As Integer Dim y As Double, my As Double Dim m_str As String x = 1 y = 0.4 m_str = CStr(y) p = InStrRev(m_str, ".") - 1 mx = 10 ^ p * x my = 10 ^ p * y Debug.Print (mx Mod my) / 10 ^ p とかいかがでしょう

回答No.3

ちょっとやってみたら、 ・割り算 ・切捨て でDouble型にキャストされるために、誤差が出やすいみたいですね。 VBAならCurrency型にこまめに入れてあげると、誤差が出ずらいです。 うーむ。。。微妙だが。。。 サンプルです。 関数名:modもどき '標準モジュールにこれを張る Function modもどき(in割られる方 As Currency, in割る方 As Currency) As Variant Dim l_sng商 As Single l_sng商 = in割られる方 / (in割る方) Dim l_lng商切捨て As Long l_lng商切捨て = WorksheetFunction.RoundDown(l_sng商, 0) Dim l_curWk As Currency l_curWk = l_lng商切捨て * in割る方 modもどき = in割られる方 - l_curWk End Function ↓これをA2のセルに張る =もどき(A1,B1) A1とB1に値を入れる 以上

kapibaraPG
質問者

お礼

色々試していただいてありがとうございます 私の知らないデータ型や、関数(WorkSheet.Functionとか知らなかった)が色々勉強できて参考になりました

  • wkbqp833
  • ベストアンサー率36% (319/886)
回答No.1

まず、具体的に何がしたいのですか?  これでは、説明できません きちんと説明してくれれば、回答しますよ

kapibaraPG
質問者

お礼

補足をしているうちに、自分が知りたかったのはあまりがあるかを調べるだけだと気づきました どんどん丸め誤差に執着してしまって、やりたかった事とだんだん離れていってしまってました; ありがとうございます

kapibaraPG
質問者

補足

もうしわけありません ある数 「A」と「B」があり、AがB刻みであるかを調べるプログラムを作っています Aが3.5、Bが0.5の場合 3.5 / 0.5のあまりが0なので、B刻み、 Aが4.3、Bが0.4の場合 4.3 / 0.4のあまりが10あまり3なのでB刻みではない という風に作りたいと思っていました なので、あまりを求める「MOD」を使おうと思ったら、MOD関数は小数点を丸めてしまうということが前回の質問で分かりました なので、「A - (A ¥ B) * B」で求めようと思ったら、¥も小数点を丸めてしまうという問題があって使えなくなってしまいました それで、質問にある「制限をつける」か「FOR文でまわす」を思いついたのですが、制限はあまりつけたくないし「FOR文でまわす」は時間がかかってしまいそうだったので質問させていただきました

関連するQ&A

  • VBAについて質問です

    VBAについて質問です EXCEL2002、SP-2 を使用しています 以下のプログラムで、「0で除算しました」というエラーが出てしまいます strwarareru = 3.5 dblwaru = 0.0005 if (cdbl(strwarareru) mod dblwaru <> 0) then msgbox("割り切れない") else msgbox("割り切れる") end if dblwaru は、小数点以下が何桁になるかわからないので「* 1000」等もできません 「cdbl(strwarareru) mod dblwaru <> cdbl(0)」とやっても同じエラーが出てしまいます すいませんが、エラーにならずにきちんと処理できる方法をお願いします

  • VBAで入力数値について

    Excel VBAでTextBoxに入力された数値が整数か小数か判定し、 小数の場合は、下記のようにしたいのですが、どのようにしたらよいのでしょうか。 TextBoxに入力された数値が、 (1)整数の場合・・・A=TextBox1.Value (2)小数点第一位の場合(1.5など)・・・A=TextBox1.Value*10 (3)小数点第二位の場合(1.55など)・・・A=TextBox1.Value*100 どなたかご教授願います。

  • エクセル関数を教えて下さい。

    ROUND関数で除算して、小数点以下を四捨五入させたセル(ROUND(A1/1.05、1))を合計する際、ROUND関数で求めた画面上の整数の合計をさせる関数を教えて下さい。SUM関数を使用すると、除算した小数点以下の数字にて集計されます。

  • 浮動小数点をXの倍数(整数)に丸める方法

    浮動小数点数Fを、Fにより近いX(整数)の倍数(整数)に丸める方法を教えてください。 自分なりにコード化しましたが、イマイチ美しくないです^^; もっとスッキリした方法があれば教えてください。 よろしくお願いします。 ※Fは正の浮動小数点数に限定します。 long L, mod ; L = (long)F ; //キャストして小数点以下を切り捨てて整数化 mod = L%X ; //Xで除算して余りを求める if ( mod ==0 ) { //既にXの倍数なので何もしない ; } else if ( mod <= X/2 ) { //余りがX/2より等しいか小さい時 L -= mod ; //余りを減算する } else { //mod > X/2の時 L += X-mod ; //Xに満たない分を加算 }

  • 書式とかラウンド関数で表示された数字で計算したい

    セルの表示形式で、マイナスは0で表示される設定がされていたり、rounddown関数で小数点切り捨てられた数字が表示されています。 そこに表示されている数字をそのまま使って合計したりしたいのですが、小数点やマイナスが反映されてしまいねらった計算ができません。 あくまで表示されている数字で計算したいのですが、どうすればうまくいくでしょうか? あと、あまりを求めるmod関数についてですが、小数点以下も表示されるのはなんででしょうか?mod関数は余りを求める関数と理解しているので、正数にしかならないと思うのですが・・・ お答え宜しくお願いします。

  • VBA小数点以下3桁設定の判定方法を教えてください

    Excel Vbaで小数点以下3桁の設定がされているか判断する方法を教えてください。 小数点以下3桁の設定がされているのか知りたくて、対象セルの NumberFormat の値を「0.000」か「0.000_」で比較してもうまくいかない場合があります。その値が小数点以下ちょうど3桁の有限小数の場合は小数点以下3桁の設定をしても、NumberFormat の値は「General」のままであるのがその理由みたいです(?)。「General」を比較の値に採用しても3桁であるかの情報が得られそうにないと思えるので困っています。小数点以下3桁の有限小数であるかの判定方法を別途用意するしかないのでしょうか。その場合は、簡単で正確な判定方法を教えてください。ちなみに小数は8桁以内の整数と8桁以内の整数の商(割り算)になります。 よろしくお願いします。

  • VB6 丸めるとは?

    VB6で、 Mod演算子のMSDNヘルプを見てみると、 「演算結果は整数に丸められる」 とあります。 例として19 Mod 6.6は5.8ですが5になってしまいます。 また、CInt関数について同じくヘルプで調べてみると、 「少数部分は丸められます」 とあり、CInt(5.8)とすると6となってしまいます。 質問なのですが、 「丸める」と一口にいっても、四捨五入したり、切り捨てたりといろいろあるのだという認識であっているでしょうか? CIntなら小数部は四捨五入され、Modならいかなる数字であろうと小数部は切り捨てられる、ということでよいでしょうか?

  • VBAの変数変換のことです

    VBAの変数変換のことです 整数変数=実数変数や実数変数=整数変数でCIntやCSng関数を使わないでOKでしょうか? Dim VAR(20) As Single '単精度浮動小数点数型 (Single) Dim IVARO(20) As Integer '整数型 (Integer) Dim IVAROC(20) As Integer '整数型 (Integer) IVARO(NCD) = VAR(NCD) 'Single to Integer IVAROC(NCD) = CInt(VAR(NCD)) 'Single to Integer これで、IVARO(NCD)とIVAROC(NCD)には同じ値が入っているのですが、 整数=実数でCInt関数を使わないで整数にする構文はOKでしょうか?

  • 0除算を判定したい

    0除算とは例えば10を0で割ったら結果が無限大になるように、ある数を0で割った時に起こる現象です。 しばしばこの0除算に悩まされるので、ある式を代入したらそれが0除算であるかどうかを判定できたらと思いました。 そこで下のような関数を作れたらと思っているのですが、 ある式を見てその結果が0除算であるかを判定する方法はありますでしょうか? int isDivide0( float val ) {   if ( val == 0除算 )     return 1;   else     return 0; } int main() {   isDivide0( 10 / 0 ); } 尚、開発環境はVisual Studio2005です。

  • (-10)÷7=-2…4 であってますか?

    除法の定義?は、 整数 m を n で割ったとき、商が q で余りが r であるとは m= qn + r かつ 0 ≦ r < n  が満たされること。 また、この等式が成り立つことを除算記号 ÷ と記号 … を用いて m ÷ n = q … r とあらわす。 とありました。 (-10)÷ 7 =を考えたとき、 除法の定義から、m = qn + r かつ 0 ≦ r < n m=-10、n=7であるから -10=7q+r を満たす qとrは、 q=-1、r=-3  と q=-2、r=4   であるが、 0≦r<n を満たすのは、 q=-2、r=4 となる。 すなわち、商=-2、剰余=4 (-10)÷7=-2…4  この考え方は正しいのでしょうか? EXCELで計算したとき、QUOTIENT関数とMOD関数で商と余りを求めると、         商   剰余 (-10)÷ 7  =-1 …  4   ← -2…4では?  10 ÷(-7) =-1 … -4   ← -1…3では? (-10)÷(-7) = 1 … -3   ←  2…4では? と全くトボケた結果が出てしまったんで、よく解らなくなってきました。 MOD関数には、剰余は、被除数と同じ符号となるという記述はありましたが。 QUOTIENT関数には、被除数の制限は書いてないようです。エラーにもならず。 納得できる回答ありますか? 暇なときでもよろしくお願いします。