月刊プログラム! |
変数
2001.May.01
加筆
2003.Jan.03 いろいろと
|
変数についていろいろ
|
変数とはどういうものなのか。
型とは何か。
メモリの配置。
いろいろな説明です。
このページだけは「初心者向き」ではないかもしれませんが、プログラムをやってくうちに、わからないことがあればここを読んでください。
|
宣言とは
|
ローカル変数を宣言するには「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
|
宣言とは「この名前の変数を使うよ」という事を、コンパイラに指示をすることです。
あらかじめ宣言しておく事で、重複した名前を避けられますし、ソースコードも見やすくなります。
VBAでは変数の宣言をしなくても変数を扱えますが、通常プログラムというのは、変数や型、または関数は必ず「宣言」をするものなので、一応宣言をするクセをつけておきましょう。
|
静的変数
|
静的変数とは、プロージャレベルで使用する「値を保持する」変数です。
値を保持するとは、通常「Dim」で宣言されたローカル変数は、プロージャから抜けると代入した値は破棄されます。
しかし静的変数の場合、値は破棄されず、次に参照する場合もその値を参照することができます。
「破棄されたら困るけど、グローバル変数にする程でもない」という場合によく使います。
静的変数の宣言には「Static」を使います。
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
2003.Jan.03 追記
開発環境によっては変数の型サイズが異なる場合があります。
この場合、Byteは1、Longは4、Integerは2バイトとして扱っています。
この場合、メモリへの配置は以下のようになります。

AAAのアドレスは「A1」番地。BBBのアドレスは「B1」番地。CCCのアドレスは「F1」番地となります。
また宣言した順番に領域の確保が行われます。
変数の宣言とは、このような仕組みとなっています。
(しかし実際にはパソコンというのはかなり複雑で、メモリが空いているにも関わらず、飛び飛びのアドレスに宣言される場合もあります)
あと「String型」はちょっと特殊で、VBAの場合は文字列を代入した時点でアドレスが決定します。
「VBAの場合は」と強調したのは、他の言語ではこのようなことは起こらないからです。
VisualBasic系の言語は、文字列を代入するごとに領域の確保を行います。
2003.Jan.03 追記
String型として宣言した変数自体のアドレスは変わりません。(筆者の勘違いです。すみません)
変数自体のアドレスは、何者も変える事はできません。
ただ、長さの違う文字列を代入するたびに、サイズは変更されます。
|
変数の型
|
変数にもいろいろ「型」があります。
ここでは一般的なものを載せました。
「良いもの」を作りたい場合は、なるべく型は宣言したほうが有利です。
こんだけ知ってれば、ちょっとしたソフト作る時には困らないでしょう。
2003.Jan.03 追記
開発環境によっては変数の型サイズが異なる場合があります。
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」を使います。
なぜでしょうね。
|
終わり
|
とりあえずダーッと説明しました。
また何か気が付けば、ここに追加するかもしれません。
|