【Access VBA】逆引きチートシート⑤ ファイル操作・デバッグ・高速化編(VBAエキスパート・スタンダード試験対応)


Access VBA スタンダード・チートシートの最後となる第5弾を作成します。 今回は、実務の仕上げに欠かせない「ファイル操作・デバッグ・高速化」です。
プログラムを動かすだけでなく、外部ファイルと連携させたり、エラーが起きても止まらない堅牢なシステムにしたりするための必須知識をまとめます。


Access VBA スタンダード・チートシートの最終回です。
どれほど優れたデータベースも、エラーで頻繁に止まったり、動作が極端に遅かったりすれば実用には耐えません。
第5回は、外部ファイルを自由に操るFileSystemObject、予期せぬ事態を防ぐエラーハンドリング、そして処理を劇的に速くするコツを伝授します。


1. FileSystemObject (FSO) によるファイル操作

VBA標準のステートメント(DirやKillなど)よりも高機能で扱いやすいのがFSOです。 ※参照設定:Microsoft Scripting Runtime が必要です。

Dim fso As New Scripting.FileSystemObject

' ファイルの存在確認
If fso.FileExists("C:\Temp\Data.csv") Then
    ' ファイルのコピー
    fso.CopyFile "C:\Temp\Data.csv", "C:\Backup\Data_bak.csv"
    ' ファイルの移動
    fso.MoveFile "C:\Temp\Data.csv", "C:\Done\"
End If

' フォルダ内のファイル一覧を取得
Dim f As File
For Each f In fso.GetFolder("C:\Temp").Files
    Debug.Print f.Name & " (サイズ: " & f.Size & " bytes)"
Next

2. FileDialog(ファイル選択ダイアログ)

ユーザーにファイルやフォルダを選ばせる標準的なUIです。 ※参照設定:Microsoft Office n.n Object Library が必要です。

Dim fd As Office.FileDialog
Set fd = Application.FileDialog(msoFileDialogFilePicker)

With fd
    .Title = "インポートするファイルを選択してください"
    .Filters.Add "CSVファイル", "*.csv"
    .AllowMultiSelect = False ' 複数選択不可

    If .Show = True Then
        MsgBox "選択されたファイル: " & .SelectedItems(1)
    End If
End With

3. 高度なエラー処理

「エラーが起きたらメッセージを出して安全に終了する」構成です。

Sub AdvancedProcess()
    On Error GoTo Err_Handler ' エラーが起きたら Err_Handler へジャンプ

    ' --- メイン処理 ---
    Dim x As Integer: x = 1 / 0 ' 意図的なエラー

    Exit Sub ' 正常終了時はここで抜ける(重要!)

Err_Handler:
    MsgBox "エラー番号: " & Err.Number & vbCrLf & _
           "エラー内容: " & Err.Description, vbCritical, "システムエラー"

    ' 後始末(開いているRecordsetを閉じるなど)
    Resume Next ' エラーが起きた次の行から再開する場合
End Sub

4. デバッグの三種の神器

効率的なデバッグには、イミディエイトウィンドウ以外の活用が不可欠です。

  • ウォッチウィンドウ: 特定の変数の値が「いつ、どう変わるか」を常時監視します。

  • ローカルウィンドウ: 現在実行中のプロシージャ内の「すべての変数」の状態を一覧表示します。

  • Debug.Assert: Debug.Assert x > 0 のように書き、条件が False になった瞬間にプログラムを一時停止(ブレーク)させます。


5. 高速化・最適化のテクニック

大量のデータを扱う際に、体感速度を劇的に変える設定です。

画面更新と警告の停止

' 画面更新を止める(ちらつき防止と高速化)
Application.Echo False

' システムメッセージ(「n件更新します」等)を止める
DoCmd.SetWarnings False

' --- 重い処理 ---

DoCmd.SetWarnings True
Application.Echo True

SQL vs Recordset

  • 一括処理ならSQL: CurrentDb.Execute "UPDATE..." の方が、レコードセットをループさせて1件ずつ更新するより圧倒的に速いです。

  • dbFailOnError: Execute メソッドを使う際は、dbFailOnError オプションをつけると、SQL失敗時にランタイムエラーを発生させてくれるので安全です。


6. コンパイルと参照設定の管理

  • デバッグメニュー > [プロジェクト名]のコンパイル: 実行前に文法エラーをすべて洗い出します。

  • 事前バインディング (Early Binding): 上記のFSOなどで「参照設定」を行う方法。入力補完(インテリセンス)が効き、動作も高速です。


おわりに

全5回にわたるAccess VBA スタンダード・チートシートはいかがでしたか? ベーシックを越え、スタンダードレベルの知識(ADO/DAO、複雑なSQL、FSO、エラー制御)を身につければ、Accessで作成できるシステムの幅は無限に広がります。
このチートシートが、あなたの業務効率化とスキルアップの助けになれば幸いです。



いいなと思ったら応援しよう!