アクセス担当のまみです。
プログラミングでバグを少なくするコツはコードを短くすることです。
書かないのが一番!ってそれでは何もできないので・・・
テキストボックスやコンボボックスの名前が違うだけで、同じ処理をしているってところがあれば、繰り返し処理が使えってコードが短くできるかもしれません!
繰り返し処理はコードを短くできる代表格です。
この機会にマスターしてしまいましょう。
Contents
フォームを準備しよう
今回、説明のために「営業日報」ファイルを使用します。同じファイルの方が理解しやすいので、お時間ありましたらぜひ作成してみてくださいね!
では「営業日報」ファイルを開き、「F_営業日報」フォームをデザインビューで開きましょう。
商品名と数量を5つまで登録できるように配置しましょう。
現在「cmb商品名」「tx数量」となっていますが、「cmb商品名」は「cmb商品名1」に「tx数量」は「tx数量1」に名前を変更しておきましょう。
「cmb商品名1」と「tx数量1」を選択してコピーしましょう。
「cmb商品名1」「tx数量1」の設定をしてコピーすると、設定もそのまま引き継がれます。名前の変更のみで使用できます!
コンボボックスの名前をそれぞれ 「cmb商品名2」「cmb商品名3」「cmb商品名4」「cmb商品名5」に、テキストボックスの標題を「tx数量2」「tx数量3」「tx数量4」「tx数量5」に変更しましょう。
今回、項目が少ないのでそれぞれにラベルを配置しました。項目が多くなると、ラベルを配置する場所がとれないので、工夫が必要になってきます。
フォームからデータを登録
まずは、繰り返し処理を使わないでコードを書いたら下記のようになが~いこーどになります・・・
Dim Rst As DAO.Recordset Set Rst = CurrentDb.OpenRecordset("T_営業日報", dbOpenTable) With Rst .AddNew .Fields("所属部課コード") = Me!cmb部課名.Column(0) .Fields("所属部課") = Me!cmb部課名.Column(1) .Fields("社員コード") = Me!cmb氏名.Column(2) .Fields("氏名") = Me!cmb氏名.Column(3) .Fields("商品コード") = Me!cmb商品名1 .Fields("商品名") = Me!cmb商品名1.Column(1) .Fields("数量") = Me!tx数量1 .Fields("登録日付") = Now .Update .AddNew .Fields("所属部課コード") = Me!cmb部課名.Column(0) .Fields("所属部課") = Me!cmb部課名.Column(1) .Fields("社員コード") = Me!cmb氏名.Column(2) .Fields("氏名") = Me!cmb氏名.Column(3) .Fields("商品コード") = Me!cmb商品名2 .Fields("商品名") = Me!cmb商品名2.Column(1) .Fields("数量") = Me!tx数量2 .Fields("登録日付") = Now .Update .AddNew .Fields("所属部課コード") = Me!cmb部課名.Column(0) .Fields("所属部課") = Me!cmb部課名.Column(1) .Fields("社員コード") = Me!cmb氏名.Column(2) .Fields("氏名") = Me!cmb氏名.Column(3) .Fields("商品コード") = Me!cmb商品名3 .Fields("商品名") = Me!cmb商品名3.Column(1) .Fields("数量") = Me!tx数量3 .Fields("登録日付") = Now .Update .AddNew .Fields("所属部課コード") = Me!cmb部課名.Column(0) .Fields("所属部課") = Me!cmb部課名.Column(1) .Fields("社員コード") = Me!cmb氏名.Column(2) .Fields("氏名") = Me!cmb氏名.Column(3) .Fields("商品コード") = Me!cmb商品名4 .Fields("商品名") = Me!cmb商品名4.Column(1) .Fields("数量") = Me!tx数量4 .Fields("登録日付") = Now .Update .AddNew .Fields("所属部課コード") = Me!cmb部課名.Column(0) .Fields("所属部課") = Me!cmb部課名.Column(1) .Fields("社員コード") = Me!cmb氏名.Column(2) .Fields("氏名") = Me!cmb氏名.Column(3) .Fields("商品コード") = Me!cmb商品名5 .Fields("商品名") = Me!cmb商品名5.Column(1) .Fields("数量") = Me!tx数量5 .Fields("登録日付") = Now .Update End With Rst.Close Set Rst = Nothing MsgBox "データが登録されました"
今回使っている営業日報って入力項目少ないのにこんなに長い・・・
繰り返し処理を使って登録
繰り返し処理を使ったコードが下記になります。
Dim i As Integer Dim Rst As DAO.Recordset Set Rst = CurrentDb.OpenRecordset("T_営業日報", dbOpenTable) For i = 1 To 5 With Rst .AddNew .Fields("所属部課コード") = Me!cmb部課名.Column(0) .Fields("所属部課") = Me!cmb部課名.Column(1) .Fields("社員コード") = Me!cmb氏名.Column(2) .Fields("氏名") = Me!cmb氏名.Column(3) .Fields("商品コード") = Me.Controls("cmb商品名" & CStr(i)) .Fields("商品名") = Me.Controls("cmb商品名" & CStr(i)).Column(1) .Fields("数量") = Me.Controls("tx数量" & CStr(i)) .Fields("登録日付") = Now .Update End With Next i Rst.Close Set Rst = Nothing MsgBox "データが登録されました"
コードをコピーされたい場合は下記の記事を参考にしてください。
変数の宣言
Dim 変数 As データ型
Dim i As Integer・・・変数iを整数型(Integer)として使わせてくださいねって宣言しています。
データ型を省略するとVariant型になります。Variant型って数値でも文字でも何でも扱えて便利だけど、容量が大きくなったり、処理に時間がかかったり・・・
特にデータ量が多い場合は宣言した方が良さそうです。
繰り返し処理
宣言した変数をつかって、繰り返し処理を行います。
For i = 1 To 5・・iが1から5になるまで処理してねってことです。
Next i・・・ここでiの値が1つ増えます。
CStrって値を文字列型に変換してくれます。
“cmb商品名” & CStr(i)で、iには1から5までが入るんです。iが1だと”cmb商品名” & CStr(i)はcmb商品名1として扱われて、iが2だとcmb商品名2として扱われるってことになります。
登録後にフォームのデータをクリア
データを登録した後はフォーム上のデータをクリアして登録処理を終わらせたいので、メッセージボックスが表示後に下記のコードを追加しましょう。
Me!cmb部課名 = "" Me!cmb氏名 = "" Me!cmb商品名1 = "" Me.tx数量1 = "" Me!cmb商品名2 = "" Me.tx数量2 = "" Me!cmb商品名3 = "" Me.tx数量3 = "" Me!cmb商品名4 = "" Me.tx数量4 = "" Me!cmb商品名5 = "" Me.tx数量5 = ""
これで、次々データが入力できるようになりました。
※現時点では、すべての項目がうまっていないとエラーが出たり、空欄があっても登録されたりしてしまいます。
まとめ
繰り返し処理ってとってもコードが見やすくなりますね。
あまり長いと頭の中がごちゃごちゃになってきます。
短くできるところは短くしていきましょう。