• ベストアンサー

VBAの演算について

Rubyで余りの計算をすると (-12977 % 60) + 1 =44 ちなみにVBAでは (-12977 mod 60) +1 =18 になるのはなぜでしょうか。 Rubyの方の演算のが正しいと思うのですが、 VBAはなぜ間違えた演算をしてしまうのか検証できる方はいらっしゃいませんか。

  • Ruby
  • 回答数6
  • ありがとう数1

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

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

> ただ、VBA上で処理する場合Modを使わないで算出する方法はないのでしょうか? あえて、Modを使わないのであれば、こんな感じでしょうか? あとは、自分の流儀に合わせて修正してください。 Sub test() MsgBox MyMod1(-12977, 60) + 1 End Sub Function MyMod1(dividend As Double, divisor As Double) As Double Dim result As Double If divisor = 0 Then Err.Raise 11 Exit Function End If If dividend >= 0 Then If divisor > 0 Then result = dividend - Int(dividend / divisor) * divisor Else result = dividend - Int(dividend / -divisor) * divisor End If Else If divisor > 0 Then result = dividend + Int((divisor - dividend) / divisor) * divisor If result >= divisor Then result = result - divisor End If Else result = dividend + Int(-dividend / -divisor) * -divisor End If End If MyMod1 = result End Function

その他の回答 (5)

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.5

ANo.4です。 補足への回答となりますが、 > ただ、VBA上で処理する場合Modを使わないで算出する方法はないのでしょうか? MsgBox Evaluate("=MOD(-12977,60)+1") こんな感じで、VBAでセル演算を使用する事なら出来ます。

cutisei
質問者

お礼

ありがとうございます。

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.4

回答ではなく余談になりますが、 ExcelのVBAでは -16  MsgBox (-12977 Mod 60) + 1 Excelのセル式ではRubyと同じ44 になります。  =MOD(-12977,60)+1 ExcelはVBAとセル式で同じ様に見えて考え方の違う関数があるから時々悩まされます。

cutisei
質問者

補足

そうなんですよねー。ありがとうございます。 ただ、VBA上で処理する場合Modを使わないで算出する方法はないのでしょうか?

回答No.3

なぜ「間違えた」と思えるのでしょうか? このようなことが起こる原因は、負の数の剰余が数学的に完全に定義されていないことにあります。 -4 を 3 で割った剰余は流儀により、 2(最小非負剰余) 1(絶対値の剰余) -1(絶対値最小剰余) など、いろいろなものがあるのです。 C言語では、コンパイラによって結果が違う(言語仕様上定義されていない)時代もありました。 このため、RubyやVBAの結果は、それぞれの言語の仕様で、それぞれ正しいと言えるのです。

回答No.2

私が検証した所、VBAとVBSでは"-16"になりました 検証環境:WinXP、Excel2007 ---- VBS msgbox(-12977 mod 60) + 1 ---- VBA Excel上でActiveXボタンに上記のコードを貼りつけて実行 ---- windows標準の「電卓」でもこの答えです 元の数がマイナスなので、「あまり」を出す場合には+44ではなく-16が正しいと思いますが…

回答No.1

負数の剰余について統一した定義がないからですね。 Rubyの場合は被除数と被除数より小さい除数の整数倍との差として   -12977 と 60 * -217 = -13020 の差 43 を剰余としている。 VBAでは被除数と絶対値が被除数より小さい除数の整数倍との差として  -12977 と 60 * -216 = 12960 の差 17 を剰余としているから。

関連するQ&A

  • 算術演算子について

    Javaプログラミングを勉強し始めたばかりの初心者で、極々初歩的な質問でお恥ずかしいのですが 算術演算子について、教えてください。例えば、0 % 4 を実行すると結果は、0 となります。これは余りが無いので、 0 という結果になるのだろうと思います。次いで、1 % 4 を実行すると結果は 1 と表示されます。なぜ 1 となるのですか?(計算機で計算すると0.25です。)因みに 2 % 4 は 2 となります。 何方か、わかり易くご教授頂ければ、幸いです。

  • 法演算

    問題を解いていて分からないことがありましたので、質問させていただきます。 10^32(mod 7)を計算する問題なのですが、模範解答では 10^2≡3・10(mod 7)≡2(mod 7) 10^3≡2・10(mod 7)≡6(mod 7) 10^4≡6・10(mod 7)≡4(mod 7) 10^5≡4・10(mod 7)≡5(mod 7) 10^6≡5・10(mod 7)≡1(mod 7) 10^32≡10^6・10^6・10^6・10^6・10^6・10^2(mod 7) ≡2(mod 7) となっているのですが、なぜこのような変形ができるのかの理屈が分かりません。 これはどのように計算しているのでしょうか? 分かる方がいらっしゃいましたら、よろしくお願いします。

  • AccessでExcelでのMOD関数と同じ計算をさせるには

    いつもお世話になっております。 Accessで割り算の余りを計算させたいのですが、 ExcelのMOD関数って、使えませんよね・・・? 何かよい方法がありましたら、教えてください。 クエリでもVBAでも結構です。 よろしくお願いします!!

  • 算術演算子について

    例えば、 100()3()27()23 とした時に、()に*/-+のどれか二つを入れて、 計算結果を出したい時、どうすればいいんでしょうか?ヒントを教えていただけないでしょうか?ちなみに、全て同じ演算子であってもいいです。

  • Accessでクエリに演算を加えたら新規レコードがでなくなった。

    Accessでフォームを作成して後にクエリに演算を加えたら、サブフォームに新規レコードが出なくなり入力機能がなくなってしまったのですが、どうしてでしょう? クエリでは[売上小計]と[仕入小計]と[粗利]を計算するため集計を演算にしないとフォームで合計が#エラ-になってしまうので、演算にしたところなくなってしまい復活しません。

  • VBA like演算子について

    VBA like演算子について 下記コードで”パターン文字列が不正です”とエラーで止まってしまいます。 For n = 3 To 89 If n Like "[5-7]" Then GoTo Skip_Line・・・・(1) If n Like "[39-70]" Then GoTo Skip_Line・・・(2)     処理・・・・・ Skip_Line: Next n nは行数で5-7行目と39-70行目を処理せずに飛ばそうとしています。 (1)はうまくいくのですが(2)の方で”パターン文字列が不正です”とエラーで止まってしまいます。 どなたかお知恵をおかしい頂ければ幸いです。

  • 微分演算子について質問です。微分演算子はδ/δxやδ/δyなどと表され

    微分演算子について質問です。微分演算子はδ/δxやδ/δyなどと表されますが、微分演算子同士をかけたりしたとき、交換したり、分配したりすることができますよね。また、δ/δx(▽×A)=▽×(δ/δx)Aのようにできたりします。これは微分演算子は多元環の元ということでしょうか?また、δ/δx(▽×A)=▽×(δ/δx)A(外積の計算)というようにかけるのは、微分演算子を、外積の計算におけるスカラー乗法のように考えてもいいということなのでしょうか?わかる方がいらっしゃいましたら教えてください。

  • %演算子(余り計算、moduro)を使った式を証明したい

    %演算子に関して以下の法則が成り立ちそうな 気がしますが、証明が苦手で立証できません。 (%演算子とは余りを求める演算子とします) (a*b)%c <=> (a%c)*(b%c)%c これを証明しているサイトや、%演算子の法則などに ついて纏めているサイトなどご存じないでしょうか? または証明のヒントなどご教示頂けないでしょうか。 夏休みの宿題っぽいですが、全然関係ないです。 Cでプログラム書いていて、bがコンパイラで扱えない ほど大きい定数なので、予めb%cの計算結果に 置き換えたいのです(cも定数)。 wikipediaなどで調べたのですが、分配法則、 交換法則などの説明には%演算子が含まれておらず、 質問した次第です。 よろしくお願いします。

  • Javascriptで算術演算子を作っているのですがわかりません・・・

    あの、JavaScriptの課題で、算術演算子つくり、加算、減算、乗算、除算、整数の除算の商と余りが求めれるように、a bにそれぞれ数値を代入して計算開始というのを作りました。それで、数値以外のたとえば、アルファベットなどを代入した場合、それは数値ではありません、数値を代入してくださいというような数値の入力を促すようになるようにしたいのですが、エラーばかりでます。どのようにソースを打ったら良いのかさっぱりわかりません。教えてください!!よろしくおねがいします。

  • 正負の数で最初の方わざわざ()を付けて計算させるのは、演算の+-と符号

    正負の数で最初の方わざわざ()を付けて計算させるのは、演算の+-と符号の+-を区別させる為ですか? ()の必要性が良く分かりません、5-(-5)の用に符号が重なった時のみ使えばいいと思うんですが、 参考書の問題で(-5)+4+(-7)-(-8)= というのがあったのですが、これって最初の-5にまで()を付ける必要はないですよね? 冒頭にマイナスが来てるわけだから、これは演算の-ではなく符号の-だと即座に判断出来るのに 何で()が付いてるのでしょうか?

専門家に質問してみよう