空白入力への対応(その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(^-^ )
それでは次回までごきげんよぉ~(^^)/~
|
|
TOP > VBAでラクしたい ~Part 2~
|
|