1-4 変数を使いこなすための便利資料
ExcelVBAマクロ作成者においては変数の完全理解が必須条件です。
1種類の操作だけであればそれを自動記録して、その記録されたマクロを実行すれば目的の処理は完了します。
しかしそのマクロの利用範囲を拡大して活用する場合は、固定された値などを変数に置換え汎用性をもたせる
必要があります。変数を理解すれば色々なマクロを自由に作成でき、プログラミングが楽しくなります。
1-5では「変数」を多くの方に完全理解して頂こうと思い特に詳しく記述しました。




(1)変数名の付け方の制限について
名前の付け方はこれらの下記に記述のような制限がありますが、これを守れば自分流の名前をつけても
特に問題ありません。
・変数名に半角の英数字や日本語(漢字やひらがなカタカナ)を使用できるが、
 名前の中に、[!][@][&][$][#][.空白]等の記号文字は使用できません。
・VBA関数、メソッド、プロパティで使用の文字は使用できません。
・名前は255文字(半角)以内にする。
・名前の先頭に数字や記号は使用できない。

名前付け方は自由ですが、後でマクロを見直した時、何を実行するための変数か連想できる名前が望ましい。

またExcel97以降では日本語も使えますが、他のプログラミング言語では普通日本語の変数は使用できない
ので、変数は英文字を付ける癖をつけるのが望ましいと思います。ただし変数名決定に悩むのも時間の無駄
であり、対策として日本語をローマ字で書くのも良い方法と思います。その場合先頭文字は必ず小文字にする。
VBAのメソッド、プロパティの先頭は大文字であり、先頭が小文字であれば変数と解釈することができます。

(2)変数の適用範囲とプロシージャの関係を理解しよう
変数の適用範囲を理解すれば「引数」をほとんど使用する必要もなくVBAでマクロを簡単に作成出来る。
そのためにはプロシージャの種類やモジュール構成の理解が必要です。


[1]変数・定数とステートメント関係の見やすい一覧表
それぞれの変数は宣言する場所と有効範囲が異なる。変数名とステートメントの関係を表6、定数は表6a。

【表6 変数とステートメントの関係】


【表6a 定数とステートメントの関係】


上表の記事欄を判りやすく説明すると画面21となります。
画面21 変数の適用範囲


・上画面のパブリック変数"pa"は、Modele1、Modele2に対し有効
・上画面のモジュ−ル変数"ma"は、Modele1、に対し有効
・上画面のモジュ−ル変数"mb"は、Modele2、に対し有効
・上画面のローカル変数"aaa"〜"ddd"は各subプロシジャ内で有効


[2]プロシージャの種類について
プロシージャには表7のような種類があります。画面22の変数の適用
範囲ではSubプロシージャのみですが、他のプロシージャの有効範囲も同様です。
【表7 プロシージャの種類】



【参考141】Public SubプロシージャのPublicは省略
正式にはPublic Subプロシージャですが正式ですが、普通Publicを省いてSubプロシージャと表示します。
その場合「開発」→「マクロ」で表示のマクロダイアログボックスの一覧に表示されますが、(Excel2003では
メニューの「ツール」→「マクロ」→「マクロ」でマクロダイアログボックス表示)表示させたくない場合は、
Private Subプロシージャ名と記述します。
また、ユーザーフォームモジュールのPrivate Subプロシージャのプロシージャもマクロボックスに表示されません。
 
なお、下記例:(3)[3] Sub 消費税3(aaa As Long)のような、Sub(引数)プロシージャの引数指定のケースも
マクロボックスにプロシージャ名が表示されません。




(3)変数の活用方法を理解すれば値の受け渡しが簡単にできます
変数の適用範囲を全モジュール対応に指定にて範囲を広げればプロシージャの引数で値を渡す必要は殆んど

ありません。かなり大きなプロプラムでも、1名で作成の場合は変数名と何の処理にその変数名を使うかメモ
して、同じ変数名を別のモジュールで使用しない等注意して作業すれば問題ありません。ただし、大きなプログ
ラムの開発で後からの手直しを考慮した場合、引数を使って変数を渡す方が見やすく判りやすくなります。


[1]2プシージャを同一モジュールに記載の変数の有効範囲
2つのプロシージャを同じモジュールに記載で、変数はそのモジュールの宣言セクション(プロシージャに含ま
ないモジュールの一番上)に宣言すれば、変数はそのモジュール内全体で有効になります。

具体的例として本例の変数「gaku」はメイン1プロシージャ内でも、消費税1プロシージャ内でいつも同じ値です。
また、設定した変数に代入されたデータは、その有効範囲内では新しいデータの代入がなければそのまま残る。
(実行例は画面22参照)
Dim gaku As Long   '価格
Dim zei As Integer '消費税
------------------------------------------------------------
Sub 範囲1()
    msg = "購入品の価格を入力してください。"
    gaku = Application.InputBox(msg, "価格の指定", , Type:=1)
          Call 消費税1
    MsgBox "価格「" & gaku & "」の税込み価格は【" & gaku + zei & "】です」"
End Sub
------------------------------------------------------------
Sub 消費税1()
    zei = Int(gaku * 0.05)
End Sub

画面22 Sub メイン1〜4 プロシージャ実行結果


[2]2プロシージャを別モジュールに記載の変数の有効範囲
変数をPublic で宣言すれば、全モジュールで有効になります。また、設定した変数に代入された値は、
その有効範囲内では新しい値の代入がなければそのまま残っているので注意が必要です。

Module1
Public gaku As Long   '価格
Public zei As Integer '消費税
------------------------------------------------------------
Sub 範囲2()
    msg = "購入品の価格を入力してください。"
    gaku = Application.InputBox(msg, "価格の指定", , Type:=1)
          Call 消費税2
    MsgBox "価格「" & gaku & "」の税込み価格は【" & gaku + zei & "】です」"
End Sub

Module2
Sub 消費税2()
zei = Int(gaku * 0.05)
End Sub

[3] Subプロシージャの引数で値を受けたケース
こちらも二つのプロシージャを別モジュールに記載ですが、変数をPublic で宣言を使用しないで、
引数に値を入れ(例:gaku)別プロシージャを呼び出し、引数で(例:aaa)で受け取ったケースです。
なお、送りの引数名と受けの引数名は特に同じにする必要はありません。

Module1
Sub 範囲3()
Dim gaku As Long   '価格
    msg = "購入品の価格を入力してください。"
    gaku = Application.InputBox(msg, "価格の指定", , Type:=1)
          Call 消費税3(gaku)
End Sub

Module2
Sub 消費税3(aaa As Long)
Dim zei As Integer '消費税
    zei = Int(aaa * 0.05)
MsgBox "価格「" & aaa & "」の税込み価格は【" & aaa + zei & "】です」"
End Sub

[4]Functionプロシージャで戻り値を返したケース
ユーザー定義関数をFunctionプロシージャで作成したケースで、引数に
数値(例:gaku)を入れFunctionプロシージャを実行すると、戻り値として(例:zei =)計算結果が返ってきます。

Sub 範囲4()
Dim gaku As Long   '価格
Dim zei As Integer '消費税
    msg = "購入品の価格を入力してください。"
    gaku = Application.InputBox(msg, "価格の指定", , Type:=1)
          zei = 消費税4(gaku)
    MsgBox "価格「" & gaku & "」の税込み価格は【" & gaku + zei & "】です」"
End Sub
------------------------------------------------------------
Function 消費税4(bbb As Long) As Integer
    消費税4 = Int(bbb * 0.05)
End Function

なおユーザー定義関数でありシートのセルに記入すればワークシート関数としても使用できます。
画面23の例はセルC2へ「=消費税4(100)」と入力すればそのセルには引数の計算結果の「5」が返ってきます。

画面23 ユーザー定義関数の使用例


[5]プロシージャが終了しても変数の値を保持する静的変数
プロシージャの中で宣言した変数は、プロシージャが終了するとクリアされます。
次回そのプロシージャが実行されるとき、変数宣言で初期化され前回の値は残っていません。なお、
[1]のモジュール内有効宣言、[2]のPublic宣言では変数の値は有効範囲内では残っているので注意してください。

プロシージャの中で宣言した変数内の値は、プロシージャ終了で消えますが、プロシージャが終了しても変数の
値を保持したい場合は静的変数Staticステートメントで宣言します。
この静的変数Staticは、モジュールの宣言セクション(プロシージャに含まないモジュールの一番上)に記述す
るとエラーになります。静的変数Staticはプロシージャレベルの変数としてしか宣言できません。

サンプルマクロ「静的変数1」実行例は画面24に示します。
本例の静的変数宣言の変数tst2は、更に実行すると、4・5・6と増えていきます。

画面24 サンプルマクロ「静的変数1」実行例


Sub 範囲5()
Dim i As Integer
  For i = 1 To 3
        Call 範囲5a
  Next
End Sub
------------------------------------------------------
Sub 範囲5a()
Dim tst1 As Integer
Static tst2 As Integer
    tst1 = tst1 + 1
    tst2 = tst2 + 1
MsgBox "tst1→" & tst1 & "   tst2→" & tst2
End Sub

【参考142】モジュール変数宣言で変数値が残っている実行例
「範囲6a」プロシージャの変数tst2・tst2共前の値が残っており、再度実行され場合その値に加算されます。

画面25 再実行で変数値が残っている例


Dim tst1 As Integer
Dim tst2 As Integer
 
Sub 範囲6()
Dim i As Integer
  For i = 1 To 3
        Call 範囲6a
  Next
End Sub
-------------------------------------------------------
Sub 範囲6a()
    tst1 = tst1 + 1
    tst2 = tst2 + 1
MsgBox "tst1→" & tst1 & "   tst2→" & tst2
End Sub
--------------------------------------------------------
Sub 範囲7()
    End
End Sub




(4)VBAで利用できるデータ型・範囲・サイズの一覧表
VBAにはいろいろなデータ型の変数があり、使用目的により使い分けます。主なデータ型については表8。

【表8 データの種類】


[1]一寸忘れた時見たい変数宣言の記載例
モジュールに上記のように記入すれば、Asを入力時点し1文字空けた時 「Integer」「String」などの次に入力で
きる文字がリストに表示されるので、リストから必要な文字をダブルクリックで入力すれば誤字がなく簡単に
入力できます。
 Public myaaa As Integer  '整数型(共通の場合)
    Dim mybbb As Integer     '整数型
    Dim mybb As Integer,myff As Integer,mygg As String
    Dim myccc(上限値) As Integer     '(配列の場合)
    Static myddd As Integer  '整数型(静的変数)
    Private myeee As Integer  '整数型

[2]一寸忘れた時見たい定数宣言の記載例
 定数の場合は、下記定数宣言の記載例のように変数の中身を固定した数値または文字列に代入して宣言し
ます。このように変数に「箱の中身を固定して入れ替え不可」と言う制限を付けたのが定数です。値の変える
必要の変数は定数として設定した方がスッキリしたマクロができます。
  Public Const myfff As Integer = 567    '共通定数
    Const myggg As Integer = 1234          '数値定数の例
    Const fff As String = "http://kuiryo.web.fc2.com/photo/"    '文字定数の例

【参考143】暗黙に宣言された変数とは
 一般的には使用目的によりデータ型の宣言を変えますが、宣言を忘れても、その場合は万能型の
[バリアント型」になりマクロは問題なく実行できます。
しかし、整数型(Integer)の2バイトに対し、バリアント型は16バイト+αとメモリを多く使用するので、できる限り
データ型宣言の省略は避けた方が良い。

【参考144】変数のデータ型宣言モレを防止したい場合
 
 最初の行に"Option Explicit"と記述しておけば宣言していない変数を使用した場合メッセ−ジが出ます。
 


[3]型宣言文字でもデータ型は指定できます
データ形式を指定する場合普通表8に示す表記で設定しますが、N-BASICころの昔は、表9に示すような「型宣
言文字」を変数名の後に付けてデータ型を特定していました。この型指定はExcelVBAでも使用可能です。
【表9 型宣言文字とデータ型】


この宣言文字に付いては最近のExcelバージョンでは「@」を付けると勝手にハイパーリンク付きの文字に変
わってしまうこともありできたら使用しない方がよい。ただし、他人の作成したマクロを見たとき変数の末尾に
この記号が付いており悩むケースも考えられるので、知識として覚えて置いた方がスキルアップにもなる。



【戻る】    【Top画面】   【HPへ】