【HOME】 【INDEX】 【第1回】 【第2回】 【第3回】
プログラミングの基礎編 第2回
変数と定数について、さらに深く考えてみましょう!!
1 変数の宣言
前回は、値が変化するものを、入れておく入れ物が、変数と
説明しました。
そして、変数を使用する場合、入れ物をあらかじめ用意しておく
「宣言」が必要なこともいいましたね。
そして基本型は
有効範囲(省略可) 変数名 データ型(データの種類)
でしたね。覚えていますか?
それでは、まず変数の有効範囲について考えることにしましょう!!
●変数の有効範囲
プロシージャでも有効範囲があるように、変数にも定数にも
有効範囲があります。
プログラムの基本構造でも、説明しましたが
VBAは、エクセルの1ファイルにプロジェクトという入れ物があって
その中に、3つの構成されるモジュール(クラスモジュール、標準モジュール、
ユーザーフォーム)からなり、そしてそれらの中に、プロシージャという
プログラムを入れる入れ物があります。
そして、有効範囲というのは、それらの3つの入れ物の範囲を示します。
・プロジェクト内 (Public宣言 )
・モジュール内 (Plivate宣言、Dim宣言)
・プロシージャ内 (Static宣言、Dim宣言)
と、いうことなんです。
この宣言もステートメントです。
プロジェクト内
●変数の宣言
Public宣言
どのモジュールの、どのプロシージャからも使用可能。
ブックを開いている間、有効
モジュール内
Private宣言
Dim宣言
同じモジュール内の複数のプロシージャで有効
ブックを開いている間、有効。
プロシージャ内・・・プロシージャ内だけで有効
Dim宣言・・・プロシージャ実行のみ有効
Static宣言・・・ブックを開いている間有効
上の表でもわかるようにDim宣言は、モジュールでも、プロシージャでも宣言できます。
ただし、プロシージャ内のDim宣言は、そのプロシージャが終了すれば、値が開放されて
しまいますが、Staticでは、値が保持されたままになります。
つまり、一度プロシージャを終了させ、再度プロシージャを実行したときには、
その変数は、以前の値を保持したまま引き継がれるということです。
プロシージャ内だけは、変数の有効期間が宣言によって違うということを
覚えておいてください。
●StaticとDimの違い
Sub test()
Static x As Integer
Dim y As Integer
MsgBox "y=" & y
MsgBox "x=" & x
x = 5
y = 10
MsgBox "y=" & y
MsgBox "x=" & x
End Sub
プロシージャ名 testという、簡単なプログラムを標準モジュールで作ってみました。
みなさんも、同じものを作ってみてください。
標準モジュールの作成方法はわかるかな?
エクセルのツール→マクロ→Visual Basic Editor をクリック。
そして、VBEを開いて、挿入→標準モジュールを選択すればいいだけだよ!!
そうするとVBAプロジェクトの下の方に標準モジュールが自動的に
作成され、その中に、Module1というモジュールが作成されます。
実際に、上の式をまるまるをコピーして、標準モジュールのModule1のコード
に貼り付けマクロを実行してみてください。
実行方法は、図のように、三角ボタンのユーザーフォームの実行ボタンを
クリックすればOKだな、
(え〜、みなさん、プログラムのことについては、いろいろ知りたいだろうけれど、
今は、変数の動きについて、話しているのですから、あまりプログラムの内容
については、今は考えなくてもいいと思います。)
次にいきましょうね。ハイ (=^^=)
さて、このマクロを実行してみますと
ダイアログボックスといわれています、パレットのような箱(↓参照)に、
MsgBoxというオブジェクトを使えば、メッセージを次のように表示させることができます。。
(ダイアログというのは、対話とか、対話の部分、せりふという意味があります。)
![]()
結果は、
y=0
x=0
y=10
x=5
と表示されているはずです。
もういちど、このプログラムを実行してみましょう!!
y=0
x=5
y=10
x=5
変数xに注目してください。
Staticで宣言された変数xは先に実行された値が保持され
x=5と表示されます。
Dimで宣言された変数yは、値が開放されているので元にもどり
y=0と表示されたはずです。
Sub test2()
Static x As Integer
Dim y As Integer
MsgBox "y=" & y
MsgBox "x=" & x
x = 5
y = 10
MsgBox "y=" & y
MsgBox "x=" & x
End Sub
つぎにtest2というプログラムを作成しましょう!!
上のプログラムをコピーして、testに2をつけるだけです。
そして、このプログラムを実行してみてください。
結果は、
y=0
x=0
y=10
x=5
と表示されているはずです。
つまり、それぞれの変数x、yはプロシージャ内だけ有効だということが
わかるはずです。なぜなら xは0に開放されているからです。
変数xについては、それぞれのプロシージャのプログラムを再度実行すると
それぞれ、値が保持継続されているのがわかると思います。
●Publicは注意!!
Publicで一度宣言してしまいますと、ブックを終了しないかぎり
このプロジェクト内ですべて、この変数は有効になります。、
ですから、値が保持されたままで継続されますので、プロシージャが多い場合
自分の意識しない、意図しないところで、変数の値が変わってしまう場合も
ありうるわけです。
この宣言をする場合は、特に注意しましょう!!ネ
2 データ型(データの種類)
変数を入れる器にも、形や大きさの違いがあります。
データの種類を一覧表にまとめてみることにします。
種 類 サイズ
バイト宣言例 範 囲 型宣言 バイト型
byte1 Dim x As Byte 1〜255 整数型Integer 2 Dim x As Integer -32,768〜32,767 x% ブール型
Boolean2 Dim x As Boolean True(-1)またはFalse(0)で表示
()は内部処理長整数型
Long4 Dim x As Long -2,147,438,648〜2,147,438,647 x& オブジェクト型
Object4 Dim x As Object
Dim x As Range総称オブジェクト型 代入するまでわからない場合
固有オブジェクト型 種類、型がわかっている場合実数型単精度
Single4 Dim x As Single ±1.401298×10^-45〜
3.402823×10^38x! 実数型倍精度
Double8 Dim x As Double ±4.94065645841247×10^-324〜
1.79769313486232×10^308x# 通貨型
Currency8 Dim x As Currency -922,337,203,685,477.5808〜
922,337,203,685,477.5807
15桁整数+4桁の小数 小数点第5位以下切捨てx@ 日付型
Date8 Dim x As Date x = #1/1/2004#→2004年1月1日
整数値1は1899年12月31日となり、1日ごとに1増加。シリアル値とも呼ばれています。
0は0時00分00秒で、秒は24×60×60で割ったものです。エクセルのセルでは 1 は1900年1月1日と表示されるので注意バリアント型
Variant数値16
文字22+文字列数Dim x As Variant
Dim x
宣言しないで使用代入された値により変化する。
Empty値(0または""で対応)、Null値、エラー値、Nothingにも対応
文字型固定長
String1〜
2ギガDim x As String*5 左は5文字分の固定長文字列を表す例。
文字は""で括ります文字が短いときはスペースで埋込まれ、長いときは切り捨てられます
クラスモジュール内のPublicは宣言不可x$ 文字型可変長
String0〜
2ギガDim x As String 文字は""で括ります x$
静的配列 要素の個数がわかっている
インデックス値(規定値)は0から始まるDim x(10) as Integer ,Dim(5 To 10) As Byte
・・・1次元配列
Dim x(5,10) as Long,Dim x(3 To 5,5 To 10) as Long
・・・2次元配列動的配列 Redim x ( i )
ReDim Preserv x ( i )
要素数 To も 使用可Dim x() as Integer ・・・配列宣言
ReDim x(10)・・・配列の要素を変更
ReDim Preserv x(20)・・・格納データを残し、要素を変更
Preserv・・・すでに格納されているデータは保持される※1バイトは8ビット2^8(2の8乗:256)で構成されています。
ユーザー定義型
宣言セクション内で、
Typeステートメントにより宣言複数のデータ型を組合せて独自で作成
●Variantは万能型
変数の宣言を省略しますと、Variant(さまざまなという意味)型になります。ことばどおり、データにより
変化するのです。たとえば、最初は255までの数字を扱っていたなら、型はByteで処理されていますが、
値が255を超えると、Integer型になりますし、文字が格納されれば、String型にもなります。
ただし、固定長の文字型とユーザー定義型は格納できないとなっています。
また、Variant型はEmpty値や、Null値、エラー値、Nothingも格納できますし、文字型になっている数字でも、
演算に使用すれば、数値の値に変化する万能型ともいえます。
ただし、上の表でもわかるように、サイズが大きいため、メモリの消費が大きいことに注意しておきましょう。
実際の変数の取り扱い方は、次の機会に譲るとして、プログラムを作成しているうちに、
変数の取り扱いによるエラーも多々でてまいります。
そのときに、その格納された値が、宣言された範囲にあるかどうかを、よく知っているか、知らないかでは
そのときの解決手段に差がでてまいります。
プログラムで使う変数が、どのように変化するかを見極めて、変数を宣言することが大事ですネ。
●ユーザ定義型
ユーザー定義型について少し説明しておきます。
次の例は、ユーザー定義を使って、配列に組込むプログラムです
’============モジュール==========================================
Option Base 1 'インデックス番号の最小値を 1 に設定します。
'必ずモジュールの先頭で記述します
(ここにユーザー定義を宣言します {この場所を宣言セクションともいいます} )
'ユーザ定義でSeitoを宣言します。
'Seitoの後にはピリオッド「 . 」で定義するデータ型を組合わせることができます
'次の場合、IDとNAMEの組合わせを定義しています
Type SEITO
ID As Integer
NAME As String
End Type
’-------プロシージャ--------------------------------------------
Sub Test()
Dim ST As SEITO ’(1)
Dim MyClass(100) ’(2)
ST.ID = 1 ’(3)
ST.NAME = "たこちゅー"’(4)
MyClass(ST.ID) = ST.NAME ’(5)
MsgBox MyClass(1) ’(6)
End Sub
’解説
’(1)Seitoを変数STで定義しています
’(2)1元配列MyClassを100要素 バリアントで定義しています
’(3)ユーザ定義で作成した変数IDに1を代入しました
’(4)ユーザ定義で作成した変数NAMEに"たこちゅー"を代入しました
’(5)MyClass()の1番目に"たこちゅー"を代入することになります
’(6)ダイアログボックスに "たこちゅー"と表示されます
’--------------------------------------------------------------
’==============================================================’
プログラムは、あなたにとっては、ここでは難しいかもしれませんが
次第に慣れてくると思います。
ここでは、こういう方法を使用するんだということだけ理解すれば OK!! (^^)v
2 定数の宣言
定数の宣言も、変数と同様、プログラムのどこに書いても自由です。
わかりやすいように、先頭に書いて置くほうがベターだと思います。
●定数の基本型
(有効範囲:省略可) Const 定数名 (As Type:省略可)=expression(表現という意味)
●有効範囲(Private又はPublic)
有効範囲を省略した場合は、Privateになります。同じモジュール内だけで有効です。
他のモジュールでもPrivateで宣言可能ですが、別のものとして取り扱われます。
Publicを宣言すると、プロジェクトのどのモジュールからも使用可能となります。
宣言例
Const 消費税 = 0.05
Const 円周率 = 3.14
Const 元旦 As String = "01/01/2004"
Const MONTH As String "31"
※As を省略した場合、Variant型のように最適なデータ型を自動的に割り当てられます
小生も、一定の基準値を設定するときなどは、定数の宣言を使用しています。
今回はこれでおしまい、おしまい。
次回は、VBAで使用できる演算子について、お話することにしょうかな?
では、また、
To be Continued …
03/10/28 作成
【HOME】 【INDEX】 【第1回】 【第2回】【第3回】