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

VBAでラクしたい ~Part 2~

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

空白入力への対応(その1)

とりあえずは完成をみたこの入力フォームですが、これから更にちょこちょこ直していきながら、
VBAの勉強を進めていきたいと思います。

というわけで、真っ先に直さなければイケナイところから直していきましょう。

「え?それってバグじゃないの?」というツッコミはなしね(^-^;


まずはフォームを起動して普通にデータ入力を行ってみてください。通常の使い方だと特に問題は
無いですよね。

そこで試しにデータを何も入れずに「登録」を3回程押してみて下さい。

レコード番号/全レコード数も何も変化は見られませんよね。そうしてから、またデータを入力し、
登録を行ってみて下さい。

・・・するとどうでしょう? 最初に登録したレコードと、何も入れずに「登録」を押した後に入力
したレコードとの間が3行空いてしまっています。

これは入力データの有無に関わらず、登録を押す毎に現在のレコード位置を +1 してしまってい
ることが原因となっています。

もちろんすべての場合において、空白でレコードを登録するのがイケナイことかと言えば、そうで
はありません。このシステムのようなケースですとマズイのです。

なぜかと言いますと、このシステムでは全レコード数のカウントを行うために CurrentRegion を
使って、対象範囲を取得しています。CurrentRegion の使い方については、以前書いたものをご覧
いただきたいのですが、要は"各データがつながっている状態でないと使えない"のです。

ヘタに空白行などが入ってしまうと、そこでデータのつながりが切れてしまうため、最終レコード
位置などを正しく取得することができません。


ということで、この問題を解消するために2つの面からアプローチしていくこととしましょう。


<その1>自動採番する

つまり新規でレコードが登録される度に、強制的に通し番号をふってしまおうというやり方です。

そうすれば、途中でまるっきり空白のレコードが登録されようと番号は途切れませんから、正しい
結果を取得できるはずです。

それでは実際にやってみませう。

最初に考えるのは「その番号をどこに入れるか」ということです。
やっぱり通し番号とくれば、一番左側にあってほしいというのが人情ですよね(^^;)

しかし現在、1列目のデータは「氏名」ということになっています。

どうしたらいいでしょうか?


そう! ここで初めて"定数"で定義した意義というものが出てくるんですね~。

コードの中では、直接1列目とか2列目とか見にいってるわけではないですよね。あくまで
cNameDataCol とかの値を見て、位置を決定しているだけです。

ですからその定数の値を変更するだけで、カンタンに表示位置を変えることが出来るのです。

ということで、既存の定数の値を変更してみましょう。


    '*** データ列の定義 ***
    Const cNameDataCol = 2  '氏名
    Const cMailDataCol = 3   'メールアドレス
    Const cBirthDataCol = 4  '誕生日


次に通し番号の列を定義するための定数を追加しましょう。

    Const cRecNumCol = 1     '通し番号

そしてワークシートの見出しも変更しておく必要がありますね。
1列目に新しい列を挿入し、1行目に「No」という見出しをつけましょう。
見出しは左から順に No、氏名、E-Mail、誕生日 となります。


ここまでできたら、後は自動採番の処理を追加するだけです。

番号をふる処理は「登録」の時に行えばいいですよね。「修正」は現在のデータを変更するだけで
すし、「削除」をすれば現在の番号も自動的に消えますし。


てなわけで、CmdAddNew_Click の一番上に

    '*** 自動採番処理 ***
    Cells(LngRecRow, cRecNumCol).Value = LngCurRecNumDsp

を追加しましょう。


値として LngCurRecNumDsp を使っているのがミソですね(^-^

この変数は常に全レコード数+1を示しますから、0件の時は1になりますよね。そうすると番号
を1からふりたい場合に都合がいいわけです。

で、上記のコードを追加した CmdAddNew_Click はこちら↓

-----------------------------------------------------------------------------------------
Private Sub CmdAddNew_Click()

    '*** 自動採番処理 ***
    Cells(LngRecRow, cRecNumCol).Value = LngCurRecNumDsp

    '*** データ登録処理 ***
    Cells(LngRecRow, cNameDataCol).Value = TxtName.Text
    Cells(LngRecRow, cMailDataCol).Value = TxtEmail.Text
    Cells(LngRecRow, cBirthDataCol).Value = TxtBirthday.Text
    
    '*** 行位置を下に移動 ***
    LngRecRow = LngRecRow + 1
    
    '*** テキストボックスの値クリア ***
    TxtName.Text = ""
    TxtEmail.Text = ""
    TxtBirthday.Text = ""
    
    '*** 登録済のレコード件数取得(見出し行分除く) ***
    LngAllRecCnt = Range("A1").CurrentRegion.Rows.Count - 1
    '*** 表示用レコード数を変数にセット ***
    LngCurRecNumDsp = LngAllRecCnt + 1  '現在のレコード番号
    LngAllRecCntDsp = LngAllRecCnt + 1  '全レコード件数
    '*** レコード件数表示 ***
    TxtRecCnt.Text = LngCurRecNumDsp & "件目/全" & LngAllRecCntDsp & "件"

    
End Sub
-----------------------------------------------------------------------------------------

定数を追加・修正した宣言部はこちら↓
-----------------------------------------------------------------------------------------
    '====== 定数宣言部 ======

    '*** 起動時のレコード行位置 ***
    Const cInitRow = 2
    '*** 見出し行位置 ***
    Const cMidasiRow = 1
    '*** データ列の定義 ***
    Const cRecNumCol = 1     '通し番号
    Const cNameDataCol = 2   '氏名
    Const cMailDataCol = 3   'メールアドレス
    Const cBirthDataCol = 4  '誕生日
    '*** フォームを起動する場所(シート名)***
    Const cFrmOpnSheet = "Sheet1"
    '*** データを登録する場所(シート名)***
    Const cDatWriSheet = "Sheet1"
-----------------------------------------------------------------------------------------

いかがでしょうか? こういう方法も覚えておいてソンはないでしょう d(^-^ )


それでは次回までごきげんよぉ~(^^)/~


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