- ベストアンサー
VBAの演算について
Rubyで余りの計算をすると (-12977 % 60) + 1 =44 ちなみにVBAでは (-12977 mod 60) +1 =18 になるのはなぜでしょうか。 Rubyの方の演算のが正しいと思うのですが、 VBAはなぜ間違えた演算をしてしまうのか検証できる方はいらっしゃいませんか。
- みんなの回答 (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)
ANo.4です。 補足への回答となりますが、 > ただ、VBA上で処理する場合Modを使わないで算出する方法はないのでしょうか? MsgBox Evaluate("=MOD(-12977,60)+1") こんな感じで、VBAでセル演算を使用する事なら出来ます。
- mt2008
- ベストアンサー率52% (885/1701)
回答ではなく余談になりますが、 ExcelのVBAでは -16 MsgBox (-12977 Mod 60) + 1 Excelのセル式ではRubyと同じ44 になります。 =MOD(-12977,60)+1 ExcelはVBAとセル式で同じ様に見えて考え方の違う関数があるから時々悩まされます。
補足
そうなんですよねー。ありがとうございます。 ただ、VBA上で処理する場合Modを使わないで算出する方法はないのでしょうか?
- kanemoto_s
- ベストアンサー率45% (112/244)
なぜ「間違えた」と思えるのでしょうか? このようなことが起こる原因は、負の数の剰余が数学的に完全に定義されていないことにあります。 -4 を 3 で割った剰余は流儀により、 2(最小非負剰余) 1(絶対値の剰余) -1(絶対値最小剰余) など、いろいろなものがあるのです。 C言語では、コンパイラによって結果が違う(言語仕様上定義されていない)時代もありました。 このため、RubyやVBAの結果は、それぞれの言語の仕様で、それぞれ正しいと言えるのです。
- deltaforce_1
- ベストアンサー率34% (88/255)
私が検証した所、VBAとVBSでは"-16"になりました 検証環境:WinXP、Excel2007 ---- VBS msgbox(-12977 mod 60) + 1 ---- VBA Excel上でActiveXボタンに上記のコードを貼りつけて実行 ---- windows標準の「電卓」でもこの答えです 元の数がマイナスなので、「あまり」を出す場合には+44ではなく-16が正しいと思いますが…
- TooManyBugs
- ベストアンサー率27% (1472/5321)
負数の剰余について統一した定義がないからですね。 Rubyの場合は被除数と被除数より小さい除数の整数倍との差として -12977 と 60 * -217 = -13020 の差 43 を剰余としている。 VBAでは被除数と絶対値が被除数より小さい除数の整数倍との差として -12977 と 60 * -216 = 12960 の差 17 を剰余としているから。
お礼
ありがとうございます。