月刊プログラム!
VisualBasic For Excel
Vol_05
2001.MAY.01
Presented by kouta_y
感想等は掲示板、苦情はメールへ。
最近エクセルってやらなくなってきた・・・。
仕事でエクセル使う機会が少ないので、、、
(家でエクセルってあんま使わない)
変数についていろいろ
変数とはどういうものなのか。
型とは何か。
メモリの配置。
いろいろな説明です。
このページだけは「初心者向き」ではないかもしれませんが、プログラムをやってくうちに、わからないことがあればここを読んでください。
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」を使います。
なぜでしょうね。
とりあえずダーッと説明しました。
また何か気が付けば、ここに追加するかもしれません。