ACCESS VBA BOFの使い方

BOFの使い方

ACCESSのレコードセットでファイルの始まりを表すのがBOFです。

BOFはACCESSのループ処理でよく利用されます。

今回は、BOFの使い方をご紹介します。


こんにちは。
はこにわガジェット (@hakoniwagadget) です。

ACCESSを使った売上管理、顧客管理などのデータベース開発を行っています。
ACCESSは基本機能だけでも十分便利ですが、VBAを使うことで格段に使いやすいデータベースを作成可能です。
この記事ではACCESSでのVBAの使い方をご紹介していきます。

BOFとは

BOFとは、Beginig Of Fileの略で、ACCESSではADO(ActiveX Data Objects)のレコードセットに対して利用可能なプロパティです。
レコードセット(テーブルやクエリ)に対して、カレントレコードが最初のレコードより前にあるか否かを判定します。

BOFは以下の構文で利用します。

レコードセット.BOF

レコードセット名につけるだけの比較的簡単な構文です。

カレントレコードが最初のレコードより前、つまりレコードセットの一番最初にいる場合は値がTrue、そうでない場合はFalseが返されます。

BOFの使い方

では、実際にBOFを利用したプロシージャの例を示しましょう。

以下はTRN_売上という売上データの入ったテーブルを、請求フラグを立てて変更する処理です。


Public Sub seikyu()

'変数にADOオブジェクトを代入
Set cnn = CurrentProject.Connection
Set rst1 = New ADODB.Recordset
rst1.CursorLocation = adUseClient
Set rst2 = New ADODB.Recordset
rst2.CursorLocation = adUseClient

'レコードセットを取得
rst1.Open "TRN_請求", cnn, adOpenKeyset, adLockOptimistic
rst2.Open "TRN_売上", cnn, adOpenKeyset, adLockOptimistic


'トランザクション処理開始
cnn.Execute "begin transaction;"

rst1.Filter = "請求ID = " & seikyu_id
rst2.Filter = "請求 = true and 顧客ID =" & seikyu_kokyaku_id

    '請求伝票を「請求済」に更新
    rst1.Update "請求済", "True"

    '売上伝票を「請求済」に更新し、「請求ID」を追記。
    If rst2.RecordCount = 0 Then
        
        MsgBox "請求対象の伝票がありません。", vbCritical * vbOKOnly, "請求対象なし"
        'ロールバック
        cnn.Execute "rollback transaction;"

    Else
        Debug.Print "請求対象売上ID数:" & rst2.RecordCount

        rst2.MoveLast

        Do Until rst2.BOF

            rst2!請求 = "false"
            rst2!請求済 = "true"
            rst2!請求ID = seikyu_id
            rst2.Update
            Debug.Print "請求ID付与:" & rst2!売上ID

            rst2.MovePrevious
            
        Loop

    'コミット
    cnn.Execute "commit transaction;"

    End If
                
'終了処理
rst1.Close: Set rst1 = Nothing
rst2.Close: Set rst2 = Nothing
cnn.Close: Set cnn = Nothing

End Sub
 

上記処理の中でBOFは、


        Do Until rst2.BOF

            rst2!請求 = "false"
            rst2!請求済 = "true"
            rst2!請求ID = seikyu_id
            rst2.Update
            Debug.Print "請求ID付与:" & rst2!売上ID

            rst2.MovePrevious
            
        Loop
 

で利用しています。

Do Until…Loopの処理で、rst2というレコードセットをループさせて処理しているのですが、その終了判定条件がBOF、つまりBOF = Trueになってレコードセットの最初に到達したら終了、ということです。

このため、Loop処理内では


 rst2.MovePrevious
 

で、処理が終わるたびにレコードを1つずつ前に戻る処理を入れてあります。

このように、BOFはループ処理でレコードセットの後方から前方に対して処理をする際に、終了判定条件として利用されることが一般的です。
ただし、通常はループは前から後ろに行うことが多いので、そういった意味では終了条件にはEOFを使うことの方が多いでしょう。

EOFについては以下の記事にまとめてありますのでご覧ください。

EOFの使い方

以上、BOFの使い方をご紹介しました。


ACCESSを使いこなせば、業務の効率化や自動化が実現できます。
しかし、自分でACCESSを学ぶには時間がない、難しそうで不安、という方も多いでしょう。

そんな時は、ACCESS開発歴20年以上、過去に100以上のACCESSデータベースを開発してきた私(@hakoniwagadget)にお任せください。

ACCESSの新規開発、既存のACCESSの修正、ACCESSの操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。

サービス一覧

最後までお読みいただき、ありがとうございました。