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

VBAでラクしたい ~Part 2~

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

「登録」「前のレコードに移動」ボタンを仕上げる

オプションボタンの処理が出来上がってしまいましたので、今度は何から手をつけましょうか。

やっぱりもうほとんど出来上がってるものから、仕上げていくことにしましょう(^-^;

「登録」ボタンの処理は、もうここまで出来ていましたよね↓

-----------------------------------------------------------------------------------------
Private Sub CmdTouroku_Click()

    '*** データ登録処理 ***
    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
-----------------------------------------------------------------------------------------

あとはコレに足りないものは「レコード件数表示」の部分だけです。
では、やってみましょう。

    '*** データ登録処理 ***
    '*** 行位置を下に移動 ***
    '*** テキストボックスの値クリア ***

と順にきてますね。この後に処理を書くということは、この時点で"新しいレコードは登録済"の状
態ですよね。ということは、この時点で数えたレコード件数(見出し行分は除く)が"純粋な全レコ
ード件数"ということになります。

そして「新規登録」の場合は必ず"登録済件数 + 1"を示しますから

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

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

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

の処理を追加すれば良いことになります。

従って
-----------------------------------------------------------------------------------------
Private Sub CmdTouroku_Click()

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

End Sub
-----------------------------------------------------------------------------------------

で、いいですよねヽ(^-^ )

これも動作を確認してみて下さい。ちゃんと一番最後の行の下にレコードが追加されますか?
レコードを追加した後に「修正/削除」モードに切り替えた時、今入力したレコードが表示されま
すか?

私の方も特に動作は問題無さそぉでしたので、次いきます(^^;)


それでは次に、これまた作りかけ状態でした CmdPrev_Click の方を仕上げていきましょうか。

一応、仕様を確認しておきますけど
-----------------------------------------------------------------------------------------
◆「前のレコードに移動」ボタン クリック時
1.現在位置よりも1つ前にレコードが存在するか調べる
2.存在する場合は現在位置の変数を -1 し、該当するレコードを表示する
3.    〃        現在のレコード位置表示を更新する
4.存在しない場合はそのまま現在のレコードを表示する
-----------------------------------------------------------------------------------------

ということで、1,2,4の処理までは既に作成しておりました

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

実際に動かしてみると、ちゃんと1つずつ前のレコードがフォームに表示されていきますよね。
そして見出し行の前(つまり先頭レコード)まで来たら、それ以上前は表示されないようにもなっ
ているはずです。

そうするとあと足りないのは3の処理だけですので、この処理を追加しましょう。

まずは"全レコード件数"を調べる必要がありますよね。これを調べるのは

    '*** 登録済のレコード件数取得(見出し行分除く) ***
    LngAllRecCnt = Range("A1").CurrentRegion.Rows.Count - 1

であることは前に書いた通りです。ここでもこれを流用できますヽ(^-^ )

そうしますと表示用の変数への代入も

    '*** 表示用レコード数を変数にセット ***
    LngAllRecCntDsp = LngAllRecCnt   '全レコード件数

で、いいことになりますよね。この辺は大丈夫ですか? d(^-^ )


そして"現在のレコード番号"はどうやって取得すればいいでしょうか。

"現在のレコード行位置"を示している変数は LngRecRow ですよね。これは"見出し行"分を含めて
カウントされた値が入っていますから、例えば2行目に入っているレコードのレコード番号は1に
なりますし、3行目は番号2になります。

ということは

    LngRecRow - 1 (見出し行分) ・・・現在のレコード番号

となります。従って

    LngCurRecNumDsp = LngRecRow - 1  '現在のレコード番号

となればいいことになりますね。あとは

    '*** レコード件数表示 ***
    LblRecCnt.Caption = LngCurRecNumDsp & "件目/全" & LngAllRecCntDsp & "件"

を後ろにくっつければレコード表示はOKですから、ここまでをまとめると


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

となります。これを追加した処理はこんな感じになりますね。
-----------------------------------------------------------------------------------------
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
-----------------------------------------------------------------------------------------

いかがでしょうか。実行したらその通りに動きましたか?(^^ ?)

書いたコードをそのまま流用できてしまいますので、今回はだいぶラクでしたよね。
LngRecRow から見出し行分の1を引くとか、その辺さえ間違わなければ正しい動きはしてくれたは
ずです。

う~む、今回は特にバグなど出ないような展開だったから、やたらとスマートな内容になってしま
った感がありますねぃ(^^;)

やはりここは多少なりともつまづきながらいった方が、私らしくていいかも。
#なのか? (^_^;



それでは次回までごきげんよぉ~♪(^^)/~


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