エクセル

どういうときにどのデータ型を使う?VBAの変数

エクセル

[PR]当サイトはアフィリエイト広告を利用しています。

はじめに

今回は文法の基本である変数について解説します。

変数はプログラム上で値を保存しておくメモのようなものです。

よく使うので解説します。

簡単に言うと、

データの内容に応じてデータ型というものが決まっています。

数値は数値、文字は文字。コンピューターはその辺が厳密に決まっています。

今回の記事を読むことで変数というのは何なのか、VBAではどのように変数を使うのかがわかります。

データ型一覧とその用途

これからデータ型の種類を解説していきます。扱うデータに応じてデータ型を適切に指定する必要があります。具体的な設定方法は後述します。まずはこんな種類があるんだな、くらいで大丈夫です。

バイト型【Byte】

バイトというのは2の8乗(28)のことです。コンピューターの世界では基本的に2進数が使われます。私たちが普段使うのは10進数です。2進数というのは0か1かという情報だけで数の位を表現します。2が4個並べば24となり16個の数値を表現できます。28では256個の数値を表せます。一般に数値は0から使いたいので、2を8個使用して1バイトとして、0から255までの整数をあてがいます。

つまりバイト型というのは0から255までの整数を格納することができます。

よくSSDの容量などで2TBなどと表現されますよね。これは2「テラバイト」と読みますが、このバイトはバイト型のバイトと意味的には同じです。2が8個並んだ256種類の情報を表現できる1バイトが「テラ」、つまり10の12乗個あるという意味です。

整数型【Integer】

整数型は-32,768~32,767の整数を格納できます。

長整数型【Long】

長整数型は-2,147,483,648~2,147,483,647の整数を格納できます。

整数型はなんで3種類あるのか

例えばByte型は255までの整数しか格納できません。300とかは格納できないのです。しかしながら、コンピューターの資源をフルに使いたければ

状況にあった型を使う

という必要性があるのです。

というのもいつもいつもLong型を使えばよさそうに思いますが、コンピューター内部では無数の変数が使われています。初心者プログラマーが課題のプログラムに整数を使う、くらいだとビクともしませんが、コンピューター全体でLongを使うとどうなるでしょう?

Longを使えばそれだけ変数一つに割り当てられるメモリは増大します。Longを使うにはLongの最大・最小値を格納できるだけの広さをコンピューターで変数に割り当てる必要があるのです。たとえLong型に1とか10を格納しても、Longの最大値2,147,483,647まで使える領域が確保されます。Longの計算結果はLongに格納します。そうしないとLongの足し算や引き算ができないからです。

つまり簡単な絶対値の小さな数値を扱うために毎回最大領域を割り当てていると、コンピューターのメモリが足りなくなります。Longが乱立してメモリがどんどん減っていくイメージです。

そのため、あらかじめ計算するときの結果がある程度予想できているときはなるべくその計算規模に合うようなデータ型を指定しましょう。1+1を計算するときはByte型かIntegerで十分です。

単精度浮動小数点数型【Single】

Single型は

負の値:-3.402823(×10の38乗)~-1.401298(×10の45乗)

正の値:1.401298(×10の-45乗)~3.402823(×10の38乗)

までの数値を格納することができます。

小数で小数点以下の桁数がそれほどないような計算で使います。

倍精度浮動小数点数型【Double】

Double型では

負の値:-1.79769313486232(×10の308乗)~-4.94065645841247(×10の-324乗)

正の値:4.94065645841247(×10の-324乗)~1.79769313486232(×10の308乗)

までの数値を格納できます。

数値を小数点以下の長い桁で精度よく計算したときに使用します。

SingleとDoubleどっちを使えばいいのか

基本的に小数の計算はDoubleで計算しておいたほうが良いでしょう。

学習指導要領で円周率を3と3.14どっちを使うのか?みたいな問題です。

小数を使った計算は特に割り算で精度よく計算する必要があります。1割る3は割り切れませんよね。

コンピューターでは無理やりそこを0.3333…と表してしまいます。すると0.3という数値を使いまわすのと0.333333…を使いまわすのではかなり計算精度に差が出ます。

もちろんDoubleの方がメモリをたくさん使うのですが、精度が悪いと何の意味もないので基本的に小数を使うならDouble推奨です。

文字列型【String】

文字列型は文字を格納するためのデータ型です。

文字は文字コードと呼ばれる2進数で表現されます。

例えばASCIIコードと呼ばれる文字コードでは文字「A」は二進数で「01000001」、10進数で65と表現されます。

要するに数値一つに文字一つを対応させて、文字コードの変数の時だけ対応表から数値に対応する文字をあてがっているだけです。

とはいえ、文字列型と整数型などを足し算したりはできません。本質的に数値のもつ意味が異なるので、こういう性質の異なるデータを四則演算しようとするとエラーとなります。

ブール型【Boolean】

Boolean型は「True」と「False」の二つしかありません。

主に条件分岐の条件判定と判定結果のときに出現します。

たとえば「3は10以下の数値であるかどうか」という条件分岐のときにこの条件式は真なのでTrueが出力されて条件分岐の中身が実行されます。反対に「2は9以上の数であるか」という条件式のときは偽なのでFalseが出力されます。

コンピューターの中では様々な条件式を使うので、意外に需要のあるデータ型です。

昔はTrueを0、Falseを1に対応させて条件式を書いたりしていましたが、様々なバグの元なので、現在はブール型を使える時はブール型をちゃんと使いましょうと教わります。

通貨型【Currency】

通貨型は

-922,337,203,685,477.5808 ~ 922,337,203,685,477.5807

の固定小数点数を格納します。

Long型より大きな整数と4桁までの小数が使えます。何よりお金の計算をするための変数なので、お金の計算をするときは強く使用が推奨されるデータ型です。お金の計算では通貨型を使用したほうが正確な数値になります。

小数ならDoubleを使えばよさそうですが、Doubleは小数の扱いがあいまいです。先に1割る3は0.333…だと書きましたが、Doubleにはそういう無理やりでごり押しな部分があるので、お金の計算の時は通貨型を使いましょう。

日付型【Date】

西暦100年1月1日~西暦9999年12月31日時刻:0:00:00 ~ 23:59:59

までの時間を格納できます。

時間の計算は独特なので、日付型の変数に格納して、1日とか1時間を足すような処理を書くと、ちゃんと1日後とか1時間後の時間が簡単に出力できます。

オブジェクト型【Object】

ちょっと上位概念なのですが、エクセルはシートやブックを変数に格納することができます。こういう何らかのモノ「オブジェクト」というのはオブジェクト型のデータと呼ばれます。シートの何番目にあるこのセルにあるデータを取得したいというときにオブジェクト型の変数に対象シートを格納したりできます。

実際はシートのデータをマルっとコピーしているのではなく、情報のアドレス(ポインタ)を格納してます。

VBAでシートの情報を取得したい、などの時に使います。

バリアント型【Variant】

バリアント型は「何でも入る」データ型です。

とりあえず変数に入れたいけど、型を指定するのは面倒というときに、いい感じにVBA側で適切な型に格納してくれます。

とはいえ、そういうことをするとデータの中身の扱いがおろそかになってバグの元になることも多いので、なんでもかんでもバリアントにするのはやめましょう。

今回の例題

まず開発タブで「Visual Basic」をクリックします。

表示された画面で「挿入」→「標準モジュール」をクリック。

コード入力画面を表示させます。

※詳しくはこちら→「今後の方針とVBAを使った足し算

そうしたらいったんエクセルのシートに戻って、B2からB4セルに次のように値を入力します。

そこで次のような例題を考えます。

B2の値とB3の値を足した後に、その結果の値をB4の値に掛けた値を求めよ

エクセルの関数で求める場合

まずエクセルの関数でやってみましょう。

C3セルをクリックして、関数入力欄に

=B2+B3

と入力してEnterキーを押します。

B2とB3の部分はキーボードで文字を打つ必要はありません。

「=」を入力した後にB2セルをクリックしてください。

B2の文字が関数入力欄に入力されます。

次にC4セルをクリックして

=C3*B4

と入力してEnterキーを押します。

C4セルに24が出力されたでしょうか。

VBAで求める場合

コード入力欄に次のように入力します。

Sub sumMulti()
    Dim a As Integer
    a = Range("B2").Value + Range("B3").Value
    Range("D4").Value = a * Range("B4").Value
End Sub

実行するとD4セルに24が出力されます。

VBAの解説

今回のデータ型指定の部分です。

Dim a As Integer

ですね。

これを日本語にすると

変数 aです 整数として

もう少し日本語らしく語順を整えると

整数として変数a

です。

Dim」が「変数です

a」が変数の名前

As」が「として

Integer」が「整数

という意味です。

語順に注意してください。

As Integer a Dim

などと語順を変えると動きません。

英語に語順があるように、VBAにも語順があります

変数の型

As Integer

とわざわざ付ける必要があります。

変数には型と呼ばれる種類を特定する属性が付いています。

これを変数宣言時に指定する必要があるのです。

今回は整数の計算をするために変数を使うのでIntegerを指定しています。

文字列を扱うなら

As String

となります。

なぜ変数に型が存在するかという話ですが、簡単に言うと文字列と数値の演算を区別するためです。

例えば「+」記号には「加算」という算術演算の意味と「文字列をつなげる」という意味の二種類が存在します。

これを区別するために変数の段階で数値データ同士を演算するのか、文字列同士を演算するのか区別するわけです。

数値と文字列が「+」で結ばれているとエラーとしたいのです。

数値と文字列ではコンピュータ内部の値の持ち方違うので、無理やり足すとゲームのバグみたいにぐちゃぐちゃな結果が演算されて、コンピュータが不安定になります

そういう状況を回避したいんでしょうね。

他にも理由はあるでしょうけど、コンピュータで演算するとき変数に型が存在すると都合がよいということだけ覚えていただければよいです。

その他の細かい解説

「=」について。

左側に右側の計算結果を格納するという意味です。

新しい演算子「*」が追加されました。

これは右の値と左の値を掛け算するという意味です。

Range()系の命令文については前回の記事を参照してください。

なぜ変数を使うのか

プログラム中で値をメモしておくためです。

プログラム中でいちいちaの値を計算式で書いていると、プログラムが見づらくなります

使い勝手も悪くなります。

そのために変数という仕組みがあるのです。

例えば今回は

a = Range(“B2”).Value + Range(“B3”).Value

としましたが、aの値の代わりに毎回

Range(“B2”).Value + Range(“B3”).Value

と書いていたらうんざりしますよね。

簡単に言えば、こういうことをしないために、aと書けば計算結果に簡単にアクセスできるように変数という仕組みがあります。

まとめ

今回は変数についてまとめてみました。

ゼロから始めるとこういうところから知識を積み重ねていくことになります。

先は長いですが、少しずつ解説を増やしていこうと思います。