AccessVBAでフォルダパス取得を共通部品にする:初期フォルダ固定で使いやすい

AccessVBA

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・同じルールでパス取得ができ品質が安定します。

コメント

タイトルとURLをコピーしました