t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

VBA豆知識 String、Long、Doubleなどの型名の由来について

VBAの型名は英単語であるが、そのまま和訳しただけで意味が通じるものとそうでないものがあるので、一通り解説しておこうと思う。

Byte型

バイトと読む。
整数型で1~256を格納できる。
「2GBのメモリ」などデータサイズを表す用語としてもお馴染み。

Byteは1956年、IBMで働くWerner Buchholz(ワーナー・バックホルツ)さん ーなんてかっこいいお名前!ー が作ったコンピューター用語。 コンピューターが一度に処理できる(噛める)ビットの集合を、英単語のBite(噛む)をもじってByteと名付けたらしい。

【参考】Werner Buchholz • IEEE Computer Society(英語)

なるほど。彼は情報をムシャムシャ食べてるコンピューター君を想像したわけだ。そのひと口(ひと噛み)がバイトだと。

さて、本来1バイトが何ビットかというのはまちまちだったらしいが、現在では1バイトはふつう、8ビットを表す。

(ここで歯が8本あるコンピューターの挿絵でもあれば良かったんだけど、あいにく絵心がないので、皆さん自由に想像してください。)

8ビットとはつまり2進数で8桁なので、この範囲を整数で表すと0~255となる。
00000000→0
11111111→255

ただし、255までしか使わないからといって安易にByte型を使うのは賛成しない。
たとえばExcel 2010では1,048,576行まで扱えるが、ループで回すのが100件未満だからByteを用いるという使い方は変だ。

Byte型は、本質的に0~255の範囲で収まるようなデータに用いる。
たとえば文字列型をByte型配列に変換する際に用いたり、データをバイト単位で読み込む際に用いたり。

■Byteの使いどころ参考記事
thom.hateblo.jp
thom.hateblo.jp

Integer型

インテジャーと読む。英語で整数のことをIntegerというのでこちらは分かりやすい。日本語で整数型と言ったらInteger型を指す。

VBAのInteger型は-32,768 ~ +32,767までの整数を扱えるので普通の整数にはIntegerを用いて良いと思う。「用いて良い」などと微妙な書き方になってしまったのは、普通の整数を扱うには後述するLong型の方が一般的になりつつあるためだ。

VB.NetのInteger型は4バイト、C#のint型も4バイトなのに対し、VBAでInteger型のデータ量は2バイトしかないので扱える数値の限界が3万というのは少なすぎる。

また、実際のところIntegerよりもLongの方がパフォーマンスが良い。
thom.hateblo.jp

Long型

ロングと読む。長い?何のこっちゃと思われるかもしれないが、日本語では長整数型(ちょうせいすうがた)と読む。名前通り、扱える整数範囲が-2,147,483,648 ~ +2,147,483,647と、だいぶ長くなっている。

しかし、VB.NetのLong型に比べると遥かに短い。VB.NetのLong型は-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807まで扱える。

VB.NetではVBAのLong型に相当するのがふつうのIntegerである。また、VB.Netでは新たにShort型(短整数型)が作られ、こちらが-32,768 ~ +32,767までを扱える、つまりVBAのIntegerと同等の型になる。

VB.Netに言わせれば、VBAのIntegerはもはや短整数型であり、Long型は長くないただの整数型なのである。

VBAでIntegerよりもLongが多用される背景にはこうした時代の移り変わりも関係していると思う。

Currency型

カレンシーと読む。Currencyとは英語で通貨のこと。
つまりお金の計算で極力誤差を出さないために用意された型である。
扱える範囲は-922,337,203,685,477.5808~922,337,203,685,477.5807となる。

大きな金額を計算したい時や、精度の高い計算をしたいときに使う。
Currency型の数値をセルに代入するとそのセルの表示形式が通貨になってしまうので注意。

他に精度の高い計算をしたいときにはDecimal型というのもあるが、CDec関数上でしか扱えない特殊な型なので、説明を割愛する。

■CDecの使い方について参考記事
thom.hateblo.jp
thom.hateblo.jp

Double型

ダブルと読む。2倍?何のこっちゃと思われるかもしれないが、日本語では倍精度浮動小数点型(ばいせいどふどうしょうすうてんがた)という。
まず浮動小数点型というのは、小数点がプカプカ浮いて動いているという意味である。

たとえば、0.000000000000879を表すのに、小数点以下の桁数分のスペースを用意するとなると効率が悪い。
そこで、 0.879\times10^{-12}と表すことにした。

基数部の10は決まり事なので省略できる。
また、0.879の0.も省略可能。
ということで、879と-12という2つの数を記録しておけば、0.000000000000879を再現できることになる。あとマイナスの小数を表すには正負を表す符号も必要だ。

つまりコンピュータ上では小数は次のように記録されている。
符号部:+
仮数部:879
指数部:-12

-87.9なら 0.879\times10^{2}で、次のようになる。
符号部:-
仮数部:879
指数部:2

8.79なら 0.879\times10^{1}で、次のようになる。
符号部:+
仮数部:879
指数部:1

逆に大きな数もこの方式なら少ない情報で表現できる。
879,000,000,000は 0.879\times10^{12}なので、次のようになる。
符号部:+
仮数部:879
指数部:12

小数第1ケタまで表現すると、879,000,000,000.0であるといえる。

つまり指数部の変化によって、小数点の位置が左右へ移動するのが分かる。
これを小数点が浮いて動くと表現して、浮動小数点型と呼ぶのだ。

これで、極小の数も、極大の数も少ない容量で表現できるようになった。
とはいえ、仮数部、指数部ともにやはり容量には限界がある。

たとえば仮数部が1バイトしかなかったら、0~255までとなる。
仮数部が1バイトでも、9900は0.99×10^4 0.99\times10^{4}で作れる。
でも9990は作れない。仮数部が999となってしまうと、0~255の範囲を超えてしまうからだ。0.0000125は作れる。でも0.0000256は作れない。1250は作れるけど、1249は作れない。

ここで問題となるのは、数値の精度である。仮数部が増えるほど、精度が上がる。

で、精度が倍の浮動小数点型という意味で、Double型と名付けられているのである。

しかし「浮動」なんてふつうの会話で使わないから音だけ聞くと「不動」を連想してしまう。
英語のfloating point numberを訳した結果だろうけど、なんて紛らわしい。

Single型

シングルと読む。倍精度があれば単精度もある。
C言語ではfloat(フロート)型と名付けられていた。こちらは浮くという意味で浮動小数点を連想しやすいが、VBAでは「単精度」の「単」をとってSingleと名付けられたようだ。

もちろんDoubleに比べて精度は低いが、計算速度はこちらのほうが早い。とはいえ現代のコンピューターでは人間が感じられるほどの差にはならないので、基本的には実数型にはDoubleを使えばよい。

あまり使われることがないSingle型であるが、Excelのオブジェクトにはよく利用されており、たとえばShapeの座標やサイズにはSingle型が用いられているので、それらを扱う際はSingleを使っても良いと思う。

String型

ストリングと読む。英語で糸とかヒモの意味。文字列を扱うお馴染みの型である。
この文章を読めないくらい遠く離れて眺めてみるとヒモに見えてくるだろう。とくに視力が悪い方は。つまりそういうことである。

String型は実は内部ではバイト型配列になっている。
thom.hateblo.jp

Boolean型

ブーリアンと読む。これは数学者ジョージ・ブールの名前をとってつけられた。
真(True)と偽(False)の2つのどちらかしか代入できない型である。

詳しくは以下の記事をどうぞ。
thom.hateblo.jp

Date型

デートと読む。日付という安直で分かりやすい名前なのであえて説明も要らないだろう。
内部ではシリアル値という実数で扱われている。

Variant型

バリアントと読む。英語で「異なる」とか「相違した」という意味である。
つまり、型が違っても気にしないってこと。
こんな風に異なる型でも代入できてしまう。

Dim a As Variant
a = 10
a = "Hello"
a = 0.125
a = #10/9/2016#

ちなみにバラエティー、バリエーション、なんかも同じ語源で、variが付く単語は変化とか異なるとか様々なといった意味が中心にある。

そういえば変数も英語でVariable(バリアブル)って言う。

まとめ

こうしたウンチクを知ったからといって今すぐプログラミングが上手くなるという訳ではない。でも、意味も分からないまま「おまじない」のように使っているよりは、ちゃんと意味を知って納得した上でプログラミングを書く方がその言語について愛着が湧くものだし、用語なんかもかえって記憶に残りやすい。

たとえば「実数を扱う型=浮動小数点型…Double、Single」という覚え方よりも、小数点が浮いて動いているから浮動小数点型、仮数部で表現できる桁数によって数値の精度が違うから単精度(Single)と倍精度(Double)の二種類があると覚えた方が、ストーリー性があって面白い。面白いからスッと頭に入る。

「好きこそ物の上手なれ」というように、学習対象について直接関係ないことでも興味を持っていろいろ調べてみることが、結果的に上達につながるんじゃないかとも思う。

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。