マクロでいこう! ~ Excel活用HomePage ~

VBAでラクしたい ~Part 2~

こちらのコーナーでは、VBAの使い方を中心にご紹介していきます。
作者自身の経験から書いておりますので、本とかとは違ったコトを
書いてるトコロもあるかもしれません。 そういう場合は、良さそうな方を信じましょう(^_^;
TOPVBAでラクしたい ~Part 2~ > ローカル?パブリック?

ローカル?パブリック?

さてさて、前回ようやく思い通りの動きをさせることに成功しましたね(^-^)

ポイントは「変数・定数の宣言場所」でした。今回はその部分について解説をしてみたいと
思います。


今までは"変数・定数の宣言"というと、必ずプロシージャの中(Sub と End Sub の間)に
書いておりました。
1つの流れで完結してしまう処理(実行したら一気に最後まで流れていい処理)であれば
それでもよかったのですが、複数に分割した処理間で共通の値(変数・定数)を使いたい
というケースになりますと、あらかじめ使う範囲をキチンと決めておいて、それに合った
宣言の仕方をせねばなりません。

例えば今回のケースのように CmdTouroku_Click() と UserForm_Initialize() の2個所で
LngRecRow , cInitRow を使うとなれば、あらかじめその2つの処理で使うことのできる場所
で宣言しておく必要があった、ということになります。

ではこの2つの処理で使用できるような宣言場所ってどこだったのか、といえば前回やって
みました「(General) (Declarations)」だったわけです。

この場所で宣言された変数・定数っていうのは、基本的に「そのモジュール内のプロシージャ
全てで使用することができる」のです。ですから、宣言場所をここに移したことによって、
2つの処理で問題なくデータの参照が行えたということになります。

プロシージャの中だけで使用できる変数・定数を定義することを、一般的には「ローカルで
定義する」なんていう言い方をします。モジュール内のプロシージャ全てで使える定義も、
モジュールレベルで見れば、まぁ「ローカル」っていうことにはなりますよね。いわゆる
使用範囲がキチっと決まっている状態が「ローカルでの宣言」であると見てさしつかえは
無いかと思います(^^;)

でも例えばこれらの値を、標準モジュール「Module1」内にある
Sub FormOpen()
    FrmDataInput.Show
End Sub

で使用したいとなった場合どうすればいいでしょうか?

先程の書き方ですと、FrmDataInputのフォームモジュール内でしか使うことができません。
例えば上記のコードに
Sub FormOpen()
    MsgBox(cInitRow)
    FrmDataInput.Show
End Sub

なんてやってみるとわかりますよね?(^^
cInitRow の値が見えない状態ですから、当然メッセージボックスには何も表示されません。

これを解決するのが「パブリックでの宣言」になりますヽ(^-^ )

試しに今のフォームの「General Decralations」にある

    '*** 起動時のレコード行位置 ***
    Const cInitRow = 2

をコメントにして、標準モジュール「Module1」の「General Decralations」に

    '*** 起動時のレコード行位置 ***
    Public Const cInitRow = 2

と書いてみて下さい。

どうですか? まず最初にメッセージボックスに「2」と表示されましたよね。
そしてフォームからデータを入力する動作も、何も問題ナシでしたよね。

つまり "Public" で宣言したことにより、1つの定数がモジュールをまたいで使用できる
ようになったわけです。ちなみに定数をPublicで宣言するときには、"標準モジュール内"で
ないとできません。わざわざ場所を移動したのはそのためです。試しにフォームモジュール
内に書いてある定数定義の頭に Public をつけて実行してみて下さい。
・・・・エラーが出ましたよね? そういうキマリなのです(^^;)

ところが変数の場合は、フォームモジュールの「General Decralations」でも宣言できるん
ですよね(^^;)ややこしいことに。

ですが基本的に Public で宣言する場合は、標準モジュールに書くことをオススメします。
小さなプログラムを書いているうちはいいのですが、規模が大きくなるほど宣言すべき変数
・定数が増えてくるものです。当然モジュールの数も増えてきます。
ローカルで使うものはいいとして、共通で使うものは一個所に集めておかないと、「この変数
ってどのモジュールで定義してたっけ?」なんていうことにもなりかねません(^-^;)

そうしますと、とっ散らかったプログラムになってしまいデバッグもし辛くなります。

ですので、宣言の際はなるべくそういう部分にも気をつかえるようにしていきましょうd(^-^


さてデータを1件ずつ追加する処理は出来ましたので、次回は"前のレコード&次のレコード"
ボタンの処理を作っていきましょうか。


以上今回はここまで~♪(^^)/~


TOPVBAでラクしたい ~Part 2~
Copyright (C) 2006 マクロでいこう!. All Rights Reserved.