ACCESS VBA 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については以下の記事にまとめてありますのでご覧ください。
以上、BOFの使い方をご紹介しました。
ACCESSを使いこなせば、業務の効率化や自動化が実現できます。
しかし、自分でACCESSを学ぶには時間がない、難しそうで不安、という方も多いでしょう。
そんな時は、ACCESS開発歴20年以上、過去に100以上のACCESSデータベースを開発してきた私(@hakoniwagadget)にお任せください。
ACCESSの新規開発、既存のACCESSの修正、ACCESSの操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。
最後までお読みいただき、ありがとうございました。