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

VBAでラクしたい ~Part 2~

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

オプションボタンの処理を仕上げる


レコード件数も表示されたし、オプションボタンの処理としてはこれでおっけーなのでは?
とお思いの方も多いと思いますが、ん?何かヘンだぞ、とお気づきの方もいらっしゃるはず。

フォームを起動して「新規」と「修正/削除」モードを交互に切り替えてみて下さい。

何か分かりましたか?

そうです。「新規」モードに切り替えた時はフォームは空白表示で間違いないのですが、「修正/
削除」モード時は登録済の最終レコード番号を指しますから、そのレコードが表示されていない
のはおかしいですよね?(^-^;

「む?そういうレコードを表示する、なんてのは仕様にないぞ」と考えた貴方はスルドイ。
これは私の中で欠落していた部分です(( ((( ヽ(;^^)ノ

気を取り直して処理を追加してみましょう(^-^;Aアセアセ

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

Private Sub OptUpdMode_Click()
    '*** ボタンの使用状態の切替 ***
    CmdTouroku.Enabled = False '登録(不可)
    CmdUpdate.Enabled = True   '修正(可)
    CmdDelete.Enabled = True   '削除(可)
    
    '登録済のレコード件数取得(見出し行分除く)
    LngAllRecCnt = Range("A1").CurrentRegion.Rows.Count - 1
    '表示用レコード数を変数にセット
    LngCurRecNumDsp = LngAllRecCnt   '現在のレコード番号
    LngAllRecCntDsp = LngAllRecCnt   '全レコード件数
    'レコード件数表示
    LblRecCnt.Caption = LngCurRecNumDsp & "件目/全 " & LngAllRecCntDsp & "件"

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

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

レコード表示処理については CmdPrev_Click で書いたものを流用しています。

さぁ、これでフォームに表示できるはずですね。やってみましょう。


「・・・・あのぉ~、1件目しか表示されないんですけどぉ~」

そんな声が聞こえてきそうな今日この頃。

こうなってしまっているのはなぜでしょう?レコード番号は確かに最終レコードを指しているのに、表示は変わらないなんて・・・。

ヒントは表示用と処理用の変数を分けたことにあります。もう一度前回のコードを眺めてみて下さ
い。

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

Private Sub OptAddMode_Click()
    
    '*** ボタンの使用状態の切替 ***
    CmdTouroku.Enabled = True   '登録(可)
    CmdUpdate.Enabled = False   '修正(不可)
    CmdDelete.Enabled = False   '削除(不可)

    '*** テキストボックスの値クリア ***
    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

Private Sub OptUpdMode_Click()
    '*** ボタンの使用状態の切替 ***
    CmdTouroku.Enabled = False '登録(不可)
    CmdUpdate.Enabled = True   '修正(可)
    CmdDelete.Enabled = True   '削除(可)
    
    '登録済のレコード件数取得(見出し行分除く)
    LngAllRecCnt = Range("A1").CurrentRegion.Rows.Count - 1
    '表示用レコード数を変数にセット
    LngCurRecNumDsp = LngAllRecCnt   '現在のレコード番号
    LngAllRecCntDsp = LngAllRecCnt   '全レコード件数
    
    'レコード件数表示
    LblRecCnt.Caption = LngCurRecNumDsp & "件目/全" & LngAllRecCntDsp & "件"

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

End Sub

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

なんとなくお気づきになりましたでしょうか?

要は"表示用のレコード番号だけ更新して、処理用のレコード番号を更新していなかった"ことが
問題だったということです。

処理用のレコード番号変数は LngRecRow ですが、上記を見るとその値は更新されないまま放置さ
れていることがわかります。にもかかわらず、レコード表示処理ではその変数を見にいっているた
め、初期値の行位置のレコードしか表示されない、すなわち1番目のレコードしか表示されない
現象が起きているのです。

それでは処理用のレコード番号変数も更新するとしましょう。

    'レコード追加・編集位置を更新
    LngRecRow = LngCurRecNumDsp + 1

これを "表示用レコード数を変数にセット" の処理の後に追加してみて下さい。

え?「なんでわざわざ LngCurRecNumDsp の値を使って、なおかつ +1 しているのか」って?

良いところに気がつきましたね。そもそも LngCurRecNumDsp の中身って何でしたでしょう?

LngCurRecNumDsp = LngAllRecCnt 
または
LngCurRecNumDsp = LngAllRecCnt + 1 

のように、LngAllRecCnt を基準として求めた値が入っていましたよね d(^-^ )

じゃぁ、LngAllRecCnt の中身って何だったか。

LngAllRecCnt = Range("A1").CurrentRegion.Rows.Count - 1

として求めた、"純粋なるレコード件数"でしたよね。

ここまで書くともう分かってしまいますね。そうです、この変数の値には"見出し行分が含まれて
いない"のです。レコードを追加・編集する行位置の指定は、あくまで"見出し行も含めて数える"
必要があります。早い話、一番上の行から数えて何番目?っていう数字が必要なんですね。

なので、ここでは"見出し行分を引いて求められた値に対して、引いた分を戻す(プラスする)
ことによって、対象となる行位置を導き出しています"。

この辺も表示用と処理用の変数を分けた理由の一つであると言えます。


これらを踏まえまして、処理を追加したものがこちら↓になりますヽ(^-^ )
----------------------------------------------------------------------------------------
Private Sub OptAddMode_Click()
    
    '*** ボタンの使用状態の切替 ***
    CmdTouroku.Enabled = True   '登録(可)
    CmdUpdate.Enabled = False   '修正(不可)
    CmdDelete.Enabled = False   '削除(不可)

    '*** テキストボックスの値クリア ***
    TxtName.Text = ""
    TxtEmail.Text = ""
    TxtBirthday.Text = ""

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

Private Sub OptUpdMode_Click()
    '*** ボタンの使用状態の切替 ***
    CmdTouroku.Enabled = False '登録(不可)
    CmdUpdate.Enabled = True   '修正(可)
    CmdDelete.Enabled = True   '削除(可)
    
    '登録済のレコード件数取得(見出し行分除く)
    LngAllRecCnt = Range("A1").CurrentRegion.Rows.Count - 1
    '表示用レコード数を変数にセット
    LngCurRecNumDsp = LngAllRecCnt   '現在のレコード番号
    LngAllRecCntDsp = LngAllRecCnt   '全レコード件数
    
    'レコード編集・編集位置を更新
    LngRecRow = LngCurRecNumDsp + 1
    
    'レコード件数表示
    LblRecCnt.Caption = LngCurRecNumDsp & "件目/全" & LngAllRecCntDsp & "件"

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

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

さぁ、今度こそ期待通りの動きをしてくれたでしょうか?

最終レコードもちゃんと表示されますか?私の方ではおっけーでしたので、エラーが出たりする
場合はもう一度コードを見直してみましょう(^-^;


てなわけで、以上でオプションボタンの部分は完成ということになりますね【拍手】


このように順を追って組み立てていけば、特にムズカシイこともないことがお分かりいただけるか
と思います。


次回は残りの処理について、また進めていきましょう d(^-^ )


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


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