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

VBAでラクしたい ~Part 2~

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

レコード表示に関しての続き

あぁぁ、連日なんか体が痛い。そして眠い・・・(^^;
#やはりあんまり遅くまでチャットをやっていてはいけないのね。


さて本題。

前回は、レコード表示部分についての規則を明確にするトコまでやりました。

今回はそれを踏まえまして、残りの処理を書いていくことにいたしましょう。

で、とりあえず「新規登録」の仕様として、5番目の項目を追加しておいて下さい(^^;)

----------------------------------------------------------------------------------
◆「新規登録」 オプションボタン クリック時 
1.表示を On の状態にし、「修正/削除」オプションボタン表示を Off にする
2.「修正」「削除」「次のレコードに移動」「前のレコードに移動」の各ボタンをクリック
  不可の状態に設定する
3.「登録」ボタンをクリック可能な状態にする
4.表示中のデータをクリアする
5.全レコード件数・現在のレコード位置の表示を更新する
----------------------------------------------------------------------------------

「新規登録」「修正/削除」モード切替処理におきまして、足りないのは「レコード表示」の
処理だけですよね。それではこの部分の処理を書いていくことといたしましょう。


まずは「全レコード件数」をどう表示するか。

これは第一部の方でやりましたけど、"隣接するセルの範囲を取得して、その行数を数える"と
いう方法を使います。

おさらいしますと、隣接する範囲を求めるのが CurrentRegion 、その中の行を示すのが Row 、
そして数を数えるのが Count になります。

※この辺についての詳しい解説については「変動するデータへの対応(その1)」の章をご
  一読下さい。ここでは割愛致します。

そして"見出し部分"に隣接するセル範囲を取得して、変数に入れるわけですから、

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

となります。でもこのままだと"見出し行"の部分も1件として数えてしまってますから、
その行数分を引いて

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

とすると、"登録済のレコード件数"が求められますね。

ここではあくまで"登録済のレコード件数"を変数に入れていることに注意して下さい。
表示する上での数値は、この値を基準に求められますので。

どういうことかと言いますと、前回定義しました

・全レコード件数     →登録済レコード件数(「登録」モードの場合は、登録待機中のレコード
                       1件もプラスしてカウントする)

という部分に関わってくるということです。

「修正/削除」モード中は、純粋に"登録済"の件数を表示すればいいのに対し、「新規登録」モー
ド中はその件数に登録待機分の1件をプラスする必要がありますので、まずは"登録済"分を変数に
入れておいて、「新規登録」モード時には 

LngAllRecCnt + 1

としてやれば、希望通りの値が表示できるわけです。

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

次に「現在のレコード番号」の表示について。

「変数 LngRecRow の値そのままでOKです」

・・・といきたいところですが、そうはいかない事情があります。それはなぜか。

「モード切替時に追加(編集)対象のレコード番号が変わってしまう」からです。

例えばどういうことかと言いますと、仮に現在5件のレコードが登録済だったとします。
そして「前のレコードに移動」で2番目のレコードに戻り、2番目のレコードを修正しました。
そしてその直後にレコードを新規登録すべく、「新規登録」モードに切り替えました。
---- としますと、切替をした時点で全レコード件数は6件(登録待機分含む)となり、追加する
行位置(レコード番号)もそれに合わせて"6番目"にならなければいけないからです。

そして今度は、その状態から再び「修正/削除」モードに切り替えることを考えますと、そのまま
「6件目/全6件」ではマズイですよね(^^;)
なぜなら「新規登録」モード時に表示されるレコード番号及び全件数は"未登録"のレコードを含ん
でいますから。つまり「6件目/全6件」と表示されている場合、実際の登録済件数は"5件"。
修正・削除の操作は"登録済レコード"に対してしか実行できませんから、新規→修正/削除モード
の切替時には最低限"編集可能なレコード位置"に合わせてやる必要があります。

"編集可能なレコード位置"を考えた場合、とりあえず無難なのは"登録済レコードの最終番号"に
合わせてやることです。

つまり「新規登録」モード時に「6件目/全6件」の表示であれば、「修正/削除」モードに切り替
えた際に「5件目/全5件」にする、ということですね。

逆に「修正/削除」→「新規登録」モード切替時には、「1件目/全5件」でも「3件目/全5件」
でも「5件目/全5件」でも、「6件目/全6件」に表示を切り替えるということです。

この関係、お分かりいただけましたでしょうか?(^-^;

実際の処理は

◆「修正/削除」→「新規登録」切替時(OptAddMode_Click)
・"現在のレコード番号"・・・登録済レコード件数+1
・"全レコード件数"・・・・・         〃

◆「新規登録」→「修正/削除」切替時(OptUpdMode_Click)
・"現在のレコード番号"・・・登録済レコード件数
・"全レコード件数"・・・・・         〃

となればいいわけですから、

◆「修正/削除」→「新規登録」切替時(OptAddMode_Click)
・"現在のレコード番号"・・・LngAllRecCnt + 1
・"全レコード件数"・・・・・LngAllRecCnt + 1


◆「新規登録」→「修正/削除」切替時(OptUpdMode_Click)
・"現在のレコード番号"・・・LngAllRecCnt
・"全レコード件数"・・・・・LngAllRecCnt

となります。



とりあえず今回はここまで~(^^)/~


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