見出し画像

AccessVBAでFor〜Eachをうまく使って汎用的なプログラムを目指す

VBAのFor文を使って繰り返し処理を書いたことがあるけど、For〜Eachになると「よく分からない」と感じることがありました。

しかし、今ではめっちゃ便利で汎用性の高いプログラムには最適な文として使っています。

今回は、筆者が便利に感じたFor〜Eachの使い方について紹介していきましょう。

Access入力画面のチェック機能に使えたFor〜Each

『入力画面の中で空白のテキストボックスがあれば、色を赤くさせてユーザーに知らせるチェック機能を付けたい』

こんな依頼が来たときに、普通に書けば以下のようなコードになります。

If IsNull(テキスト1) Then テキスト1.BackColor = RGB(255, 0, 0)
If IsNull(テキスト2) Then テキスト2.BackColor = RGB(255, 0, 0)
If IsNull(テキスト3) Then テキスト3.BackColor = RGB(255, 0, 0)
If IsNull(テキスト4) Then テキスト4.BackColor = RGB(255, 0, 0)
If IsNull(テキスト5) Then テキスト5.BackColor = RGB(255, 0, 0)

5つならOKかもしれませんが、画面内に何十個もオブジェクトがあれば書いてられないですよね。

こんなときにFor〜Eachが役に立つんです。

Private sub ctrlForEach()

    Dim myCtrl As Control

        For Each myCtrl In Me.Controls
            If myCtrl.Name Like "テキスト*" Then 'これが抜けると全部回ってしまう'
                If IsNull(myCtrl.Value) Then myCtrl.BackColor = RGB(255, 0, 0)
            End If
        Next myCtrl
        
End Sub

ForEachをうまく使えば、個別にオブジェクト名を書かなくても勝手に処理をしてくれます。

但し、Ifで条件を設けないと全てのオブジェクトを対象にしてしまうので、命名規則や「テキストボックスだけ」といった種類の指定も必要です。

画像2

前述のケースでは「テキスト」の文字を含んだ名前が条件なので、他で「テキスト」の文字を含んだオブジェクトを作成するのはNGになります。

配列をFor〜Eachで回して汎用性の高いプログラム

フォーム内のオブジェクトを「総なめ」する意外にも、VB内で格納した配列をぐるぐる回すことにも使えます。

例えば、日によって数が変わるエクセルシート毎に処理を流したいときにも便利。

Private Sub xlSheetForEach(iArray As Integer) '配列数を引数で渡す'

    Dim xlApp As Object
    Dim xlBook As Object
    Dim xlSheet() As Object
    Dim xlSheets As Object
    Dim i
    
        Set xlApp = CreateObject("Excel.Application")
            xlApp.Visible = True
        Set xlBook = xlApp.Workbooks.Open("C:¥test.xlsx")
        ReDim xlSheet(iArray) As Object
        
        For i = 0 To iArray 'Sheetを格納'
            Set xlSheet(i) = xlBook.Worksheets(i + 1)
        Next i
        
        For Each xlSheets In xlSheet '配列を回す'
            With xlSheets.Cells '値で貼り付けし直し'
                .Copy
                .PasteSpecial -4163 'Excelライブラリなしなので値にする'
            End With
        Next xlSheets
        
        xlBook.Close True '保存して閉じる'
        xlApp.Visible = Flase
        
        Erase xlSheet
        Set xlBook = Nothing
        Set xlApp = Nothing
        
End Sub

このコード例では、可変的なエクセルシートに対して全セルを値で貼り付けし直しています。

このように、配列に格納されたオブジェクトをFor〜Eachで回すことも可能です。

また今回の内容からは逸れますが、当ブログでは参照設定でExcelライブラリを使わない方法を想定しているので、PasteSpesialの引数は[xlPasteValues]ではなく[-4163]になります。

ExcelライブラリなしのExcel操作については、以下の記事で詳しく説明しているので参考にしてみてください。

AccessVBAでFor〜Eachと配列を使ってレベルアップ

画像3

Accessで長く安定して使えるツールを開発するのであれば、For〜Eachや配列を積極的に利用するのは非常に効果的です。

スピーディーな開発を求められる現場においては、どうしても場当たり的なVBAの構文になりがち。

しかし、その後のバグ改修や要件変更等を考えれば、トータルの開発稼働は軽減されるはずです。

画像3

DeepBlueでは、VBAに関する質問や要件定義の相談を受け付けています。

今回、この記事を読んで登録してくれた方には初回のみ無料でVBAマクロに関する相談を承りますよ。

興味ある方は、是非チェックしてみてくださいね。

この記事が気に入ったらサポートをしてみませんか?