みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

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

解決済みの質問

VBAに詳しい方、「Mod」を解説していただけませんか?

四捨五入したり、繰り上げたり、なんだかさっぱり分かりません。
詳しく教えてください。

Sub 答え()
 Dim kotae As Double
 keisan = 6.6 Mod 2
 Range("A1").Value = keisan
End Sub
この場合、A1は1と入るのですが、なぜ1なのですか。
VBAの試験があるので、なんとか覚えたいのです。
さっぱりわからず、困っています。教えてください。

お助けください。

投稿日時 - 2007-10-24 00:46:12

QNo.3456153

困ってます

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

> ようするに、切捨てや繰上げなどあるみたいなのですが、よく分からず困っているのです。

Mod演算子のヘルプに、
「このとき浮動小数点数は整数に丸められます」 と書かれています。
では、どのように丸められるか実験してみましょう。

15 を 1.5 で割った余りを考えます。
手で計算すると 割算の答えは 10 で余りは 0 ですね。
では、イミディエイトウィンドウで計算すると
? 15 mod 1.5
1
結果は 1 です。
あ、これは先に丸めて 15 Mod 2 を計算しているんだな、
ということが分かりますね。
他にも計算してみましょう。
? 15 Mod 1.4
0         (15 Mod 1) に一致
? 15 Mod 1.6
1         (15 Mod 2) に一致

ここで、四捨五入されたと考えるのはまだ早い。

次に 15 Mod 2.5 を計算してみましょう。
? 15 Mod 2.5
1
あれれ?
四捨五入なら 15 Mod 3 で 0 になるはずですね。
どうなっているの???

答えは、ここで行われているのは四捨五入ではなく
銀行型丸めといわれているもので
小数部が .5 の場合に、偶数に丸めるというものです。
1.5 の場合には、1 と 2 のうち、偶数である 2 の方に丸められ
2.5 の場合には、2 と 3 のうち、偶数である 2 の方に丸められるのです。

VBA のRound 関数も同様の丸めが行われます。
四捨五入が必要なら、自作関数などの工夫が必要になります。

お分かりいただけたでしょうか。

投稿日時 - 2007-10-24 10:36:48

補足

ありがとうございます。
「このとき浮動小数点数は整数に丸められます」これが、なんのことだかちんぷんかんぷんでした。情けない限りです。
よく分かりました。すごくうれしいです。

投稿日時 - 2007-10-24 22:19:41

ANo.5

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

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

回答(6)

ANo.6

こんにちは。

もちろん、Modの演算子自体を覚えようという段階なら、率直なところ、ちょっと試験は厳しいなって思います。しかし、ご質問の趣旨はそんなことではないと思います。以下で書くことは、以前、掲示板でも出てきた話ですし、一般試験レベルの内容ではないので、ああ、そういう話があったなぁ程度でよいと思います。ここらを追求するというのは、かなり大変なんです。

"6.6 mod 2" なんていうものを、VBAとしてきちんと理解していたら、それはそれで立派なものだと思います。

私は、今のところ、VBAはあくまでも趣味の範囲でしかありませんが、私の見た限りでは、この「Mod」 については、かなりの人が実務で間違えます。反面、これは、Excelのワークシート関数のModとも、VB.Net とも仕様が違うからです。しかし、それよりも、もっとも基本的なことですが、Modは、整数値しか扱わないのに、そこに、小数点を含むDouble 型の値を代入するというところに無理があります。

試験だったら、まあ、こういう微妙な内容を含むようなものはないでしょうし、本当に理解するのは、かなり後になってからです。ただ、私は頭が悪いせいなのでしょうか、このVBAの日本語ヘルプだけで理解できませんね。もう何年もOffice VBAとかやっていますが、このヘルプの翻訳だけでは、さっぱり理解できません。しかたがないので、私は、分からなくなると、英語のほうを読むようにしています。

たとえば、「丸める」というのは、英語で、"round" 。意味は、四捨五入すること、もしくは、端数を処理するという一般用語ですが、日本語は必ずしも、一般的ではありません。その定義の説明を抜きにして、話を進めても分からなくなるだけです。

以下の場合は、Mod を使うことによって、keisan のデータ型は自然に決まってきてしまいます。
keisanのデータ型は、確かに、最初に決めてしまえば、それに揃いますが、実際の内部のデータ型の処理は、規則的に決まっています。

それと、以下のようなリテラル値(数値を直接入れる)の書き方は、分かりにくいのです。変数を設けて、リテラル値は極力避けてみれば流れが分かります。

以下のように書いて、ローカルウィンドウで確認してみれば分かってきます。
最初にデータ型を、Variant 型だけにしておいてもよいです。
------------------------------------------------
Sub 答え1()
 Dim keisan As Variant
 Dim a As Double '-> Mod では、Long型に内部で換えられる
 Dim b As Integer
 a = 6.6
 b = 2
 keisan = a Mod b
 Range("A1").Value = keisan
End Sub

それを、 a = 6.4 にすると、keisan は、0 になります。つまり、a のDouble 型を、Long型に換えてみると、 a の値は、6.6 -> 7 であり、6.4 は、6 なのです。ただし、6.5 は、6です。この偶数丸めも、ステップモードとローカルウィンドウで確認することが可能です。

ワークシートの場合は、
=MOD(6.6,2)

0.6

になります。

ところが、
a = -6.6, b = 2 とすると、単に、符号を反転した値だけが出てきてしまいますから、
-1 が出てきます。ワークシートでは、1.4 です。

なお、ヘルプの文面は、人に理解させるための文章ではなくて、分かっている人が自分の理解しているものを言葉で再確認するためのものだと、私個人は思っています。(私は、頭が悪いせいかもしれません。)

ところで、VBA試験とは、Excel VBA エキスパートのベーシックかスタンダードとかですか?これらは、4択とかの問題ですし、ほぼ、ここらは間違えることはありません。何度も練習問題をやっていれば、慣れが出るせいなのか、間違いなくできます。理解とは別だと思います。

せいぜい、
次の演算の結果として正しいものは? 
10 mod 3

というようなレベルだと思います。

投稿日時 - 2007-10-24 11:37:27

補足

ありがとうございます。
試験で難しく問題が出されたらどうしようと心配していましたが、
安心しました。
やっぱり私には難しすぎました。
じっくりと覚えていきます。

投稿日時 - 2007-10-24 22:23:35

ANo.4

ANo1です。ちんぷんかんぷんということで再度書かせていただきます。
ANo3のお方の書かれた内容は100%正しいのですが、ひとまずここではVBAの試験勉強を優先しましょう。

現在のところ問題点はふたつ。
(1)切捨てや繰上げについて
(2)変数keisanが宣言されていない件について



(1):
 mod演算子の左右にある数字は基本的に整数だけしか認められないので、もし小数点があった場合は勝手にそれを四捨五入して整数にしちゃうよということになります。
 これはmod演算子ほか、「このとき浮動小数点数は整数に丸められます」と書かれた演算子のみのルールです。+演算子などそんなこと書かれていないものは普通に小数の計算ができます。

(2):
 変数kotaeは用意されたのに使用はされていなく、逆に変数keisanは用意されていないのに使用はされています。
 現実的にはエラーなく動作しますが、こういう明らかに無駄な部分があると試験などでは減点になりますので注意してください。

- - - - - - - - - - - - - - -
どんな勉強もそうですが、最初は判らないことだらけなのはしょうがありませんよね。
VBAの勉強はコンピューター基礎を土台としながら、参考書を読む・実際に作ってみる・ヘルプの内容を理解するの三つをひたすら繰り返すことで覚えます。私だってVBAを時間をかけて覚えましたので。
(いや、他のプログラムと比較するととてつもなく微小ではありますが)

勉強のほう、ひとつひとつ解決しながらがんばってください。

投稿日時 - 2007-10-24 09:40:49

補足

構文ですが、Dimのあとは、keisan でした。
うっかりしていました。
勉強の仕方をアドバイスしていただき、大変参考になります。
ありがとうございます。

投稿日時 - 2007-10-24 22:16:25

ANo.3

>切捨てや繰上げなどあるみたいなのですが、よく分からず困っているのです。

認識の誤りがあります。
#1さんがヘルプを引用した中に「このとき浮動小数点数は整数に丸められます。」と言う記載の意味が理解出来れば問題は起きません。
(これは計算機用語です。)

浮動小数点(Double/Single)・整数(Integer/Long)の型の違い(変換)が理解出来ている必要があります。
この程度はVBAに限らず、プログラミングでは基本です。

dim num1 as Integer
dim num2 as Single

num2 = 6.6
num1 = num2
Megbox num1

投稿日時 - 2007-10-24 08:25:06

補足

ありがとうございます。
難しすぎますが、基本なのですね。
構文がわざわざ書いていただきましたが、さっぱりです。ごめんなさい。

投稿日時 - 2007-10-24 22:14:04

ANo.2

変数 keisan の宣言がなされてません。
ここはどのようにお考えですか?

Modは「剰余」ですので、6.6からは 0.6 が得られます。
Range("A1")の書式設定を行って、小数第一位まで表示させるのがよろしいと思いますよ。

投稿日時 - 2007-10-24 01:08:02

補足

ありがとうございます。
例えの構文がおかしかったみたいで、すみません。
ようするに、切捨てや繰上げなどあるみたいなのですが、よく分からず困っているのです。

投稿日時 - 2007-10-24 01:11:06

ANo.1

(HELPより抜粋)
- - - - - - - - - - -
Mod 演算子
2 つの数値の除算を行い、その剰余を返します。
構文
result = number1 Mod number2
Mod 演算子の構文は、次の指定項目から構成されます。

指定項目 内容
result 任意の数値変数を指定します。
number1 任意の数式を指定します。
number2 任意の数式を指定します。

剰余演算子は、数式 number1 を number2 で除算し、その余りを演算結果 result として返します。このとき浮動小数点数は整数に丸められます。たとえば、次に示す式では、変数 A (演算結果 result) の値は 5 になります。

A = 19 Mod 6.7

- - - - - - - - - - - - -

「剰余演算子」と難しい言葉を使っていますが、ようは小学校で習う「割り算で割ったあとの余りの数字」です。

keisan = 6.6 Mod 2

上記なら6.6は演算子の処理ルールにより「浮動小数点数は整数に丸められ」るので7となり、それを2で割った余りなので1となります。

VBAに限らずヘルプを読む力は重要ですので、目に穴が開くほどよく読んで力をつければ試験でも実践でも有利です。

試験のほうがんばってください。

投稿日時 - 2007-10-24 01:02:35

補足

わざわざありがとうございます。
試験が不安になってきました。
ちんぷんかんぷんです(辛)。

投稿日時 - 2007-10-24 01:09:34

あなたにオススメの質問