処理の実行個所を変更
前回、処理がうまく動かなかった原因は皆さん分かりましたか?
ここからは、プログラムを一部修正しながら進めていくことになりますので、
"なぜそうする必要があるのか"ということについて、しっかり理解できるよう
努力しませう(^^;)
まずは動かなかった原因について。
データの登録処理を行った後、入力位置を下にずらす処理をしていますよね。
'*** 行位置を下に移動 ***
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
さてそれでは実行してみましょう。
・・・ぎぇぇぇっ!! エラーが発生したではないですか。
処理を移動してあげたのに、なぜに動かないの???(^_^;)???
と、誰もが思うはず。
その謎解きは明日までのお楽しみ(( ((( ヽ(;^^)ノ
|
|
TOP > VBAでラクしたい ~Part 2~
|
|