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

VBAでラクしたい ~Part 2~

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

変数・定数の有効範囲

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


となりますね。これで実行してみましょう。

すると・・・、おぉぉ~!!動いたではないですか。パチパチパチ(^。^*)

さて、なぜ動いたのでしょう?ポイントはどこに?


その解説は次回のお楽しみ~♪(^^)/~


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