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

VBAでラクしたい ~Part 2~

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

前に移動してみる

前回はデータをフォームに表示するとこまでこぎつけました。

しかし余談ではありますが、"データ"っていう言い方はチョット意味が広すぎるんですね。
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^)


以上今回はここまで~♪(^^)/~


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