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

VBAでラクしたい ~Part 2~

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

表示用と処理用

前回の最後の部分で下記のように説明致しました。

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

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


モードの切替が発生した直後は「登録済レコード件数」を基準にして、"現在のレコード番号"と
"全レコード件数"を調整してやればいいわけですね。

「あーなるほど。だとすると、現在のレコード番号を示す変数はLngRecRowだから、「新規登録」
切替時には 
LngRecRow = LngAllRecCnt + 1 、「修正/削除」切替時には

LngRecRow = LngAllRecCnt

としてやればいいわけですね?」

とお考えになる方もいらっしゃるでしょうけど、残念ながらチョット違います(^^;)

変数LngRecRowは元々どんな使い方をされていたでしょうか?思い出してみて下さい。

LngRecRowは「レコードを追加(編集)する"行位置"」を示すものでしたよねヽ(^-^ )
それに対し、レコード番号というのは"登録されているレコードが何件あって、それの最初から
何番目"っていう意味で使用しています。

例えばレコード番号が"1"、つまり1件目のレコードが追加されるのは、実際はワークシートの
"2行目"です。なぜなら、1行目は見出し部分ですから。

従ってレコード番号が1の場合、LngRecRowの値は2。レコード番号が50であれば、LngRecRow
の値は51、のように"見出し部分が1行である限り"、

LngRecRow = レコード番号 + 1

の関係が成り立つことがわかります。ここまでよろしいですか?(^-^;)

で、この辺は好みが分かれるところかもしれませんが、ここでは敢えて、

"表示用変数と処理用変数を分けておきたいと思います"

どういうことかと言いますと、要は変数の値を増減するような式(LngRecRow + 1 等)を直接参照
・表示するのではなく、そのような基準値を元にして作った値を別に保存しておいて、その保存値
をそのまま使えるようにしましょう、ということです(^-^;)
#言わんとしてることが伝わったかしら・・・・【不安】

実際にやってみることにしましょう。下記の変数を General Declarations の位置に追加しておい
て下さい。

    '*** 全レコード件数(表示用) ***
    Dim LngAllRecCntDsp As Long
    '*** 現在のレコード番号(表示用) ***
    Dim LngCurRecNumDsp As Long

念のため説明しますと、DspはDisplayってことで、いわゆる表示の意味で。Curは"カレント"の意味
ということでひとつ(^_^;)

で、用意されたこれらの変数に対して値を代入してあげることにしましょう。


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

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

仕上げにこれらの値を貼り付けたラベル LblRecCnt に表示させてみましょう。

ラベルに文字を表示させるプロパティは Caption でしたよね d(^-^ )
そしてここでは X件目/全X件 というような表示にしてみましょうか。

変数と文字列をくっつけて表示するには &(アンバサンド)を使います。


LblRecCnt.Caption = LngCurRecNumDsp & "件目/全 " & LngAllRecCntDsp & "件"


こんな感じですね(^-^
文字列の部分はお好みで変えてもかまいません。

こうして出来た2つの処理がコレです↓
----------------------------------------------------------------------------------------
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 & "件"
End Sub
----------------------------------------------------------------------------------------

さぁ起動してみましょう。どうですか?期待通りの動きをしてくれましたか?

なんですと!? 表示が途中で切れてる?

それはラベルの長さが足りないのでわ?(^-^;;;
#私もあとから調整しました。


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


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