Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


7130 / 13645 ツリー ←次へ | 前へ→

【40883】EXCELとACCESSでの計算結果の違い?? どらちゃん 06/7/25(火) 17:58 質問[未読]
【40894】Re:EXCELとACCESSでの計算結果の違い?? ichinose 06/7/25(火) 20:05 発言[未読]
【40897】Re:EXCELとACCESSでの計算結果の違い?? neptune 06/7/25(火) 20:44 発言[未読]
【40915】Re:EXCELとACCESSでの計算結果の違い?? どらちゃん 06/7/26(水) 9:27 質問[未読]
【40916】Re:EXCELとACCESSでの計算結果の違い?? どらちゃん 06/7/26(水) 9:28 質問[未読]
【40918】Re:EXCELとACCESSでの計算結果の違い?? neptune 06/7/26(水) 10:31 発言[未読]
【40932】Re:EXCELとACCESSでの計算結果の違い?? どらちゃん 06/7/26(水) 15:13 質問[未読]
【40936】Re:EXCELとACCESSでの計算結果の違い?? neptune 06/7/26(水) 15:53 回答[未読]
【40939】Re:EXCELとACCESSでの計算結果の違い?? わさび 06/7/26(水) 16:22 発言[未読]
【40950】Re:EXCELとACCESSでの計算結果の違い?? どらちゃん 06/7/26(水) 18:13 お礼[未読]
【40951】Re:EXCELとACCESSでの計算結果の違い?? ichinose 06/7/26(水) 18:54 発言[未読]
【40953】Re:EXCELとACCESSでの計算結果の違い?? neptune 06/7/26(水) 19:00 回答[未読]
【40955】Re:EXCELとACCESSでの計算結果の違い?? どらちゃん 06/7/26(水) 19:14 お礼[未読]
【41028】Re:EXCELとACCESSでの計算結果の違い?? ... ichinose 06/7/28(金) 0:10 発言[未読]

【40883】EXCELとACCESSでの計算結果の違い??
質問  どらちゃん  - 06/7/25(火) 17:58 -

引用なし
パスワード
   お世話になります。
すこし調べてみたのですが、こたえがみつからないので、どなたかご存知でしたらお願いします。

たとえば、0.2÷0.78という計算。
EXCELのセル関数でやらせた場合、VBAでやった場合、試しに電卓で計算した場合、いずれも同じように0.25641025641・・・という答えです。
これをACCESSのVBAで、計算させると例えば変数をDOUBLEで宣言の場合、0.26410270929337という答えです。
なので、この後ある整数と掛け合わせてROUNDDOWN等をしたとき、答えが一円ズレたりするので、困っています。

そもそもどうしてこういうことが起こるのか?
そして、普通に正解はEXCELのほうだと思いますが、ACCESS上で同じ答えを導くにはどうしたらいいか教えてください。

【40894】Re:EXCELとACCESSでの計算結果の違い??
発言  ichinose  - 06/7/25(火) 20:05 -

引用なし
パスワード
   ▼どらちゃん さん:
こんばんは。

>お世話になります。
>すこし調べてみたのですが、こたえがみつからないので、どなたかご存知でしたらお願いします。
>
>たとえば、0.2÷0.78という計算。
>EXCELのセル関数でやらせた場合、VBAでやった場合、試しに電卓で計算した場合、いずれも同じように0.25641025641・・・という答えです。
>これをACCESSのVBAで、計算させると例えば変数をDOUBLEで宣言の場合、0.26410270929337という答えです。
具体的にAccessで↑になるコードを見せてください。

再現できないので・・・。

【40897】Re:EXCELとACCESSでの計算結果の違い??
発言  neptune  - 06/7/25(火) 20:44 -

引用なし
パスワード
   ▼ichinose さん:
>▼どらちゃん さん:

>再現できないので・・・。
私も再現できません。

お金の計算ならCurrencyを使いますけど。
あまり小さな桁まで算出すると誤差がでますから。

【40915】Re:EXCELとACCESSでの計算結果の違い??
質問  どらちゃん  - 06/7/26(水) 9:27 -

引用なし
パスワード
   ▼ichinose さん:
>具体的にAccessで↑になるコードを見せてください。

あまり参考になるかわかりませんが・・

Dim Ho As Double
Set MDb = DBEngine.Workspaces(0).OpenDatabase(Fldr & "\属性.mdb")
Set Rrst = MDb.OpenRecordset("SELECT * FROM 入力", dbOpenDynaset)
Set Crst = CDb.OpenRecordset("注記0", dbOpenDynaset)
If Rrst.RecordCount > 0 Then
 If Rrst!率 <> 0 Then
  Crst.AddNew
  Ho = Rrst!報酬 / Rrst!会社
  Crst!金額 = Int(Hoshu * Cur(1))
  Crst.Update
 End If
End If

というかんじなのですが。
たぶんロジックの問題というよりは、宣言のしかた・・?!

MDbテーブルで保有している数字は
rrst!報酬=0.2
rrst!会社=0.78
なのですが、VBA上でHo = Rrst!報酬 / Rrst!会社の変数の代わりに試しにHo=0.2/0.78で実行してみるとHoは正解になるので、この変数には実際には少数がまだ続いているということですかね・・?
数字の持ち方が悪いのでしょうか。。

すみません、これでご理解いただけますか??
うまく言葉にできなくて申し訳ありません。
宜しくお願いします。

【40916】Re:EXCELとACCESSでの計算結果の違い??
質問  どらちゃん  - 06/7/26(水) 9:28 -

引用なし
パスワード
   >  Crst!金額 = Int(Hoshu * Cur(1))
>  Crst.Update
> End If
>End If


ごめんなさい、↑のHoshuはHoの間違いです。

【40918】Re:EXCELとACCESSでの計算結果の違い??
発言  neptune  - 06/7/26(水) 10:31 -

引用なし
パスワード
   ▼どらちゃん さん:
>▼ichinose さん:
じゃないですが、
質問の最初に書いている数値
>0.25641025641・・・という答えです。
>0.26410270929337という答えです。
は本当ですか?
0.25641025641
  ↑5をどけるとその後5桁程度は同じなんですが?
0.26410270929337

既に書いてますが、Doubleの数字で計算すると小数点以下が多すぎて
1円程度の誤差は出ます。小数点以下有効な桁数を決めてやらないと
正確な計算は出来ません。

【40932】Re:EXCELとACCESSでの計算結果の違い??
質問  どらちゃん  - 06/7/26(水) 15:13 -

引用なし
パスワード
   ▼neptune さん:

>質問の最初に書いている数値
>>0.25641025641・・・という答えです。
>>0.26410270929337という答えです。
>は本当ですか?
>0.25641025641
>  ↑5をどけるとその後5桁程度は同じなんですが?
>0.26410270929337

すみません
今確認したら
0.256410270929337
でした。。


>
>既に書いてますが、Doubleの数字で計算すると小数点以下が多すぎて
>1円程度の誤差は出ます。小数点以下有効な桁数を決めてやらないと
>正確な計算は出来ません。

そうなんですか。
そもそも0.2/0.78の答えはひとつしかなくて、長さの長短はあっても、どうして数字がちがってしまうのかということもわかりませんが・・そういうものなのですね。。。
それでは有効な桁数の決め方を教えてもらってもいいでしょうか??

素人で申し訳ありません。

【40936】Re:EXCELとACCESSでの計算結果の違い??
回答  neptune  - 06/7/26(水) 15:53 -

引用なし
パスワード
   ▼どらちゃん さん:

>そうなんですか。
>そもそも0.2/0.78の答えはひとつしかなくて、長さの長短はあっても、どうして数字がちがってしまうのかということもわかりませんが・・そういうものなのですね。。。
なぜ違ってしまうのかは私にもわかりません。本来同じになるはずなんですが??
mdbのフィールドのデータ型も関係しているのかな??

>それでは有効な桁数の決め方を教えてもらってもいいでしょうか??
それは、どらちゃんさんが決めることです。
例えば、単価であれば、10.12銭などまでを有効とするとか、
比率であれば10.12パーセントまで有効とするとか、10.1234まで有効とするとか。
当然、社内、社外での取り決めに従って決めることになります。
決めたものは全ての計算において適用されなければつじつまが合わなくなります。

それと、パーセンテージの場合なら合わせて100%になるような計算の仕方を
しなければいけません。さもなければ結果に誤差を含みます。

昔、金額計算を伴うものを書いたときかなり慎重にやりました。検算しながら。

金額計算をするときはこれも先に書きましたが、通貨型を使用するのが安全です。
これならば、小数点以下第4位までは正確な数値が保証されていたと記憶してます。
(調べてね)

私にはこのように誰でも書ける事ことは書けますが、恐らくどらちゃんさんの
望むようなアドバイスは出来ないような気がします。m(_ _)m

【40939】Re:EXCELとACCESSでの計算結果の違い??
発言  わさび  - 06/7/26(水) 16:22 -

引用なし
パスワード
   >それでは有効な桁数の決め方を教えてもらってもいいでしょうか??

書式の設定方法ということでしょうか。
たとえば小数点以下を5桁とするなら、こうなります。
(ちなみにこの場合、小数点以下6桁目が四捨五入されます。)

Format(Rrst!報酬 / Rrst!会社, "0.00000")

検討違いでしたら、すみません。

【40950】Re:EXCELとACCESSでの計算結果の違い??
お礼  どらちゃん  - 06/7/26(水) 18:13 -

引用なし
パスワード
   みなさま、どうもありがとうございます。
ようやく解決致しました!

EXCELからインポートした数字(例えば0.2)の最初DOUBLEだった型を、ACCESSに取り込んだ後にSINGLEに一度プロパティを変更保存し(0.2)→やっぱりDOUBLEに戻した(0.200000002980232に!)→びっくりしてSINGLEに戻す(0.2)

という状態の数値を使用して、VBAによる計算を行っていたことが原因でした。
ということで、インポートしなおしてすべて型はDOUBLEので計算させたら正解がでました。
それでも、プロパティを変更しているうちに数字が変わる(?)こと、0.2の型を変えても0.2以下の桁は0なのだから、0の数が変わるだけじゃないの?
と思っていたので、今回そうじゃないことがわかったけれど、どうしてそうじゃないのかは未だにわかっていませんが。。。(^^;)

それぞれのデータベースでのデータの持ち方など、すべてを説明し切れない中でもいろいろ考えていただいて回答に辿り着きました。ありがとうございます。

【40951】Re:EXCELとACCESSでの計算結果の違い??
発言  ichinose  - 06/7/26(水) 18:54 -

引用なし
パスワード
   ▼どらちゃん さん:
こんばんは。

こういうことですか?

Sub test()
  Dim a As Double
  Dim b As Single
  a = 0.2
  b = a
  a = b
  MsgBox a
End Sub
これは、0.1でも起きますよ!!

小数ってね、10進数では表わされても2進数では循環してしまう数があるんです。


10進数の
0.1を2進数で表わそうとするとネ。。。

10進の小数第一位は、1/10ですが、
2進数は1/2つまり0.5以上ででないと小数第一位に1が立ちません。
これを計算すると

0.0001100110011・・・・・

延々続きます。

この数を倍精度から単精度に移行すると桁数が少ない分、最後は丸められてしまいます。
結果、微妙に大きくなったりします(逆に小さくもなると思います)。

微妙な誤差はこれが原因だと思います。

小数を扱うときは、要注意ですよ!!

【40953】Re:EXCELとACCESSでの計算結果の違い??
回答  neptune  - 06/7/26(水) 19:00 -

引用なし
パスワード
   ▼どらちゃん さん:
>みなさま、どうもありがとうございます。
>ようやく解決致しました!
とりあえずおめでとうございます。
但し、SINGLE、DOUBLE型でお金の計算すると痛い目に合うような・・・・
経験上ですが。心配。。。

>それでも、プロパティを変更しているうちに数字が変わる(?)こと、0.2の型を変えても0.2以下の桁は0なのだから、0の数が変わるだけじゃないの?
>と思っていたので、今回そうじゃないことがわかったけれど、どうしてそうじゃないのかは未だにわかっていませんが。。。(^^;)
http://www5.plala.or.jp/ratcha/vb001.html
に詳しく書いていそうだから見てね。

でも、もう見ないかな?

【40955】Re:EXCELとACCESSでの計算結果の違い??
お礼  どらちゃん  - 06/7/26(水) 19:14 -

引用なし
パスワード
   ▼ichinose さん:
ありがとうございます。
今回かなり勉強になりました。
というか、これを知らずにいろんな数字作ってたっていうのも無謀・・?!笑

我流(?)なので、他にもいろいろ知らないことがありそう。。
また何かのときにはどうぞ宜しくお願いします。


▼neptune さん:
>但し、SINGLE、DOUBLE型でお金の計算すると痛い目に合うような・・・・
>経験上ですが。心配。。。
>
そうですよね。
EXCELと数字が合わないのは一体なぜだ???!!!
というところはスッキリさせてもらいましたが。。笑
今までEXCELで作っていたファイルをACCESSに変更したという背景があり、逆にこういった問題も発覚しました。これきっかけで今後も勉強していきたいと思っています。
>
>でも、もう見ないかな?

見てますよ〜!
ちょっとおもしろそうだしPRINTOUTして電車の中で読んで帰ります。
とっても感謝デス。

【41028】Re:EXCELとACCESSでの計算結果の違い??...
発言  ichinose  - 06/7/28(金) 0:10 -

引用なし
パスワード
   こんばんは。

10進数の小数を2進数に変換するコードです。
今朝、簡単だろうと思って投稿したら大きいバグがあったので
再送です。


標準モジュールに

'====================================================================
Sub main()
  Dim idx As Long
  With ActiveSheet
    .Range("a1:b1").Value = Array("10進数", "2進数")
    For idx = 1 To 99
     .Cells(idx + 1, 1).Value = "'0." & Format(idx, "00")
     .Cells(idx + 1, 2).Value = "'" & cnvbin_for_frac(.Cells(idx + 1, 1).Value, 20)
     Next
    End With
End Sub
'=========================================================================
Function cnvbin_for_frac(myvalue As Variant, Optional keta As Long = 5) As String
'10進数の小数を2進数に変換する
' input ---myvalue 1>myvalue>=0の小数に限る
'     keta------変換桁数 省略時は、5桁
'Out-------cnvbin_for_frac 二進数に変換した小数 文字列です
  Dim sval As String
  Dim lval As Long
  Dim dem As Long
  Dim flen As Long
  sval = Trim(Split(CStr(myvalue), ".")(1))
  lval = CLng(Split(CStr(myvalue), ".")(1))
  flen = Len(sval)
  For dem = 1 To keta
   lval = lval * 2
   If lval >= 10 ^ flen Then
     cnvbin_for_frac = cnvbin_for_frac & "1"
     lval = lval - 10 ^ (flen)
   Else
     cnvbin_for_frac = cnvbin_for_frac & "0"
     End If
   If lval = 0 Then Exit For
   Next
  cnvbin_for_frac = "0." & cnvbin_for_frac
End Function


小数の誤差を探るときの参考にして下さい。

7130 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free