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

VBAでラクしたい ~Part 2~

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

「削除」ボタンの処理

いきなりお詫びのこーなーです<(_ _;)>

読者の方よりご指摘がございまして、まず1点目が「CmdTouroku」ボタンは途中から"CmdAddNew"に
置き換えたはずなのに、その後の章において記述が「CmdTouroku」のままになっている、という点
です。大変失礼致しました<(_ _;)><(;_ _)>

今一度、「登録」ボタンのオブジェクト名を「CmdAddNew」に、そしてコードの方も"CmdTouroku"と
記述されている部分につきまして、修正をお願い致します(_ _;)

2点目は「前のレコードに移動」「次のレコードに移動」の使用可不可の切替処理が抜けていた点
です。ホントはオプションボタンのクリック時の処理で入れるはずだったのですが、忘れていたよ
うです。スミマセン(^^;;;;

とうことでこの処理は最後に見直しをかける際に、改めて追加させていただくこととします(_ _;)


このようなご指摘をいただける事につきましては、とても感謝しております。
私も筋道を立てながら書いているつもりが、意外と所々行き当たりばったりになっていたりもしま
すので、ん?なんだ?とお気づきの点がございましたら、ぜひご一報下さいませ<(._.)>


それでは気をとりなおして本題へヽ(^-^ ;)

今回は「削除」処理についてみていきましょう。

まずは仕様の確認から

◆「削除」ボタン クリック時
1.レコードの現在位置を示す変数の値を参照する
2.ワークシートの対象行位置から、現在表示中のレコードを削除する
3.削除後は1つ前のレコードを表示することとし、レコードが無い場合は空白を表示。
4.全レコード件数・現在のレコード位置の表示を更新する


まず最初にゴメンナサイしておきます<(_ _;)><(;_ _)>
3はこの仕様だと表示がおかしくなってしまいますね。それはなぜか。

例えば、5件レコードがある状態で5件目を削除する場合を考えてみましょう。

まず最初の表示は"5件目/全5件"になっています。
この状態から5件目のレコードを削除し、直後にレコード数をカウントしたとすると

"5件目/全4件"

の状態になりますよね。レコードは削除されても現在の行位置は更新されていなければ、このまま
空白を表示していることになります。

修正/削除モードでは、存在しないレコードは操作対象にしませんので、こういう場合は1つ前の
レコードに操作対象行を移す必要があります。

このケースだけを考えるならば、3の処理で間違いありません(^^;)


ところが、"1件目/全5件"を削除する場合はどうでしょうか?

1件目のレコードを削除すれば、2件目以降のレコードが当然上に繰り上がります。これが1件し
かレコードが無い状態であれば、繰り上がっても空白は空白のままですから良いのですが、2件目
以降が存在する場合は、同様に1つ上のレコードを表示しようとした場合、上は見出し行ですよね。
見出し行はレコードでは無いので当然フォームには表示できません。ならば空白を表示すればいい
かと言えば、それ以降にレコードが存在するのに空白が表示されるなんてヘンですよね(^-^;)
しかも現在の行位置には、繰り上がったレコードが存在するとなれば、そのレコードを表示して
然るべきです。


ということで、一律に1つ前のレコードを表示したんじゃダメよん、っていうことに後から気がつ
いたのでした。#お許しを~ (_ _;)


それぢゃどうすればいいかって言えば、場合分けをしてしまえばいいという事になりますヽ(^-^;)

「最終レコードを削除した場合」と「中間レコードを削除した場合」。

最終レコードを削除した場合は全レコード件数も減りますから、操作対象レコード番号も全レコー
ド件数に合わせる。
中間レコードを削除した場合は現在行位置はそのままとし、上に繰り上がったレコードをそのまま
表示する。

という流れで考えてみることにいたしましょう。


レコードの現在位置を取得するのは前にもやってますから、特に問題ナシだとは思うんですけど、
その次の"現在表示中のレコードを削除する"というアクションをどういう手順で行うのか、という
ことが問題になってきます。

ここでは2通りの手法について見ていくことにいたしましょう。ヽ(^-^ )

まず1つは、単純に行を選択後、右クリックで「削除」を選択して行を削除するような場合。
これですと、行を削除後に自動的に次のデータを上にスライドしてくれるのでラクではあります。

----------------------------------------------------------------------------------------
Private Sub CmdDelete_Click()
    '現在のレコード行位置全体を選択
    Rows(LngRecRow).Select
    'その行を削除(下のレコードは上にスライドする)
    Selection.Delete Shift:=xlUp    
End Sub
----------------------------------------------------------------------------------------

Rows(行番号).Select っていう処理は、むかーし説明したような気がしますが(^^;)
要は"行全体"を選択するような時に使います。

例えば"1行目を選択する"という処理を、マクロの自動記録でコード作成すると

     Rows(1:1).Select

とかいうものが出来上がります。これは"1行目から1行目までを選択する"という意味合いの処理
になっているのが、なんとなくお分かりいただけますでしょうか?(^-^ )

今回の場合は複数行を選択して削除するわけではないので、ムリにこの形にあわせて

     Rows(LngRecRow & ":" & LngRecRow).Select

とか書く必要はありません(^-^;) #間違いでは無いですが・・・。

1行だけを対象にするのか、複数行を対象にするのかで、それぞれ書き方が違うことを覚えておく
とよいでしょう。


次に、"最終レコードを削除した場合"の条件判断処理を考えてみましょう。

先程例を挙げましたが、5件目/全5件 という状態から 5件目のレコードを削除した場合、その
直後の値は 5件目/全4件 という状態になります。すなわち 

   現在のレコード番号 > 全レコード件数(最終レコード番号)

という状態ですね。

このような場合には、操作対象レコード番号を1つ前(最終レコード番号)に合わせるわけですか
ら

    '*** 現在行位置が全レコード数を越える場合 ***
    If LngRecRow > LngAllRecCnt Then
        '*** 現在行位置を全レコード数に合わせる ***
        LngRecRow = LngAllRecCnt
    End If

という処理にすればいいことになります。

こうすれば 5件目/全4件 となった直後に 4件目/全4件 と修正され、正しくレコード表示でき
ることになるわけです。



とりあえず今回はここまで~♪


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