[PR]馳凡g\
g選


【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だな、

 VBE
 (え〜、みなさん、プログラムのことについては、いろいろ知りたいだろうけれど、
  今は、変数の動きについて、話しているのですから、あまりプログラムの内容
  については、今は考えなくてもいいと思います。)

 次にいきましょうね。ハイ (=^^=)

 さて、このマクロを実行してみますと

  ダイアログボックスといわれています、パレットのような箱(↓参照)に、
  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 データ型(データの種類) 
 変数を入れる器にも、形や大きさの違いがあります。
 データの種類を一覧表にまとめてみることにします。

種  類 サイズ
バイト
宣言例 範  囲 型宣言
バイト型
byte
1 Dim x As Byte 1〜255
整数型Integer 2 Dim x As Integer -32,768〜32,767 x%
ブール型
Boolean
2 Dim x As Boolean  True(-1)またはFalse(0)で表示
 ()は内部処理
長整数型
Long
4 Dim x As Long -2,147,438,648〜2,147,438,647 x&
オブジェクト型
Object
4 Dim x As Object
Dim x As Range
総称オブジェクト型 代入するまでわからない場合
固有オブジェクト型 種類、型がわかっている場合  
実数型単精度
Single
4 Dim x As Single ±1.401298×10^-45〜
  3.402823×10^38
x!
実数型倍精度
Double
8 Dim x As Double ±4.94065645841247×10^-324〜
  1.79769313486232×10^308
x#
通貨型
Currency
8 Dim x As Currency -922,337,203,685,477.5808〜
 922,337,203,685,477.5807
15桁整数+4桁の小数 小数点第5位以下切捨て
x@
日付型
Date
8 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にも対応
文字型固定長
String
1〜
2
ギガ
Dim x As String*5 左は5文字分の固定長文字列を表す例。
文字は""で括ります文字が短いときはスペースで埋込まれ、長いときは切り捨てられます

クラスモジュール内のPublicは宣言不可
x$
文字型可変長
String
0〜
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・・・すでに格納されているデータは保持される
ユーザー定義型
 宣言セクション内で、
 Typeステートメントにより宣言
複数のデータ型を組合せて独自で作成
※1バイトは8ビット2^8(2の8乗:256)で構成されています。

●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回】