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

VBAでラクしたい ~Part 2~

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

オプションボタンの処理を修正する

前回の説明を見て試しにご自分で書いてみた、という方は挙手。(^^)/

はい、下ろして結構です。

○か×というところを EnabledのTrue、Falseに置き換えて考えればよろしいというところまでは
なんとなく分かったものの・・・という方も多いかもしれません。

とりあえず今回は、オプションボタンの処理部分の修正に着手すると致しましょう。

オプションボタンの処理には、既にボタンの切替処理を入れていたつもりでしたが、不足部分もあ
りましたし・・・(( ((( ヽ(;^^)ノ
また、「修正/削除」モード時のレコード番号による場合分けも考慮しておりませんでした(^-^;


てなことで、まずは 「新規」オプションボタンクリック時の処理から
----------------------------------------------------------------------------------------

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

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

    
    '*** ボタンの使用状態の切替 ***
    CmdAddNew.Enabled = True    '登録(可)
    CmdUpdate.Enabled = False   '修正(不可)
    CmdDelete.Enabled = False   '削除(不可)
    CmdPrev.Enabled = False     '前へ(不可)
    CmdNext.Enabled = False     '次へ(不可)

End Sub

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

使用状態の切替処理は一番下に移動し、抜けていた「前へ」「次へ」の処理を追加しました(^^;)

「新規」モードはこれだけですので、説明は割愛させていただきます。


次に「修正/削除」ですね。

前回、(1)~(5)のケースについて説明しましたけれども、では今回の処理で当てはまるものはどれ
になるでしょう?

(1),(2),(4)ですよねヽ(^-^ )

(3)と(5)が当てはまらないのはなぜか分かりますか?

「修正/削除」モードがクリックされた時に表示されるレコードには、どんなキマリがあったか覚え
てますでしょうか。

"最終レコード"を表示するんでしたよね。 d(^-^ )

ということは当然"「次へ」は押せなくていい"、ということになります。


(1)レコードが1件も無い場合
(2)レコードが1件だけ存在し、"1件目/全1件"の場合
(4)レコードが2件(あるいはそれ以上)存在し、"2件目/全2件(最終レコード)"の場合

                                                                                
                 (1)   (2)   (4)
・CmdAddNew       ×     ×     ×
・CmdUpdate       ×     ○     ○
・CmdDelete       ×     ○     ○
・CmdPrev         ×     ×     ○
・CmdNext         ×     ×     ×


この表から分かるように、いずれの場合でも × であるものが2つありますね。
"CmdAddNew"と"CmdNext"です。

まずこれは無条件にということですので、最初に記述しちゃいます。


    '*** ボタンの使用状態の切替 ***
    CmdAddNew.Enabled = False '登録(不可)
    CmdNext.Enabled = False   '次へ(不可)


ということで2つが消えました。

                 (1)   (2)   (4)
・CmdUpdate       ×     ○     ○
・CmdDelete       ×     ○     ○
・CmdPrev         ×     ×     ○


さぁ次にどう見れば良いでしょう?

(2)の条件を先に見ていくやり方だと、まず"現在のレコード件数が1件以上あるか?"という条件
判断になります。すなわち

    If LngAllRecCntDsp >= 1 Then

ということですね。

まずこの条件を満たしていれば、CmdUpdate と CmdDelete は True なわけですから

    If LngAllRecCntDsp >= 1 Then
        CmdUpdate.Enabled = True   '修正(可)
        CmdDelete.Enabled = True   '削除(可)
    End If

で良いことになります。


更に、"2件以上あれば・・・"というのが(4)の条件であり、(4)の条件を満たしているということ
は、必ず(2)の条件を満たしています。理由はお分かりですよね? 2は1より大きいですもの。

ということで(4)の条件判断は、最初のIf文の中に"入れ子"状態で書くことになります。

    If LngAllRecCntDsp > 1 Then

という条件ですね。

>= 1 と > 1 の違いについては大丈夫ですよね?(^_^;  

1を含むか含まないかですから、この場合は整数を扱ってるわけですし、1を含まなければ 2から
ってことで(^o^;)


そして LngAllRecCntDsp > 1 であれば、「前へ」は使用可、そうでなければ使用不可。

なのでこんな感じ


        If LngAllRecCntDsp > 1 Then
            CmdPrev.Enabled = True     '前へ(可)
        Else
            CmdPrev.Enabled = False    '前へ(不可)
        End If


最初から LngAllRecCntDsp >= 1 に該当しなければ、これはもう0件以外の何者でもないので
全部組み合わせるとこうなります(^_^;


    '*** ボタンの使用状態の切替 ***
    CmdAddNew.Enabled = False          '登録(不可)
    CmdNext.Enabled = False            '次へ(不可)
    
    If LngAllRecCntDsp >= 1 Then
        CmdUpdate.Enabled = True       '修正(可)
        CmdDelete.Enabled = True       '削除(可)
        If LngAllRecCntDsp > 1 Then
            CmdPrev.Enabled = True     '前へ(可)
        Else
            CmdPrev.Enabled = False    '前へ(不可)
        End If
    Else
        CmdUpdate.Enabled = False      '修正(不可)
        CmdDelete.Enabled = False      '削除(不可)
        CmdPrev.Enabled = False        '前へ(不可)
    End If


If ~ Else ~ End If の処理が入れ子状態になってますね。
こんがらがってしまわぬよう、内容をよく読みませう(^^;)


そうしてできた「修正/削除」オプションボタンの処理がこちら

-----------------------------------------------------------------------------------------
Private Sub OptUpdMode_Click()

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

    '*** 現在行位置が見出し行位置と同じ場合(レコード数ゼロ)
    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


    '*** ボタンの使用状態の切替 ***
    CmdAddNew.Enabled = False          '登録(不可)
    CmdNext.Enabled = False            '次へ(不可)
    
    If LngAllRecCntDsp >= 1 Then
        CmdUpdate.Enabled = True       '修正(可)
        CmdDelete.Enabled = True       '削除(可)
        If LngAllRecCntDsp > 1 Then
            CmdPrev.Enabled = True     '前へ(可)
        Else
            CmdPrev.Enabled = False    '前へ(不可)
        End If
    Else
        CmdUpdate.Enabled = False      '修正(不可)
        CmdDelete.Enabled = False      '削除(不可)
        CmdPrev.Enabled = False        '前へ(不可)
    End If
    
End Sub
-----------------------------------------------------------------------------------------

あ、そうそう "*** 現在行位置が見出し行位置と同じ場合(レコード数ゼロ)" の処理をひそかに追
加しております。(( ((( ヽ(;^^)ノ #CmdDelete からの流用で・・・。

動かしてみたら、1件もレコードが無いときに見出し行が表示されちゃったもので(^-^;Aアセアセ


ふぃ~ようやく完成しましたね >オプションボタン

でもでもボタンの使用可・不可を切り替えるには、これだけぢゃ足らんのだぁっ!(^^;)


ってことで次回はその続きを。


でわ♪(^^)/


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