こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセルVBAの余り計算の仕方について

Rubyで書くと下記のような事をしたいのですが、

date = Date.new(year.to_i, month.to_i, day.to_i) # 対象日
base = Date.new(2010, 7, 13) # 基準日
nissu = date - base # 対象日と基準日の日差を計算

h = (nissu % 60) + 1

エクセルのVBAで書くと除算の余りがうまく動作していないようです。
どうしてなのか教えてください。

下記のように書いています。
Dim nissu As Long
base = DateSerial(Year:=2010, Month:=7, Day:=13)
'base = "2010/7/13"
nissu = DateDiff(interval:="d", date1:=MyDate, date2:=base)
h = (nissu Mod 60) + 1

nissuには例えば12977という表示がされます。
しかし、hには18が出力されます。期待している値は44です。

投稿日時 - 2011-07-14 13:22:24

QNo.6875206

暇なときに回答ください

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

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);
}

投稿日時 - 2011-07-16 01:11:36

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

あいかわらずmyDateの中身がヒミツのままなので的確に回答できませんが,あと考えられることは,あなたのrubyのプログラムの方で日付の引き算を間違えて
-12977 % 60
という計算をやらかしていると思われます。

ちなみにVBAでは
-12977 mod 60
は-17になります

また
12977÷60の剰余が43じゃなく17なのは,最初にもお話ししましたが開発環境以前の算数の問題です。

投稿日時 - 2011-07-14 21:57:52

補足

それがおかしいですよと言っているんです。
他の方の回答をお願いします。

投稿日時 - 2011-07-15 08:21:10

ANo.2

myDateがおかしい,とお話ししました。その検証はどうされたのですか?
回答したマクロのmyDateの???欄に「入力値」を記入して実行した結果はどうだったのですか?


>入力値なのですが

どんな内容のデータを
どこに
どうやって
入力しているのですか? 具体的に。正確に。詳しく。実際に動かしているプログラムも添えて,手抜きせず情報を出して下さい。

投稿日時 - 2011-07-14 14:59:51

補足

うーん、入力値はフォームから入力する形で、日付データで保存されるようにしています。
私の推測ではmyDataの件は関係ないと思います。
Rubyでは%で計算するところを、Modで算出すると答えが変わるのではないかと思うのです。
中の数値がどうとかそういう問題ではなくて、エクセルのVBA特有の演算の癖があるのではないでしょうか。その辺どうなのでしょうか。

投稿日時 - 2011-07-14 17:19:25

ANo.1

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

投稿日時 - 2011-07-14 13:42:18

補足

myDateは入力値なのですが、Rubyと同じ条件で動かしています。
エクセルと除算の余りが異なってしまうのはなぜなのでしょうか。

投稿日時 - 2011-07-14 14:05:02

あなたにオススメの質問