AccessVBAでクエリを簡単に作成するには?
AccessVBAのプログラム処理中に動的にSQLからクエリを作成したい場合があります。
シチュエーション
エクスポート先フォルダの指定
帳票やCSV出力の保存先をユーザーに選ばせたいときに使用。手入力をなくし、誤入力や存在しないパス指定を回避できます。
取り込み対象フォルダの指定
CSV/EXCELを一括取り込みする前に、取り込み元フォルダを選択させる用途。毎回パスを書き換えずに運用できます。
クエリ作成・実行の前段として使う
選択したフォルダを条件にSQLを組み立て、クエリ化して実行する流れに組み込むと、処理が読みやすく保守もしやすくなります。
フォルダ選択のサンプルコード
サンプルコードを紹介します。
'================================================================================
' プロシージャ名:gf_getFolderName
' 機能 :フォルダ選択ダイアログを表示し、選択されたフォルダパスを返します。
'
' 【引数】
' なし(初期フォルダはデスクトップ固定)
'
' 【戻り値】
' 選択されたフォルダパス(キャンセル時は空文字 "")
'
' 【処理概要】
' ・初期フォルダをデスクトップに設定
' ・FolderPickerでフォルダを選択させ、選択結果を返す
'
' 【使用例】
' Dim folderPath As String
' folderPath = gf_getFolderName()
'================================================================================
Public Function gf_getFolderName() As String
Dim l_intret As Integer ' ダイアログ結果
Dim l_desktopPath As String ' デスクトップパス
Dim l_shell As Object ' WScript.Shell(遅延バインディング)
On Error GoTo ErrHandler
'=== 既定戻り値 ===
gf_getFolderName = ""
'=== デスクトップパス取得 ===
Set l_shell = CreateObject("WScript.Shell")
l_desktopPath = l_shell.SpecialFolders("Desktop")
' InitialFileName は末尾に "\" を付けると安定するので付与する。
If Right$(l_desktopPath, 1) <> "\" Then
l_desktopPath = l_desktopPath & "\"
End If
'=== フォルダ選択ダイアログ ===
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "フォルダ選択ダイアログ" ' ダイアログタイトル
.InitialFileName = l_desktopPath ' 初期フォルダ(デスクトップ固定)
l_intret = .Show
If l_intret <> 0 Then
'--- フォルダが選択された ---
gf_getFolderName = Trim$(.SelectedItems.Item(1))
Else
'--- キャンセル時 ---
gf_getFolderName = ""
End If
End With
ExitProc:
Set l_shell = Nothing
Exit Function
ErrHandler:
' 何らかの理由でデスクトップ取得に失敗した場合は空文字で返す
gf_getFolderName = ""
Resume ExitProc
End Function使い方
呼び出し側(フォームのボタン押下など)で以下のように実行します。
Dim folderPath As String
'フォルダ選択ダイアログが開きます。
folderPath = gf_getFolderName()
MsgBox folderPath実行結果

【OK】ボタンを押下すると以下のような形で取得したパスを表示します。

【キャンセル】ボタンを押下すると空文字が返ります。

補足として、MyDocumentsに変更するとドキュメントフォルダが初期値となります。
'=== デスクトップパス取得 ===
Set l_shell = CreateObject("WScript.Shell")
' l_desktopPath = l_shell.SpecialFolders("Desktop")
l_desktopPath = l_shell.SpecialFolders("MyDocuments")
最後に
フォルダパスを「手入力させる」運用は、入力ミス・存在しないパス・環境差分など、地味にトラブルが増えがちです。
今回の gf_getFolderName のように、フォルダ選択を関数化して共通部品にしておくと、どの処理でも同じUI・同じルールでパス取得ができ品質が安定します。



コメント