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

VBAでラクしたい ~Part 2~

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

「次のレコードに移動」ボタンの処理

本日は会社に来るのが少々遅くなりまして、更新予定時刻を過ぎてしまいました。
#スミマセンです(_ _;)

よっぽど会社休もうとも思ったのですが・・・



さて今回は「次のレコードに移動」ボタンの処理についてみていきましょう。

とは言っても、もう既に「前のレコードに移動」ボタンは出来ているわけですから、あとはそれを
流用してちょこちょこっと修正すれば使えそうな気がしてくるわけです(^^;)


まずは「前のレコードに移動」「次のレコードに移動」それぞれの仕様を見比べてみましょうか。
-----------------------------------------------------------------------------------------
◆「前のレコードに移動」ボタン クリック時
1.現在位置よりも1つ前にレコードが存在するか調べる
2.存在する場合は現在位置の変数を -1 し、該当するレコードを表示する
3.    〃        現在のレコード位置表示を更新する
4.存在しない場合はそのまま現在のレコードを表示する

◆「次のレコードに移動」ボタン クリック時
1.現在位置よりも1つ後にレコードが存在するか調べる
2.存在する場合は現在位置の変数を +1 し、該当するレコードを表示する
3.    〃        現在のレコード位置表示を更新する
4.存在しない場合はそのまま現在のレコードを表示する
-----------------------------------------------------------------------------------------

違いがわかりましたか?ヽ(^-^ )

1に関しては、レコードの存在確認が"1つ前"なのか"1つ後"なのかってとこだけですよね。
そしてその次の2については、1の処理に対応して -1 と +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

    '*** 登録済のレコード件数取得(見出し行分除く) ***
    LngAllRecCnt = Range("A1").CurrentRegion.Rows.Count - 1
    '*** 表示用レコード数を変数にセット ***
    LngAllRecCntDsp = LngAllRecCnt   '全レコード件数
    LngCurRecNumDsp = LngRecRow - 1  '現在のレコード番号
    '*** レコード件数表示 ***
    LblRecCnt.Caption = LngCurRecNumDsp & "件目/全" & LngAllRecCntDsp & "件"

End Sub

-----------------------------------------------------------------------------------------

そして次に CmdNext_Click の処理の部分に上記のコードをコピー&ペーストしてしまいましょう。

Private Sub CmdNext_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

    '*** 登録済のレコード件数取得(見出し行分除く) ***
    LngAllRecCnt = Range("A1").CurrentRegion.Rows.Count - 1
    '*** 表示用レコード数を変数にセット ***
    LngAllRecCntDsp = LngAllRecCnt   '全レコード件数
    LngCurRecNumDsp = LngRecRow - 1  '現在のレコード番号
    '*** レコード件数表示 ***
    LblRecCnt.Caption = LngCurRecNumDsp & "件目/全" & LngAllRecCntDsp & "件"
End Sub


そうしたら上から順番に改造していきます。

    '*** 現在のレコード位置より1つ前 ***

これは当然

    '*** 現在のレコード位置より1つ後 ***

になりますね

で、「前のレコードに移動」の処理の際には、"現在位置よりも1つ前にレコードが存在するか"を
調べるのに、何の値を見にいってたでしょう?

「見出し行」の値ですよね。ヽ(^-^ )

見出し行数は1ですから、それに1をプラスすると2。とすると、現在の行位置が2以上であれば
行位置を -1 してもOK。入力範囲を超えないようになるというわけです。


さて反対に「1つ後に・・・」という場合は何を調べたらよろしいのでしょう?(・_・?)

仮に「データ登録時には「氏名」の列に必ず値を入力すること」というキマリになっているとすれ
ば、当然そこが空白になっていれば"データの終わり"ってことになりますよね。
具体的に書くと

If Cells(LngRecRow + 1,cNameDataCol).Value <> "" Then ....

とかいう方法でも調べることはできます。

ですけれども、何か他に「レコードの終わりの位置」を示しているものってありませんでしたっけ?

そうです、「全レコード件数」がありますよね。(^-^)

これと現在位置を比較してやれば、特に別な値を調べにいかなくても済んでしまいます。それに
結果は同じだからといって適当に条件判断処理を入れてしまうと、規則性も無くなってしまうため
デバッグがしづらくなる、ということもあります(^^;)

ということで、ここは"全レコード件数"を使った条件判断を書いてみましょう。


    '*** 現在のレコード位置より1つ後 ***
    If LngRecRow < LngAllRecCnt + 1 Then
       LngRecRow = LngRecRow + 1
    End If   

比較してみても「前のレコードに移動」の処理とほとんど変わってませんね。
違っている点といえば、比較する対象が"全レコード件数を示す変数"になっているということ。
その変数の値に見出し行の1をプラスして、その値よりもLngRecRowが小さければ、次の位置に
移動可、というわけですね。この辺は大丈夫でしょうか?


ここだけ変えればあとはそのまんまです(^^;)
-----------------------------------------------------------------------------------------

Private Sub CmdNext_Click()
    '*** 現在のレコード位置より1つ後 ***
    If LngRecRow < LngAllRecCnt + 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

    '*** 登録済のレコード件数取得(見出し行分除く) ***
    LngAllRecCnt = Range("A1").CurrentRegion.Rows.Count - 1
    '*** 表示用レコード数を変数にセット ***
    LngAllRecCntDsp = LngAllRecCnt   '全レコード件数
    LngCurRecNumDsp = LngRecRow - 1  '現在のレコード番号
    '*** レコード件数表示 ***
    LblRecCnt.Caption = LngCurRecNumDsp & "件目/全" & LngAllRecCntDsp & "件"
End Sub

-----------------------------------------------------------------------------------------

もっと他に直すと思いました?(^^)

なぜ他は直さなくていいのか、ってことについてもコードを読みながら考えてみると、それも勉強
になると思いますよ d(^-^ )


それでは次回までごきげんよぉ~♪


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