月刊プログラム!
VisualBasic For Excel

Vol_05
2001.MAY.01

Presented by kouta_y
感想等は掲示板、苦情はメールへ。


最近エクセルってやらなくなってきた・・・。
仕事でエクセル使う機会が少ないので、、、
(家でエクセルってあんま使わない)


変数についていろいろ

変数とはどういうものなのか。
型とは何か。
メモリの配置。
いろいろな説明です。
このページだけは「初心者向き」ではないかもしれませんが、プログラムをやってくうちに、わからないことがあればここを読んでください。


変数とは何か


■ 宣言

ローカル変数を宣言するには「Dimステートメント」を使います。
ローカル変数とは「そのプロージャ内でのみ参照可能な変数」のことです。
Sub AAA()
Dim hensu As Long

hensu = 10

' 他のプロージャへ飛ぶ
Call BBB()
End Sub

Sub
BBB()
' 参照できない
Call(1, 1).Value = hensu
End Sub

他のプロージャからも参照できる変数を宣言するには「Private」もしくは「Public」ステートメントを使います。
Private宣言は、そのモジュール内であればそのプロージャからでも参照できます。しかし違うモジュール(外部)からは参照できません。
Public宣言は、どのモジュール、どのプロージャからでも参照できます。
どのプロージャからでも参照できる変数をグローバル変数と呼びます。

' 宣言場所に気をつけてください
Public hensu1 As Long
Private
hensu2 As long

Sub AAA()

hensu1 = 10
hensu2 = 100

' 他のプロージャへ飛ぶ
Call BBB()
End Sub

Sub
BBB()
' 参照できる
Call(1, 1).Value = hensu1
Call(2, 1).Value = hensu2
End Sub

静的変数

静的変数とは、プロージャレベルで使用する「値を保持する」変数です。
値を保持するとは、通常「Dim」で宣言されたローカル変数は、プロージャから抜けると代入した値は破棄されます。
しかし静的変数の場合、値は破棄されず、次に参照する場合もその値を参照することができます。
「破棄されたら困るけど、グローバル変数にする程でもない」という場合によく使います。

Sub AAA()

' 他のプロージャへ飛ぶ
Call BBB()
Call BBB()
Call BBB()

End Sub

Sub
BBB()
Static hensu1 As Long ' 静的変数
Dim hensu2 As Long   ' ローカル変数

Call(1, 1).Value = hensu1
Call(2, 1).Value = hensu2

hensu1 = hensu1 + 1
hensu2 = hensu2 + 1
End Sub



■変数はメモリ

変数に格納された値は、パソコンのどこかに格納されています。
それはどこなのでしょうか。
まさにそれがメモリです。

メモリと言ってもいろいろですが、通常はメインメモリ内に変数の値は格納されています。
よく「64MB」とか「128MB」とか聞きますね。
そこです。

変数は宣言したと同時に、メインメモリ内の「どこか」に必要な分だけ領域の確保を行い、そこにデータを書き込んだり読み込んだりします。
では宣言した変数はメモリの「どこに」「どれだけ」領域確保をしているのでしょう。


変数の2つの顔

変数というのは「2つの顔」を持っています。(値ではありません)
1つは、自分の居場所(アドレス)
1つは、自分の値
です。

よくインターネットやメールでもアドレスという言葉を使いますが、それとはまた違いますので今は忘れえてください。

居場所(アドレス)というのは、よく住所に例えられますが、ここではエクセルのシートを思い浮かべて下さい。
このシートがメモリです。
セル1つ1つが1バイトの領域を持っています。



例えばここで、
Dim AAA As Byte
と宣言したとします。
するとメモリ内では、空いている領域にByte型の分だけ領域の確保を行います。


先程「2つの顔」と書きました。
この場合、アドレスは「A1」、値は「0」です。
今後、変数AAAに値を代入したり、参照したりする場合、この「A1」番地へアクセスされ、データを書き込んだり、取り出したりします。

メモリアドレスは「A1」などとは言わない!

当たり前ですが、これは分かりやすくエクセルシートに例えているだけです。
「A1」番地などとは言いません。

では今度はいろいろな変数を宣言してみます。
Dim AAA As Byte
Dim BBB As Long
Dim CCC As Integer
この場合、メモリへの配置は以下のようになります。


AAAのアドレスは「A1」番地。BBBのアドレスは「B1」番地。CCCのアドレスは「F1」番地となります。

変数の宣言とは、このような仕組みとなっています。
(しかし実際にはパソコンというのはかなり複雑で、メモリが空いているにも関わらず、飛び飛びのアドレスに宣言される場合もあります)
あと「String型」はちょっと特殊で、VBAの場合は文字列を代入した時点でアドレスが決定します。
「VBAの場合は」と強調したのは、他の言語ではこのようなことは起こらないからです。
VisualBasic系の言語は、文字列を代入するごとに領域の確保を行います。



変数の型

変数にもいろいろ「型」があります。
ここでは一般的なものを載せました。
「良いもの」を作りたい場合は、なるべく型は宣言したほうが有利です。
こんだけ知ってれば、ちょっとしたソフト作る時には困らないでしょう。

Byte バイト型 1バイト(0-255)まで格納出来る。
一番小さい型。
Boolean ブール型 領域は2バイト。
TrueかFalseかの「フラグ」を格納出来る。
Integer 整数型 領域2バイトの-32,768 〜 32,767まで格納出来る。
Long 長整数型 領域4バイトの、-2,147,483,648 〜 2,147,483,647まで格納出来る。
処理速度は一番速いので、筆者はIntegerよりなるたけこっちを使う。
Single 単精度浮動少数点数型 領域4バイトの(負の場合)-3.402823E38 〜 -1.401298E-45
(正の場合)1.401298E-45 〜 3.402823E38まで格納出来る。
String 文字列型 String * nとやれば、nバイト格納出来る。
よく使うが、API使用時などは要注意の型。
Object オブジェクト型 オブジェクト(FileSystembjectとか)を格納出来る型。
Variant バリアント型 基本的なデータ型を全てに対応出来る型。
処理速度がかなり遅いので、俺はあんま使わない
型を明示的に宣言しなかった場合、自動的にVarant型となる。

これ以外にもいろいろあります。
ちなみに変数以外にも、この「型」は使うので、基本的なのは覚えときましょう。(ってかやってく内に覚えます)


変数の名前

変数の名前は「アドレスの名前(ラベル)」だと思って結構です。
変数に名前をつける場合、分かりやすい名前にすることが基本です。
後でみても「この変数はこういう用途で使ってのか」と分かりやすくするためです。
For...Nextループなどでは、よく「i」を使います。
なぜでしょうね。


とりあえずダーッと説明しました。
また何か気が付けば、ここに追加するかもしれません。