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

VBAでラクしたい ~Part 2~

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

「削除」ボタンの処理の続き

前回は最終レコードを削除した場合の処理まで書きました。

今回は残りの処理まで一気に書いてしまってから説明をしていきたいと思います(^-^;

-----------------------------------------------------------------------------------------
Private Sub CmdDelete_Click()
    '*** 現在表示されているレコードを削除し、以下のレコードを上に繰り上げる ***
    Rows(LngRecRow).Select
    Selection.Delete Shift:=xlUp
    
    '*** 現在行位置が全レコード数を越える場合 ***
    If LngRecRow > LngAllRecCnt Then
        '*** 現在行位置を全レコード数に合わせる ***
        LngRecRow = LngAllRecCnt
    End If
    '*** 現在行位置が見出し行位置と同じ場合(レコード数ゼロ)
    If LngRecRow = cMidasiRow Then
        '*** 空白表示処理 ***
        TxtName.Text = ""
        TxtEmail.Text = ""
        TxtBirthday.Text = ""
        
    Else
        '*** レコード表示処理 ***
        TxtName.Text = Cells(LngRecRow, cNameDataCol).Value
        TxtEmail.Text = Cells(LngRecRow, cMailDataCol).Value
        TxtBirthday.Text = Cells(LngRecRow, cBirthDataCol).Value
    End If

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

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


'*** 登録済のレコード件数取得(見出し行分除く) *** 以下の部分については、同じものを流用し
ていますから、もう内容はお分かりですよね。

その他の部分に関しても特に目新しいコードは書いておりませんので、この流れに沿って各変数の
値がどのように変化していくのかを見ていくことにしましょう。

その方が処理の流れもつかみやすいと思うので。


まずは 5件目/全5件 の時に 5件目(最終レコード)を削除した場合。

レコード番号が5件目ということは、LngRecRowの値は見出し行分をプラスして 6 ということに
なります。

    Rows(LngRecRow).Select
    Selection.Delete Shift:=xlUp

すなわち

    Rows(6).Select
    Selection.Delete Shift:=xlUp

ということですね。

次に全レコード数はいくつでしょう? 現時点では値の更新をしていませんので、まだ 5 のまま
です。ちなみにこの 5 はレコード番号のように見出し行分などは含まれていません。純粋に件数
を示していますよね。

ということは

    '*** 現在行位置が全レコード数を越える場合 ***
    If LngRecRow > LngAllRecCnt Then

LngRecRow は 6、LngAllRecCnt は 5 になりますから、Then以下を実行することになります。

        '*** 現在行位置を全レコード数に合わせる ***
        LngRecRow = LngAllRecCnt
    End If

ここで LngRecRow 、LngAllRecCnt 共に 5 となるわけです。


次に
    '*** 現在行位置が見出し行位置と同じ場合(レコード数ゼロ)
    If LngRecRow = cMidasiRow Then

という部分については LngRecRow が 5、cMidasiRow が 1ですから = にはならないですね。
従って Else 以下の部分を実行することになります。

        '*** レコード表示処理 ***
        TxtName.Text = Cells(LngRecRow, cNameDataCol).Value
        TxtEmail.Text = Cells(LngRecRow, cMailDataCol).Value
        TxtBirthday.Text = Cells(LngRecRow, cBirthDataCol).Value

ここでおや?と気づいた貴方はスルドイ。

LngRecRow の値は現在 5 です。5 ということはレコード番号で言えば 4件目です。

そうかなるほど! "全レコード件数は最終レコード番号の1つ前とイコールの関係"なんだ。
だから LngRecRow = LngAllRecCnt とすることで、最終レコードの1つ前を自動的に表示できるの
かぁぁぁ。

ということなのです。


そしてその後、

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

としてレコード件数を取得し直すことで、LngAllRecCnt の値は 4 に更新されます。そして

    '*** 表示用レコード数を変数にセット ***
    LngAllRecCntDsp = LngAllRecCnt   '全レコード件数
    LngCurRecNumDsp = LngRecRow - 1  '現在のレコード番号

LngAllRecCnt は 4 ですから、"全4件"
LngRecRow は 5 ですから -1 して 4。従って "4件目"

この値を表示すれば 4件目/全4件 となるわけです。


どうですか?こうして流れを追っていけば、あぁなるほどという感じになりますよねヽ(^-^ )


ちなみに補足しますと

    '*** 現在行位置が全レコード数を越える場合 ***

というのはどういう場合かと言えば、"最終レコードを操作対象としている場合"だけです

全レコード件数が5件であれば、レコード番号が5の時 LngRecRow は 6 になりますよね。
同じ状況でレコード番号が 4 であれば、LngRecRow は 5 になります。
よって

      LngRecRow > LngAllRecCnt

であるための条件は、最終レコードを操作対象としているとき、となるわけです。

この流れを踏まえて"2件目/全5件"や"1件目/全5件"などの場合どういうふうに値が変化
していくか、ご自分で追ってみて下さいましヽ(^-^ )



でわ来週までごきげんよぉ~(^o^)/~


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