前に移動してみる
前回はデータをフォームに表示するとこまでこぎつけました。
しかし余談ではありますが、"データ"っていう言い方はチョット意味が広すぎるんですね。
1件でもデータだし、全体をひっくるめてもデータだし・・・。
ということで、これからの説明では1件ずつのデータを指すときには「レコード」と呼ぶ
ことに致します。これはデータベースの世界ではごく日常的な言葉です。
例えば「10個のデータ」とか言うんぢゃなくて「10件のレコード」と言えば、「あぁ
なるほど10件登録されてるわけね」とすぐわかるわけです。
「10個のデータ」っていうと、何が10個なのかよくわかりませんよね?
1件当たりの入力項目が10個なのか、まとまったデータファイルが10個あるのか等、
どんなふうにでも解釈できてしまいます。
ということで、1件1件のデータは「レコード」と呼ぶようにいたしますので、ひとつ
よろしくお願いしますです<(_ _)>
さてそのレコードの表示ですが、起動時には一番先頭のレコードがフォームに表示されて
いる状態です。今度はボタンをクリックすることにより、前後のレコードを表示する機能
を追加してみることにしましょう。
一番最初に決めた仕様は下記の通りでしたよねヽ(^-^ )
・"次のレコードに移動"ボタンで次のレコードを表示
・"前のレコードに移動"ボタンで前のレコードを表示
これに沿って処理を書いてみることにしましょう。
まずは「前のレコードに移動」ボタンの処理から
「前のレコードに移動」ボタンのオブジェクト名は「CmdPrev」に既に変えてあります。
このボタンがクリックされた時の処理ですから
Private Sub CmdPrev_Click()
End Sub
に書けばいいことはもうおわかりですよね? そして次にどうするか。
現在のレコード行位置は、変数LngRecRow に格納されています。ということは、LngRecRow
の値を -1 すれば、前のレコードの位置を示せることになりますよね。
Private Sub CmdPrev_Click()
'*** 現在のレコード位置より1つ前 ***
LngRecRow = LngRecRow - 1
'*** レコード表示処理 ***
TxtName.Text = Cells(LngRecRow , cNameDataCol).Value
TxtEmail.Text = Cells(LngRecRow , cMailDataCol).Value
TxtBirthday.Text = Cells(LngRecRow , cBirthDataCol).Value
End Sub
さぁ、これでどうでしょう?
試しに何件かレコードを登録した後に「前のレコードに移動」ボタンをクリックして、
キチンと表示されるかどうか見てみて下さい。
一見問題無さそうにも見えますよね? でも何度か動かしていくうちに、何かにお気づき
になると思います(^^;)
表示レコードを前に前に送っていくうちに、なぜか見出し部分がフォームに表示されちゃい
ました。更に前を表示しようとしたらエラーが発生しましたヽ( ´ー`)丿
ボタンがクリックされるたびに LngRecRow は -1 されるわけですから、そのままだと 1
にも 0 にもなってしまいます。0行なんていう指定は出来ませんから、当然そこでエラー
で落っこちてしまうわけです。
こうならないためにはどうすればいいでしょう?
現在の処理は
"前のレコード"ボタンをクリック
↓
LngRecRow を -1 する
↓
レコードをフォームに表示
という流れになっていますが、この変数LngRecRowの"現在の状態"がポイントになってきます。
それはなぜか。例えば現在の入力行位置が3行目(つまりLngRecRowの値が3)であれば、-1
しても問題はありません。
ところが現在2行目を指している場合どうでしょう? -1すれば、次に指すのは見出し行の
位置になりますよね。見出し行はレコードではありませんから、これは表示させたくないわけ
です。ということは
「LngRecRow の値が見出し行位置の値より小さくならないようにすればいい」
ということになりますね。
今回の例で考えますと、まず見出し行位置は 1 です。レコード開始行位置は 2 です。
前のレコードに戻るには現在の行位置の値を -1 しますから、その時に"見出し行位置に重な
らない"、つまり "-1しても 1 にならない"ようにしなくてはなりません。
ということは、あらかじめ見出し行位置の値に +1 したものと比較して、それより現在の行
位置の値が大きければ -1 する、ってことにすればいいわけです。おわかりでしょうか?(^^;
したがって
"前のレコード"ボタンをクリック
↓ No
LngRecRow > 見出し行 + 1 か判断する →↓
↓yes ↓
LngRecRow を -1 する ↓
↓←←←←←←←←←←←
レコードをフォームに表示
という流れになるわけです。
そうしますと、見出し行位置も定数で持っておきたいですよね。
直接 1 とかプログラム中に書くのはやめておきませう(^^)
なので、一番上の宣言部に
'*** 見出し行位置 ***
Const cMidasiRow = 1
を追加しておきましょう。
Private Sub CmdPrev_Click()
'*** 現在のレコード位置より1つ前 ***
If LngRecRow > cMidasiRow + 1 Then
LngRecRow = LngRecRow - 1
End If
'*** レコード表示処理 ***
TxtName.Text = Cells(LngRecRow, cNameDataCol).Value
TxtEmail.Text = Cells(LngRecRow, cMailDataCol).Value
TxtBirthday.Text = Cells(LngRecRow, cBirthDataCol).Value
End Sub
こうするとどうですか?レコード開始行より上は表示しなくなりましたよね?(^o^)
以上今回はここまで~♪(^^)/~
|
|
TOP > VBAでラクしたい ~Part 2~
|
|