変数・定数の有効範囲
LngRecRow = cInitRow にマウスカーソルを近づけてみて、何か気がつきましたか?(^^)
"Empty値" なんて出てますよね。なんでしょうコレ。
これはいわゆる"まったくカラの状態"を示してます。値も何も無い状態。
でも cInitRow は確かに定義してありますし、なぜなんでしょう?
この答も実は"場所"が重要なポイントとなっているんですね。
何がそれに関係しているかと言いますと
'*** 起動時のレコード行位置 ***
Const cInitRow = 2
'*** レコード行位置 ***
Dim LngRecRow As Long
この部分になるわけです。
つまり「変数・定数の宣言場所」が重要な意味を持っているのです。
変数や定数っていうのは、それぞれ"宣言している場所"によって、有効範囲が違って
くるのです。
有効範囲っていうのは、つまり"値を使ったり、参照したりできる範囲"のことです。
例えば通貨なんかを考えてみましょう。\ っていう通貨は、基本的に日本国内でしか
使うことはできませんよね?これがドルとかですと、国をまたいで使用できたりもし
ます。要はそんなことなのです。
今は Private Sub CmdTouroku_Click() ~ End Sub の間に
'*** 起動時のレコード行位置 ***
Const cInitRow = 2
'*** レコード行位置 ***
Dim LngRecRow As Long
が定義されていますが、"Sub ~ End Subの間で定義された変数・定数は、その中で
のみ有効となります【重要】
したがって例えば
Sub SyoriA()
Const TeisuA = 1
End Sub
とか定義されている定数を、処理Bで使いたいと思って
Sub SyoriB()
MsgBox(TeisuA)
End Sub
とかやってみても、処理Bからは見えません(使えません)
ちなみに上記のように Sub ~ End Sub で書かれた1つ1つの処理単位の事を
「プロシージャ」と呼びます。
今は"フォーム"という場所の中に Private Sub CmdTouroku_Click() と
Private Sub UserForm_Initialize() の2つのプロシージャが存在しますが、
この2つのプロシージャが書かれている1つの場所のことを「モジュール」と
言います。
これはいろんな言い方がありますが(^^;)
例えば「プロシージャが集まったものがモジュールだ」とか。
だったら「プロシージャが1つしか無ければモジュールとは言わんのか」と言われ
れば、そんなことないですし・・・
ですので、"まずはじめにモジュールありき"なんですよね。モジュールという作業
スペースを用意しておいて、そこにプロシージャという1つの処理単位を、いくつ
も書いていくという。
先程、定数・変数の宣言で「通貨」の例を出しましたが、またたとえて言うならば、
「モジュールが "国" で、プロシージャが "各都道府県"」という感じでしょうか。
再び話を戻しますが・・・
上記の処理Aと処理Bのように、処理Aの中で定義された定数は、そのままの状態
では、処理Bからは見ることができません。この場合、どこに定義を書けばいいか
と言えば「その外に書けばよい」ということになります。
「外」ってどこでしょう?
Private Sub UserForm_Initialize() の処理を書く際に、右側のコンボボックスを
動かしましたよね d(^-^ ) (Click → Intitialize に変更した)
今度は左側のコンボボックスをクリックして「(General)」という表示に切り替えて
みましょう。
どうですか? カーソルの位置が Private Sub CmdTouroku_Click() の上に来ていま
すよね。そして右側のコンボボックスの値が「(Declarations)」に変化していると
思います。
この場所がいわゆる「外」ということになります。
そしてこの場所に
'*** 起動時のレコード行位置 ***
Const cInitRow = 2
'*** レコード行位置 ***
Dim LngRecRow As Long
と入力してみて下さい。そして Private Sub CmdTouroku_Click() の中にある
'*** 起動時のレコード行位置 ***
Const cInitRow = 2
'*** レコード行位置 ***
Dim LngRecRow As Long
は、先頭に ' を入れてコメント行にしておいて下さい。
そうすると全体のコードは
'*** 起動時のレコード行位置 ***
Const cInitRow = 2
'*** レコード行位置 ***
Dim LngRecRow As Long
Private Sub CmdTouroku_Click()
'*** データ列の定義 ***
Const cNameDataCol = 1 '氏名
Const cMailDataCol = 2 'メールアドレス
Const cBirthDataCol = 3 '誕生日
' '*** 起動時のレコード行位置 ***
' Const cInitRow = 2
'
' '*** レコード行位置 ***
' Dim LngRecRow As Long
'
'*** データ登録処理 ***
Cells(LngRecRow, cNameDataCol).Value = TxtName.Text
Cells(LngRecRow, cMailDataCol).Value = TxtEmail.Text
Cells(LngRecRow, cBirthDataCol).Value = TxtBirthday.Text
'*** 行位置を下に移動 ***
LngRecRow = LngRecRow + 1
'*** テキストボックスの値クリア ***
TxtName.Text = ""
TxtEmail.Text = ""
TxtBirthday.Text = ""
End Sub
Private Sub UserForm_Initialize()
'*** 行位置の初期化 ***
LngRecRow = cInitRow
End Sub
となりますね。これで実行してみましょう。
すると・・・、おぉぉ~!!動いたではないですか。パチパチパチ(^。^*)
さて、なぜ動いたのでしょう?ポイントはどこに?
その解説は次回のお楽しみ~♪(^^)/~
|
|
TOP > VBAでラクしたい ~Part 2~
|
|