ほどほどの日記

 理系の雑多なネタ、プリウス関連、私の日々の生活等について扱うブログになる予定です。前の2つがそれなりの割合でかければよいのですが・・・。

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
 情報系の人にはごく当たり前、それ以外の人にはわけが分からない話題かと思います。
 マイクロソフトのオフィスには、色々なことができるマクロ機能が組み込まれています。これは、BASICの一種なので、出回りだしたころからパソコンをいじっている人なら、ある程度使える人も多いかと思います。
 かつては趣味でプログラミングをしていたので、現在も仕事でExcelのマクロを組んだりしています。先日もマクロを組んでいました。

 統計処理のためのマクロで、大体下記のような感じのプログラムです。

Sub r_calc(out_dat() As Double)
Dim a As Integer, b As Integer



out_dat(0) = a + b
out_dat(1) = a * (a + b)
End Sub
 実行してみると、正常に走る時と、out_dat(1)に代入する行でオーバーフローで止まる場合がありました。
 変数aとbが大きな値をとったときにエラーが出るようです。しかし、aとbはInteger型(整数 -32,768 ~ 32,767)の範囲内ですし、無論計算結果もout_dat(1)のDouble型(-1.79769313486231E308 ~ 1.79769313486232E308)の範囲内です。

 しばらく悩んでいましたが、ふと気がついてCDbl関数で明示的にInteger型のaとbをDouble型に変換してみました。

out_dat(1) = CDbl(a) * (CDbl(a) + CDbl(b))

すると、ちゃんと動くようになりました。
 Integer型の変数だけで計算していたので、Integer型の範囲内だけでしか計算できていなかったようです。
 昔も同じ失敗をしたことがあるような気がします(^_^;
スポンサーサイト
コメント

Take@志摩サン こんにちは

まだ8ビットをいじってた頃、浮動小数点の処理でちょっとてこずったのを思い出しました。面倒な計算は一度組んでしまえば楽なのでありがたいですが、一時期はやったマクロウイルス恐怖症でオフィスのマクロ組んだ事なかったような・・宝の持ち腐れですね(ー'`ー;)
2006/04/16(日) 15:45:46 | URL | g-mon #-[ 編集]

to g-monさん

>まだ8ビットをいじってた頃、浮動小数点の処理でちょっとてこずったのを思い出しました。
 てこずったということは、もしかして自前で浮動小数点演算のルーチンを作られたのですか?すごく面倒くさそうですね。
 オフィスのマクロは、結構変な世界が広がっているようですよ。昔はやったVzエディッターというテキストエディッターのマクロでゲームまであったのを思い出します。
 マクロウイルスは怖いことは怖いですが、市販のアンチウイルスソフトを入れていればそこそこ安心だろうと思って使っています。
2006/04/16(日) 21:21:43 | URL | Take@志摩 #ZeZh8u1o[ 編集]
コメントする
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
この記事のトラックバックURL
http://take0hodohodo.blog50.fc2.com/tb.php/31-f457124f
この記事にトラックバックする(FC2ブログユーザー)
トラックバック
Excelのマクロ(VBA)での計算
 情報系の人にはごく当たり前、それ以外の人にはわけが分からない話題かと思います。 マイクロソフトのオフィスには、色々なことができるマクロ機能が組み込まれています。これは
2006/04/13(木) 12:29:17 | 賓満のパソコン相談
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。