はじめに

今回は変数について見ていきましょう。VBAの場合、変数に名前を付けるだけで、変数の型についてはあまり気にしなくてもプログラムは作成できます。Excel側で、付けられた変数名の値を見分けて変数の型を推測して設定してくれます。しかし、たまには間違いもあるのです。込み入ったプログラムの場合、Excelも混乱します。わからなくなたら、エラーを表示して止まってしまいます。こんな時、作成した本人もわからなくなって、お手上げ状態になることが、時々あります。

作成した本人が変数の型のことをよく理解しておけば、防げるエラーもあります。そこで今回は、変数に注目して解説していきたいと思います。なお、Office 2010製品版がリリースされましたので、以降はOffice 2010ベースで解説していきたいと思います

ゼロからはじめるVBA - 基本編
ゼロからはじめるVBA - VBA事始め編
ゼロからはじめるVBA - セル操作編
ゼロからはじめるVBA - 条件による分岐編
ゼロからはじめるVBA - 繰り返し処理編
ゼロからはじめるVBA - ユーザーフォーム編
ゼロからはじめるVBA - マクロの記録を使った例題編
ゼロからはじめるVBA - 数値関数編
ゼロからはじめるVBA- 文字列関数編(1)
ゼロからはじめるVBA - 文字列関数編(2)
ゼロからはじめるVBA - 日付/時刻関数編
ゼロからはじめるVBA - その他の関数編
ゼロからはじめるVBA - 定型処理の外部化編

変数名について

変数とは,処理の途中でちょっと置いておきたい文字列や数値を格納するエリアで、名前を付けて管理します。名前を変数名といいます。変数名の付け方には決まりはありません。しかし、他の人が変数名を見たとき、なんとなく内容がわかる変数名にしておくと、後から見て、自分でもわかりやすいと思います。わかりやすい変数名の付け方はいろいろ論議されています。連載のはじめのほうでも説明していますが、おさらいということで、良く使用される変数名の表記方法を以下にまとめました。

(1)Pascal記法
変数名の最初の文字は大文字で書く記法(StringData 等)
(2)CamelCase記法
先頭以外の単語の最初の文字は大文字で書く記法(stringData 等)
(3)単語間にアンダーバーを入れる記法
単語同士をアンダーバーでつなぎ、各単語は小文字で始める記法(string_data 等)

VBAの場合は、サブルーチン名は慣例的に、Pascal記法で書かれているものが多いようです。他の人が作成した例題を見るとき、どんな記法で変数名が作成されているか確認しながら見るのも面白いと思います。

以下説明するリストはsample.lzhの中に収録しています。サンプルとしてご活用ください。

データ型について

変数にはセットする内容によって、データ型が決まります。データ型によって、確保されるエリアの大きさが変わってきます。型の種類は、以下の表のようになります。

型名 型指定時 概要
文字列型 String 任意の長さの文字列
整数型 Integer -32,768~32,767までの整数(2バイト)
長整数型 Long -2,147,483,648~2,147,483,647までの整数(4バイト)
通貨型 Currency 整数部15桁、小数部4桁の固定小数点(8バイト)
単精度浮動小数点型 Single 有効桁6桁の浮動小数点(4バイト)
倍精度浮動小数点型 Double 有効桁12桁の浮動小数点(8バイト)
日付型 Date 西暦100年1月1日~西暦9999年12月31日まで
論理型 Boolean True/false(Yes/No)
バリアント型 Variant すべてのデータ

変数のデータ型

型宣言について

変数の型を明示したい場合、リスト上に変数の型宣言を行います。型宣言は以下のリストのようになります。

[リスト1]変数の型宣言1

Dim s As String '文字列型
Dim i As Integer    '整数型
Dim l As Long   '長整数型
Dim y As Currency   '通貨型
Dim g As Single '単精度浮動小数点型
Dim d As Double '倍精度浮動小数点型
Dim a As Date   '日付型
Dim b As Boolean    '論理型
Dim v As Variant    'すべてのデータ

表の順に宣言しています。数値の計算などは、型の違う変数同士でも行うことができますが、計算結果に微妙な誤差が生じるときがあります。以下リスト2を見てください。

[リスト2]違う型の計算(katasengen.xlsm)

    Sub test()
    Dim s As Single
    Dim d1 As Double
    Dim d2 As Double

    s = 123.4567

    d1 = 123.4567
    d2 = 789.1234

    MsgBox (s + d2) '結果 912.580103186035
    MsgBox (d1 + d2)    '結果 912.5801

End Sub

単精度と倍精度の足し算と倍精度どうしの足し算を比べてみました。小数点以下で微妙な誤差が生じてします。正しい数値を出したいときは、意識して、同じ型同士の計算を行いましょう。

型宣言でリスト3のような書き方をしているものを見かけます。

[リスト3]変数の型宣言2

Dim a, b, c As String   '(1)
Dim a As String, b As String, c As String   '(2)

Dim a As String     '(3)
Dim b As String
Dim c As String

(1)の場合文字型に宣言されたのは変数cのみです。a,bは型宣言を省略したとExcelは解釈します。型宣言が省略された場合、データ型はVariantになります。a,b,cとも文字型に宣言したいときは、(2)のように書きます。もちろん(3)の書き方も大丈夫です。

文字変数について

「Dim a As String」と宣言すると、変数aは文字列を入れる箱になります。セットの方法は「a="これは文字列変数です"」と書きます。セットしたい文字列を「”」(ダブルクォーテーション)でかこみます。Excelは、格納したい文字列の長さをみて変数の大きさを確保します。セットする文字の長さを特別意識する必要はないでしょう。もし、文字変数の長さを固定にしたいときはリスト4のように書きます。

[リスト4]文字列変数の宣言(moziretu.xlsm)

Dim s As String * 10
s = "ABCDEFGHIJ"        '(1)
MsgBox (s)

s = "ABCDEFGHIJKLMNOP"  '(2)
MsgBox (s)

実行すると、(1)(2)どちらも図1のようになります。変数sは「* 10」と書かれていて、10文字固定に宣言されています。(1)のように10文字まではいるのです。(2)の指定をしても10文字以上は無視されます。大きさに指定のないものを可変長文字列変数、大きさを固定したものを固定長文字列変数と呼びます。

図1:文字列型の変数を確認

数値変数について

数値変数には、整数型/長整数型/通貨型/単精度浮動小数点型/倍精度浮動小数点型があります。大きく3種に分けることができます。整数を扱う型/固定小数点のデータを扱う型/浮動小数点を扱う型です。それぞれをみていきましょう。

(1)整数を扱う型

整数型と長整数型がこれに相当します。長整数型は、扱える数値の大きさが整数型の2倍の桁数になります。プラス、マイナスの数値があり、小数点を含みません。もし小数点ありのデータをセットしたらどうなるのでしょうか?。リスト5をみてください。

[リスト5]整数型の宣言(seisuu.xlsm)

Dim i0 As Integer   '(1)
Dim i1 As Integer

Dim l0 As Long  '(2)
Dim l1 As Long

i0 = 10.3       '(3)
i1 = 10.6
MsgBox (i0)     '結果 10
MsgBox (i1)     '結果 11

l0 = 123.4      '(4)
l1 = 123.7
MsgBox (l0)     '結果 123
MsgBox (l1)     '結果 124

i0,i1を整数型、l0,l1を長整数型に宣言しています。図2のように(3)で10.3をセットするとi0は10(左上)になります。10.6をセットするとi0は11(右上)になります。長整数も123.4をセットすると123(左下)になり、123.7を指定すると124(右下)になります。Excelは四捨五入を行って整数を変数へセットしています。

小数点以下のデータが必要なとき、間違って整数扱いの変数を使って計算すると、思ってもいない答えが出てきてびっくりすることがあります。気を付けて使いましょう。しかし整数型は、VBAを作成するうえで一番多く使用されている変数型だと思います。

図2:整数型の変数を確認

(2)固定小数点のデータを扱う型

通貨型がこれに相当します。通貨を扱う場合、消費税の計算などで、誤差がでると、とても困ります。通貨の処理をするため、特別に、通貨型が作られました。消費税の計算をしてみましょう。

[リスト6]通貨型の計算(tuuka.xlsm)

Dim d0 As Currency
Dim d1 As Currency

d0 = 1512
d1 = d0 * 0.05
MsgBox (d1)     '結果 75.6

通貨型は小数点以下3桁まで対応しています。通貨の小数点以下の取り扱いはそれぞれの場合で決められています。小数点以下1桁目の扱いを決めるものなので、小数点以下3桁まであれば、大丈夫です。

(3)浮動小数点を扱う型

単精度浮動小数点型と倍精度浮動小数点型はこれに相当します。単精度は有効桁6桁、倍精度は有効桁12桁となっています。小数点はどこにあってもかまいません。浮動小数点の変数は有効桁で決まるので、計算する場合結果の答えが有効桁に入っていないと、答えに誤差が生じます。リスト7をみてください。

[リスト7]浮動小数点の計算(hudou.xlsm)

 Dim s0 As Single
 Dim s1 As Single
 Dim s2 As Single

 s0 = 1500.5
 s1 = 0.123456
 s2 = s0 + s1
 MsgBox (s0)   '結果 1500.5
 MsgBox (s1)   '結果 0.123456
 MsgBox (s2)   '結果 1500.623

単精度浮動小数点型変数を3個宣言しました。S0、S1は設定したとおりですが、計算結果は有効桁6桁と計算の保証がされていない1桁の7桁が表示されています。計算したい数値同士の桁数を合わせておかないと、数値の大きいほうの有効桁に合わせた計算になってしまうので、正しい答えが出てきません。倍精度は有効桁が2倍の12桁になりますが、有効桁をはずれての計算は単精度と同じです。

その他の変数について

上記以外にTrue/Falseなど2種のどちらかを表す論理変数、日付を扱う日付変数があります。それぞれを見ていきましょう。

(1)論理変数

True/Falseなど2種のどちらかを覚える変数です。例題を見てください。

[リスト8]論理変数の例題(Boolean.xlsm)

Dim b As Boolean
Dim a As Integer, c As Integer

b = False

a = 10
c = 20
b = ((a + c) = 30)  '(1)
MsgBox (b)          '結果 True
b = ((a + c) = 29)  '(2)
MsgBox (b)          '結果 False

if文などで条件を書く場合条件式の答えはTrue/Falseになります。条件式を変数に入れる場合は論理変数を使います。(1)の場合真なのでTrueが入り、(2)は偽なのでFalseが入ります。条件式の結果を覚えておいて、後で使用したいときなどに便利です。

(2)日付変数

日付に関する計算を行いたい時に日付変数を使用します。日付の計算は月により日付が違い、うるう年まであるので、単純計算ではできません。日付を計算するための関数も用意されています(日付の関数は、ゼロからはじめるVBAー日付/時刻関数編で紹介しています)。リスト9をみてください。

[リスト9]日付変数の計算(Date.xlsm)

Dim t0 As Date
Dim t1 As Date

t0 = DateTime.Now
t1 = DateAdd("d", 10, t0)
MsgBox (t1)  '10日後の日付
    '2010/07/12  11:00:00のとき  2010/07/22  11:00:00

日付変数t0に今日の日付を入れて10日後の日付を計算しました。