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

VBAでラクしたい ~Part 2~

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

処理の実行個所を変更

前回、処理がうまく動かなかった原因は皆さん分かりましたか?

ここからは、プログラムを一部修正しながら進めていくことになりますので、
"なぜそうする必要があるのか"ということについて、しっかり理解できるよう
努力しませう(^^;)

まずは動かなかった原因について。

データの登録処理を行った後、入力位置を下にずらす処理をしていますよね。

'*** 行位置を下に移動 ***
LngRecRow = LngRecRow + 1

ところが、次に再び登録ボタンをクリックした時には、まず

'*** 行位置の初期化 ***
LngRecRow = cInitRow

の処理を通ってきてしまうわけです。
したがってこのままですと、登録がクリックされる度に入力位置が初期化されて
しまうため、入力位置はずーーっと変わらないというわけです。

これではいけませんので、初期化のタイミングを変えてやらねばなりません。
さて、いつがいいでしょう?

入力位置の初期化というのは、最初にフォームが起動した時だけ行なえば充分です。

そういう"イベント"が発生した時に実行されるように、処理を書いてやればいいで
すよね。そのイベントとはどこにあるのでしょう?

その答はフォームにありました。

とりあえずフォームをダブルクリックしてみて下さい。

Private Sub UserForm_Click()
    
End Sub

というようなコードが出現したと思います。

これはどんなイベントを表しているか、なんとなく分かります?
"Click" ですので、左ボタン1回クリックを示しています。「ダブルクリック」も
ちゃんと別に用意されてますよ。あとで探してみて下さい(^^)

ということで、これは「フォームが左ボタン1回クリックされた時」に処理を実行
するためのコードになります。ってことは、ここでは関係ないですよね(^^;)
なので、目的のイベントに切り替えてみませう。

今、「UserForm」と「Click」っていうのが、コンボボックスで表示されてますけど、
その「Click」と表示されているコンボボックスのボタンをクリックして、プルダウ
ンメニューを表示させてみて下さい。"プルダウンメニュー"っていうのは、クリック
した時に下にびろーんと伸びるリストのことです(^o^;)

で、その中に「Initialize」というイベントがあると思います。

このイベントはExcel97のヘルプによりますと、こんなふうに書いてあります。

"オブジェクトが読み込まれたあとで、そのオブジェクトが表示される前に発生します"

#なんのこっちゃ分かりましたか?(^-^;)

オブジェクトっていうのは、いわゆるフォームだったりコントロールだったりするわけ
ですが、例えばそれらが「表示」される時には、必ず一度は「読み込み」っていう過程
を通っているんです。
あえて"一度は"って書いたのは、読み込んだ状態を保持しつつ、フォームの表示・非表
示だけを切り替える場合があるためで、その場合は必ずしも毎回「読み込み」っていう
過程を通るわけではないということです。
#この辺については、また回を改めて補足説明が必要な部分かとは思っています。

とりあえず今取り上げる例では

Show →フォームの読み込み→フォームを表示

という流れなんだなと思っておいてください

で、その「Intitialize」っていうイベントはこの場合「フォームが読み込まれた後で、
フォームが表示される前に発生する」ということになります。

そこで、プルダウンメニューから「Initialize」を選択すると

Private Sub UserForm_Initialize()
    
End Sub

が出現すると思いますので、ここに初期化処理だけ移動してやることにしましょう。

行位置の初期化処理は

'*** 行位置の初期化 ***
LngRecRow = cInitRow

で、行っていますよね。したがって下記のように、2つに分ければいいのではないか
と予想されるわけです。

Private Sub UserForm_Initialize()
     
    '*** 行位置の初期化 ***
    LngRecRow = cInitRow
    
End Sub


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

さてそれでは実行してみましょう。

・・・ぎぇぇぇっ!! エラーが発生したではないですか。

処理を移動してあげたのに、なぜに動かないの???(^_^;)???
と、誰もが思うはず。


その謎解きは明日までのお楽しみ(( ((( ヽ(;^^)ノ


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