オプションボタンの処理を修正する
前回の説明を見て試しにご自分で書いてみた、という方は挙手。(^^)/
はい、下ろして結構です。
○か×というところを 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アセアセ
ふぃ~ようやく完成しましたね >オプションボタン
でもでもボタンの使用可・不可を切り替えるには、これだけぢゃ足らんのだぁっ!(^^;)
ってことで次回はその続きを。
でわ♪(^^)/
|
|
TOP > VBAでラクしたい ~Part 2~
|
|