アクセスVBA繰り返し処理を使ってコードを短く書くコツ

 

アクセス担当のまみです。

 

プログラミングでバグを少なくするコツはコードを短くすることです。

書かないのが一番!ってそれでは何もできないので・・・

 

テキストボックスやコンボボックスの名前が違うだけで、同じ処理をしているってところがあれば、繰り返し処理が使えってコードが短くできるかもしれません!

繰り返し処理はコードを短くできる代表格です。

この機会にマスターしてしまいましょう。

 

Contents

フォームを準備しよう

 

今回、説明のために「営業日報」ファイルを使用します。同じファイルの方が理解しやすいので、お時間ありましたらぜひ作成してみてくださいね!

 

【アクセス】コンボボックスにテーブルの値を表示させよう

2018年10月24日

では「営業日報」ファイルを開き、「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」に変更しましょう。

 

(はてな君)
ホントだぁ!コンボボックス1つしか設定してないけど表示される!楽ちんだねぇ。

 

 

今回、項目が少ないのでそれぞれにラベルを配置しました。項目が多くなると、ラベルを配置する場所がとれないので、工夫が必要になってきます。

 

 

フォームからデータを登録

 

まずは、繰り返し処理を使わないでコードを書いたら下記のようになが~いこーどになります・・・

 

 

    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 "データが登録されました"

 

 

今回使っている営業日報って入力項目少ないのにこんなに長い・・・

 

(はてな君)
商品名とか数量とか一番後ろの数字が違うけど同じこと5回書いてるよ!

 

(あいちゃん)
そうそのとおり!その部分って繰り返し処理が使えるんです!

 

繰り返し処理を使って登録

 

繰り返し処理を使ったコードが下記になります。

 

    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商品名” & CStr(i)」にはならないの?

 

 

(あいちゃん)
う~ん。ここは少し難しいところかなぁ。「Me!”cmb商品名” & CStr(i)」だとうまくいかないんだ。「Me.Controls(“cmb商品名” & CStr(i))」ってするとうまくいく。

 

 

(はてな君)
へぇそうなんだぁ。

 

登録後にフォームのデータをクリア

 

データを登録した後はフォーム上のデータをクリアして登録処理を終わらせたいので、メッセージボックスが表示後に下記のコードを追加しましょう。

 

 

    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 = ""

 

 

 

これで、次々データが入力できるようになりました。

※現時点では、すべての項目がうまっていないとエラーが出たり、空欄があっても登録されたりしてしまいます。

 

まとめ

 

繰り返し処理ってとってもコードが見やすくなりますね。

あまり長いと頭の中がごちゃごちゃになってきます。

 

短くできるところは短くしていきましょう。

 

 

 

スポンサーリンク