アクセスVBAループ(繰り返し)処理から抜けるには?

 

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

 

繰り返し処理ってとっても便利ですね。

コードが短くなって見やすくなるし、指定した回数ずっと繰り返してくれる。

だけど、条件が整った場合にはループから抜けてほしい時ってあったりしませんか?

どうすればループから抜け出せるんだろう?

 

そんな時は、どんな条件になったらループを抜けたいかって書いてあげればいいんです。

今回は、条件が整ったら繰り返し処理を終わらせるって方法をお伝えしますね。

 

Contents

ファイルを準備しよう

 

今回、説明のために「営業日報」ファイルを使用します。

同じファイルが手元のあると理解しやすいので、下記の記事からぜひ作成してみてくださいね!

 

【アクセス】テーブルを結合させてクエリで表示させよう!

2018年10月25日

 

まずは「営業日報」ファイルを開きましょう。

 

必須項目チェックを利用する

 

「営業日報」ファイルの今の状態だと、5行全部入力していないとうまく登録できません。

3行目までしかデータがない状態で登録すると商品名と数量が空欄のまま登録されてしまいます。

何行目までデータがあるかわからないけれど、商品名と数量が入力されなくなったらそこでデータが登録されるようにしたいですね。

 

(はてな君)
わかった!データ登録するところで商品名と数量が入力されなくなったらって条件にすればいいんだ!

 

(あいちゃん)
う~ん。それだと、うまくいく時とうまくいかない時があるんだなぁ。

 

(はてな君)
ふ~ん。じゃぁどうすればいいの?

 

データを登録する前に必須項目チェックを利用して、何行目まであるのか調べるとうまくいきます。

 

実際にコードを追加してみましょう。

 

    Dim j As Integer
    Dim s As Integer
    
'    必須項目のメッセージボックス
    If Me.cmb部課名 = "" Then
        MsgBox "所属が選択されていません"
        Me!cmb部課名.SetFocus
        Me.cmb部課名.BackColor = 12695295
        Exit Sub
    Else
        Me.cmb部課名.BackColor = vbWhite
    End If
    
    If Me.cmb氏名 = "" Then
        MsgBox "氏名が選択されていません"
        Me!cmb氏名.SetFocus
        Me.cmb氏名.BackColor = 12695295
        Exit Sub
    Else
        Me.cmb氏名.BackColor = vbWhite
    End If
    
    If Me.cmb商品名1 = "" Then
        MsgBox "商品名が選択されていません"
        Me!cmb商品名1.SetFocus
        Me.cmb商品名1.BackColor = 12695295
        Exit Sub
    Else
        Me.cmb商品名1.BackColor = vbWhite
    End If
    
    If Me.tx数量1 = "" Then
        MsgBox "数量が入力されていません"
        Me!tx数量1.SetFocus
        Me.tx数量1.BackColor = 12695295
        Exit Sub
    Else
        Me.tx数量1.BackColor = vbWhite
    End If
    
    For j = 1 To 5
        If Me.Controls("cmb商品名" & CStr(j)) = "" And Me.Controls("tx数量" & CStr(j)) = "" Then
            Exit For
        Else
            If Me.Controls("cmb商品名" & CStr(j)) = "" Then
                MsgBox "商品名が選択されていません"
                Me.Controls("cmb商品名" & CStr(j)).SetFocus
                Me.Controls("cmb商品名" & CStr(j)).BackColor = 12695295
                Exit Sub
            Else
            End If
            
            If Me.Controls("tx数量" & CStr(j)) = "" Then
                MsgBox "数量が入力されていません"
                Me.Controls("tx数量" & CStr(j)).SetFocus
                Me.Controls("tx数量" & CStr(j)).BackColor = 12695295
                Exit Sub
            Else
            End If
        End If
    Next j
    
    s = j - 1

 

コードをコピーされたい場合は下記の記事を参考にしてください。

 

関連記事
 
 

 

 

繰り返し処理を抜ける

 

(はてな君)
商品名1と数量1だけループ処理の中にないのってなんで?
(あいちゃん)
ちょっと難しいところかなぁ。商品名1と数量1をループの中に入れてしまうと、商品名1と数量1の両方に入力がない時にはループを抜けてしまうので、メッセージが出ないんです。

 

(はてな君)
あっそっか。条件にあてはまっちゃうんだ。

 

 入力が必須な項目は「cmb部課名」「cmb氏名」「cmb商品名1」「tx数量1」 なので、空欄の場合にはメッセージボックスを表示して、それ以上進めないようにします。

必須項目チェックについての詳細は下記の記事をどうぞ!

アクセス必須項目の未入力チェックでメッセージボックスを表示

2018年9月27日

 

cmb商品名2~5とtx数量2~5はどちらかに入力があって、どちらかに入力がない場合にメッセージボックスを表示するようにしています。

 

条件 Me.Controls(“cmb商品名” & CStr(j)) = “” And Me.Controls(“tx数量” & CStr(j)) = “”を満たしたら繰り返し処理を抜けるように変数jを使用してループさせて、何行目まであるかを調べます。

 

(はてな君)
Exit ForとExit Subの違いがよくわからないんだけど?

 

「Exit For」は「For j = 1 To 5」から「Next j」までの処理の中を条件を満たした時にForの処理を途中で抜けて次の処理に進みます。

 

「Exit Sub」は登録ボタンクリック時の処理が「Sub」からはじまって「End Sub」で終わるので、条件を満たしたときにSubの処理を途中で抜けるってことは、そこで処理が止まって次には進まないってことです。

 

条件を満たしたら、ループを抜けるので、変数jの値から1を引いて変数sに入れておきます。

(はてな君)
1引くのってなんで~?

 

(あいちゃん)
例えば商品名3と数量3が空欄だった場合にループから抜けるってことだよね。それって2行目までの登録をしたいってことでしょ!

 

(はてな君)
あ~なるほど~!

 

何行目までデータがあるのかってわかったので、「For i = 1 To 5」を「For i = 1 To s」に変えておきましょう!

 

 

 

(はてな君)
1行だけとか2行だけとかもちゃんと入力できたよ!

 

あとは、クリア処理に「.BackColor = vbWhite」を追加しておきましょう。

 

データ登録後のクリア処理

 

クリアボタンの処理

 

(はてな君)
そっか。両方空欄だったら処理を終わらせて、どっちかが空欄だったら入力されてないよってメッセージが出るんだ。
(あいちゃん)
そういうことです。クリア処理に背景色をもとに戻すようにしているのは、色を変えた後にクリア処理を押したりとかのことも想定しているんです。

 

(はてな君)
クリア処理ってフォームの読み込み時にも必要なんだよね!
(あいちゃん)
よく覚えていました!フォームを開いたときに空欄を認識してくれないみたいで・・

 

 

フォーム①■を選択した状態で、プロパティーシートの②「イベント」タブから読み込み時にイベントプロシージャを選択してコードの画面を表示させます。

 

「Private Sub Form_Load()」と「End Sub」の間に下記のコードを追加しましょう。

    Dim clear As Control
    On Error Resume Next
    For Each clear In Me.Controls
        With clear
            If .ControlType = acTextBox Or acComboBox Then
                .Value = ""
                .BackColor = vbWhite
            End If
        End With
    Next clear

 

これで空欄が登録されることはなくなりました。

しっかり動作確認してみてくださいね!

 

まとめ

 

同じ処理は繰り返してほしいけど、途中で抜けたい時もあるんです・・・

そんな時に、抜けられる方法がわかっていると、プログラムの幅が広がりますね。

 

スポンサーリンク