[[20040909155910]] 『入力の仕方』(LION) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『入力の仕方』(LION)

 ユーザー関数で、例えば
 Function 消費税1(金額 As Double, 税率 As Double) As Double
    消費税1 = Fix(金額 * 税率)
 End Function

 だと、 =消費税1(A2,B2)
 と入力したら結果が確認できたのですが、

 Function 加算(数値1 As String, 数値2 As String) As String
    加算 = CDec(数値1) + CDec(数値2)
 End Function

 の場合は、=加算(E2,F2)
 と入力してもうまくいきません。
 数値1と数値2を書式設定で文字列にしてもダメ。
 それなら標準にして「'」で文字列にしたら?と思ったけどこれもダメ。
 どう入力したら結果が確認できるのでしょうか。
     

 えっ?どういう意味でッか?
 =加算(E2,F2)でちゃんと計算でけますけどなぁ。
 E2とF2を文字列の結合にせいといういみでっか?
    (弥太郎)

 弥太郎さん、有難うございます。
 えっ、ちゃんと計算できるのですか?
 =加算(E2,F2) のセルは、標準ですか?文字列ですか?
 結合とか、全然そんな難しいことは考えてなくて、普通にやっても出来ないので(泣)
 (LION)

 標準ですワ。
 ちょっとお訊きしますけど、CDecは必要なもんですか?
 また、数値1、2共string、加算もstringになってますけどwhy?
 単なる数値の計算やおまへんのん?
   (弥太郎)

 うっ。
 そ、そのような深いことを聞かないで下さいませませ。
 誤差の勉強中でして、
 '16桁以上の数を10進型を使って計算するためのユーザー定義関数
 'セルには数を文字列で入力してください。各関数の戻り値も文字列です。
 と書いてあったものですから(ーー)
 どこを文字列にしても答え自体が文字列になったりバリュー!が返ったりでうまくいきませんでした。
 弥太郎さん、逆にお聞きしますが、このような桁数の多い計算って、
 やはり誤差をなくすにはいいんですか?
 私としては、誤差の勉強を始めたきっかけなんですが、
 フィルした時間(48時間分:30分ごと)と手入力の時間がどうしてもvlookupで一致せず、
 仕方なく30分ごとに全部手入力したという経緯がありまして、フィルされた時間の
 誤差解消の方法があるのでは、と、勉強を始めた次第です。
 支離滅裂ですみません。
 (LION)

 >弥太郎さん、逆にお聞きしますが、このような桁数の多い計算って、
 やはり誤差をなくすにはいいんですか?
「うっ そ、そのような難しい質問は堪忍してくらはいませませ」
 CDecが必要な事もstringが必要な事も良う分かりました、ハイ。
 As stringになっとる以上=加算の返り値は文字列ですワ。
 小数点が付かんのんやったら全部Longに変えてみるとか、=加算の返り値をLongにして
 Val(CDec(数値1))+Val(CDec(数値2))にするとか、エロエロ試してみませう。
      (弥太郎)

 Function 加算(数値1 As Long, 数値2 As Long) As Long
    加算 = Val(CDec(数値1)) + Val(CDec(数値2))
 End Function
 でやってみましたが、今度はネーム?表示どす(ーー;)
 ほわい? エロエロ度が足りない? うーむ 明日へ持ち越します。
 今日はおつきあい頂きまして有難うございましたm(__)m
 (LION)

 ちょっと待っちくだはいよ、LIONさん。
 それって加算というユーザー関数が認識されて無いっちゅう事でっせ。
 間違い無しに標準モジュールへ書けてまっか?
     (弥太郎)

 およよ。
 それでは念のため新規ブックで。。。
 「標準モジュール」へコピペッ。
 A1、B1、C1、を「数値」「30桁」表示にして。
 いざ、=加算(A1,B1)
 えいやっ!
 。。。あかん、#NUM!
 こういう時にはやはり「なむさん」ってつぶやくべきですか(>_<)
 (LION)

 LIONさん、遅うなってごめんなはれや。今日は仕事でしてん。
 ところで、度々お訊ねしますけど30桁の数値ってなんにつかいますのん?
 一、十、百、千、万、十万、百万、一千万、一億、十億、百億、一千億、一兆、十兆
 百兆、一千兆
 これで16桁ですワ。この世に存在する数値はこれ以上ありまへんがな。
 せやから十六進数っちゅいまんねんで。(笑)

 それにしても税率のユーザー関数と比べてえらい飛躍してまんなぁ。あんさん、ひょっ
 としてカミオカンデに勤めとる天文学者はんでっか?(笑)
 ウチのスーパーコンピューター(Windows XP)にかけても#VALUE!か、#NUM!ですワ。
 このばやい、もっとスペックの高いスパコンの力借りなアカンのんとちゃいまっか?
    ロースペックヘッドの(弥太郎)

 CDecのばやい、29桁までいけるみたいですけどなぁ。思い切って29桁にしてみたら
 ・・・。
 でける補償はおまへん。(汗)
   やっぱし、ロースペクヘッドの(弥太郎)


 ごちっ。しょーとつ。
 弥太郎さん、こんばんわ(^・^)
 うぷぷっ。天文学者なんて、まっ、まさか〜(^^ゞ
 あのですね、私は誤差の勉強してる、ただの中年ですワ♪
 上でも少し触れましたが、時間の誤差なんです。
 手打ちの時間とフィルハンドルをひっぱった時間では、シリアル値が違うのです。
 (以下ご参考までに)
 フィル 手打ち  比較
 0:30	0:30	●
 1:00	1:00	●
 1:30	1:30	●
 2:00	2:00	●
 2:30	2:30	●
 3:00	3:00	●
 3:30	3:30	●
 4:00	4:00	×
 4:30	4:30	●
 5:00	5:00	●
 5:30	5:30	×
 6:00	6:00	●
 6:30	6:30	●
 7:00	7:00	×
 7:30	7:30	●
 8:00	8:00	●
 8:30	8:30	×
   ・
   ・
   ・
 で、×のところの差は、-0.0000000000000009992007222 のようなのです。
 この誤差をなくすためにはどうしたらいいか、とそういうことから始まって今に至る、です。
 ドツボにはまって抜けられないだけなんです、弥太郎さま、愛の手をばぁぁぁm(__)m
 とにかくバリュー!とかナム?とかが出なくなれば、それで満足ですので...
  (LION) 

 割り込み失礼します。
エクセルで日付のシリアル値は1日を「1」でカウントする整数値です。
時間のシリアル値は24時間を「1」とする小数部分です。
さて、24時間は24*60で1440分となるわけですが、悲しいかな、「1」は1440では
割り切れません。なおかつ、パソコンで扱える小数の桁には限界があります。
そのため、時間のシリアル値は「近似値」として「妥協」されています。
結果として、表示上は同じ1分の差でも、数値上は等しく1分の差にならない部分が出
てきます。時間のフィルをした時も同じで、手打ちで1分ずつ増やしていった場合と、
フィルドラッグで1分という近似値を定量加算していった場合では当然、差が発生します。
フィルドラッグで誤差のない時間シリアル値を生成するには時間関数に頼るのが一番です。
=TIME(0,30*ROW(A1),0)
これをフィルドラッグで手打ちと同じ結果を得ることが出来ます。
 
 
> '16桁以上の数を10進型を使って計算するためのユーザー定義関数
> 'セルには数を文字列で入力してください。各関数の戻り値も文字列です。
このくだりは、EXCELが扱える数値の有効桁が15桁なので、計算誤差とは
別次元の話ではないかと想像するのですが・・・。
ためしに表示形式を数値書式「0」などとして16桁の数値を入力すると、
1の位は必ず0になります。ココで勘弁して〜な、というわけです。
先のユーザー関数の返り値がStringなのは、エクセルが計算結果を数値としては
正確に表示できないためです。
(KAMIYA)

 KAMIYAさんレクチャー有難うございます。
 なるほど、タイム関数でうまくいきました。 
 深くつっこむよりは広い知識が必要なんですね...
 勉強になりましたm(__)m(LION)

KAMIYAカンデのエクセル博士 & My genius !
 いつもながらの名レスポンス、恐れ入りやす。
 知らぬ事とは申せ、トンチンカンな回答ばかりでLIONさんをうろたえさせてしまいまし
 た事、深くはんせえしとります、ハイ。(してへん、してへん)
 これに懲りずまたフォローお願いいたします。
 えっ、弥太郎の尻ぬぐいばっかしイヤヤってでっか?
チームプレーだぜセニョール! (笑)
 あ、忘れるとこやった。エクセル博士に!!!
   フォロー頼みのレスポンス.マン(弥太郎)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.