こんにちは!開発現場を渡り歩くシニア・アーキテクトの私です。
Access VBAを使ったシステム開発、順調に進んでいますか?
「マクロの記録」から一歩踏み出し、自らコードを書くようになったあなたへ、今回は実務で100%と言っていいほど直面する「パス(ファイルのありか)の罠」と、それを美しくクリアするための極意をお伝えします。
ここをクリアすれば、あなたの書くAccessアプリは、PCの引っ越しや共有サーバーへの移行があってもビクともしない、プロフェッショナルな代物に生まれ変わります。一緒に紐解いていきましょう!
—
1. 現場の悲劇:なぜ「C:\Users\…」と書いてはいけないのか?
初学者が最初にやりがちなのが、外部のExcelやCSVファイルを読み込む際に、以下のようなコードを書くことです。
‘ 【やってはいけない例】
Dim filePath As String
filePath = “C:\Users\Yamada\Desktop\Project\Data\import.xlsx”
一見、何の問題もないように見えますよね。しかし、このコードには「時限爆弾」が仕込まれています。
- 担当者のPCが変わったら?(例:`\Tanaka\Documents\…` になる)
- 社内共有サーバー(ネットワークドライブ)に配置したら?
- フォルダ名をうっかり変えてしまったら?
すべて「ファイルが見つません(実行時エラー)」で即座にクラッシュします。現場でこれをやると、運用保守のたびに修正に追われるハメになり、先輩から冷たい視線を浴びる原因になります。
救世主:`Application.CurrentProject.Path`
「じゃあ、どうすればいいんだよ!」という叫び声が聞こえてきそうですね。
ここで登場するのが、今回の主役である `Application.CurrentProject.Path` です。
これは、「今まさに動いているこのAccessファイル(.accdb / .mdb)が保存されているフォルダの場所」を自動的に取得してくれる魔法のプロパティです。
例えば、あなたのAccessファイルが `D:\Work\System\App.accdb` にあるなら、このプロパティは `D:\Work\System` という文字列を返してくれます。
これを使えば、Accessファイルと同じ階層(あるいはその配下のフォルダ)にあるファイルへのパスを、相対パスで動的に組み立てることができるのです。環境が変わっても、Access本体とデータフォルダの位置関係さえ崩さなければ、絶対にパスエラーになりません。
—
2. 実践!動的パスでExcel/CSVを取り込むコード
それでは、実務でそのまま使えるサンプルコードを見てみましょう。
今回は、Accessファイルと同じ場所にある `Data` というフォルダの中の `sales.xlsx` を読み込むシナリオを想定します。
フォルダ構成のイメージ
D:\Work\System\
┣ App.accdb ← ★今動いているAccess
┗ Data\
┗ sales.xlsx ← ★読み込みたいExcelファイル
黄金のVBAコード
以下のコードを標準モジュールに貼り付けて実行してみてください。
Option Explicit
Public Sub ImportSalesData()
On Error GoTo ErrorHandler
Dim dbPath As String
Dim targetFile As String
‘ 1. 現在のAccessファイルがあるフォルダのパスを取得
‘ (末尾の「\」は自動付与されないため、自分で補うのが鉄則!)
dbPath = Application.CurrentProject.Path & “\”
‘ 2. 読み込みたいファイルのフルパスを動的に組み立てる
‘ 構成: [Accessの場所] + [フォルダ名] + [ファイル名]
targetFile = dbPath & “Data\sales.xlsx”
‘ 【デバッグ用】本当に意図したパスになっているか確認する
Debug.Print “取得したパス: ” & targetFile
‘ 3. ファイルが存在するかチェックする(安全装置)
If Dir(targetFile) = “” Then
MsgBox “指定されたファイルが見つかりません。” & vbCrLf & _
“パスを確認してください:” & targetFile, vbExclamation, “ファイルエラー”
Exit Sub
End If
‘ — ここから先は実際のインポート処理(例) —
‘ DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, “T_Sales”, targetFile, True
MsgBox “ファイルのパス取得と存在確認に成功しました!”, vbInformation, “完了”
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “システムエラー”
End Sub
—
3. コードの急所:プロが教える3つのこだわりポイント
上記のコードには、現場で生き残るための「エンジニアの知見」が詰まっています。ポイントを3つに分けて解説します。
① 末尾の「バックスラッシュ(\)」に気をつけろ!
`Application.CurrentProject.Path` が返す文字列には、最後の「\」が含まれません。
そのため、そのままファイル名をつなげようとすると `D:\Work\SystemData\sales.xlsx` のようになってしまい、「そんなフォルダねーよ!」と怒られます。必ず `& “\”` で明示的に結合しましょう。
② `Dir` 関数で「事前の存在チェック」を怠るな!
ファイルパスを動的に生成しても、肝心のファイルが消されていては意味がありません。VBAの `Dir()` 関数を使い、ファイルが実在するかどうかを事前にチェックする防衛的プログラミング(Defensive Programming)を徹底しましょう。これがバグらないシステムの基本です。
③ `Debug.Print` でイミディエイトウインドウに出力する
「パスの組み立て方が不安だな…」という時は、`Debug.Print` を使ってVBEの「イミディエイトウインドウ(Ctrl + G)」にパスを出力してみましょう。動的に作られた文字列が意図通りか一目で確認できます。プログラミングの基本にして最強のデバッグ手法です。
—
まとめ:ここをクリアすれば、Access VBAの基本はバッチリ!
今回は、`Application.CurrentProject.Path` を使った相対パスによるファイル連携の極意をお伝えしました。
- 絶対パス(C:\…)で書くのは卒業する
- `Application.CurrentProject.Path` で基準地(ホーム)を知る
- 末尾の「\」とファイル存在チェック(`Dir`)を忘れない
この3つさえ押さえておけば、あなたの作るAccessアプリの「環境適応能力」は劇的に向上します。どんなPCに持って行っても、USBメモリで持ち運んでも、スイスイ動くスマートなシステムが作れるはずです。
日々の開発、ぜひ楽しんでいきましょう。あなたのAccessライフを、エンジニアとして心から応援しています!
