- ベストアンサー
エクセルVBAの余り計算の仕方について
- エクセルVBAでの余り計算がうまく動作しない問題について教えてください。
- Rubyでの余り計算とエクセルVBAでの余り計算の違いによって、期待とは異なる結果が出力されています。
- エクセルVBAでの余り計算においておさえるべきポイントや解決策を教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
http://oshiete1.watch.impress.co.jp/qa6877064.html 上記での質問も加味して、 剰余についての資料 他のカテゴリでの例(数学カテ) (割られる数が負の場合についても) http://oshiete1.watch.impress.co.jp/qa1170385.html Excelでの計算 http://support.microsoft.com/kb/141178/ja 開発言語による剰余の計算の違い 英語ですが、Rubyをブンブン振り回しているならすぐ解釈できるでしょう。 (Result has the same sign as のところが、余り符号が 割られる数値、割る数値、ユークリッド互除法のいずれに よるかの意味) http://en.wikipedia.org/wiki/Modulo_operation >エクセルのVBAで書くと除算の余りがうまく動作していないようです。 ではなく、たとえば、割られる数値が負の場合、 質問者さんが定義しているこういう値が 返ってきてほしい、ということをコード で設定する、ということです。 ところで、質問では割られる数値、割る数値が共に 正の場合について、 h = (nissu Mod 60) + 1 として、nissu = 12977 を代入し、 h = (12977 Mod 60) + 1 のhの値が18ではおかしい、44が正解だというのならば、 新しい、学説を発表したらどうですか? それとも、Rubyでは、紙と鉛筆で計算しても、 12977 ÷ 60 = 216 余り 17 となる計算ができないのですかね? Rubyでは、 12977 ÷ 60 = ? 余り 43 ですか? 上式の?には何がくるのですかね? あるいは、数学の剰余の求め方が 劇的に変化したのでしょうか? ちなみに、C言語で以下をGCCで実行すると、 d=216 m=17 が返ります。質問者さんからするととんでもない 結果ですが。 #include <stdio.h> int main(void) { int d = 12977 / 60; int m = 12977 % 60; printf( "d: %d\n", d ); printf( "m: %d\n", m ); return (0); }
その他の回答 (3)
- keithin
- ベストアンサー率66% (5278/7941)
あいかわらずmyDateの中身がヒミツのままなので的確に回答できませんが,あと考えられることは,あなたのrubyのプログラムの方で日付の引き算を間違えて -12977 % 60 という計算をやらかしていると思われます。 ちなみにVBAでは -12977 mod 60 は-17になります また 12977÷60の剰余が43じゃなく17なのは,最初にもお話ししましたが開発環境以前の算数の問題です。
- keithin
- ベストアンサー率66% (5278/7941)
myDateがおかしい,とお話ししました。その検証はどうされたのですか? 回答したマクロのmyDateの???欄に「入力値」を記入して実行した結果はどうだったのですか? >入力値なのですが どんな内容のデータを どこに どうやって 入力しているのですか? 具体的に。正確に。詳しく。実際に動かしているプログラムも添えて,手抜きせず情報を出して下さい。
補足
うーん、入力値はフォームから入力する形で、日付データで保存されるようにしています。 私の推測ではmyDataの件は関係ないと思います。 Rubyでは%で計算するところを、Modで算出すると答えが変わるのではないかと思うのです。 中の数値がどうとかそういう問題ではなくて、エクセルのVBA特有の演算の癖があるのではないでしょうか。その辺どうなのでしょうか。
- keithin
- ベストアンサー率66% (5278/7941)
12977÷60 = 216 余り17 なので,hに18が現れるのは正しい結果です。 >期待している値は44です。 myDateの日付が違っていて,結果してnissuの計算が誤っている状況が疑われます。 dim nissu as long dim base as date dim myDate as date dim h as long base = dateserial(2010, 7, 13) myDate = dateserial(?,?,?) nissu = base - mydate h = nissu mod 60 + 1
補足
myDateは入力値なのですが、Rubyと同じ条件で動かしています。 エクセルと除算の余りが異なってしまうのはなぜなのでしょうか。
補足
それがおかしいですよと言っているんです。 他の方の回答をお願いします。