ファイルダイアログの表示

ファイルダイアログはWindows APIを利用して表示可能。
ポイントは、OPENFILENAME構造体と、GetOpenFileNameを宣言すること。
標準モジュールへの記述
'ファイルを開くダイアログを表示するAPI
Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" _
(pOpenfilename As OPENFILENAME) As Long

'APIに渡す構造体を定義
Public Type OPENFILENAME
    lStructSize As Long           'この構造体の長さ
    hwndOwner As Long           '呼び出し元ウインドウハンドル
    hInstance As Long
    lpstrFilter As String           'フィルタ文字列
    lpstrCustomFilter As String
    nMaxCustrFilter As Long
    nFilterIndex As Long
    lpstrFile As String              '選択されたファイル名(フルパス)
    nMaxFile As Long                 'lpstrFileのバッファサイズ
    lpstrFileTitle As String
    nMaxFileTitle As Long
    lpstrInitialDir As String        '初期フォルダ名
    lpstrTitle As String             'コモンダイアログのタイトル名
    flags As Long                    'フラグ
    nFileOffset As Integer
    nFileExtension As Integer
    lpstrDefExt As String           'ファイル名の入力時、拡張子が省略された時の拡張子
    lCustrData As Long
    lpfnHook As Long
    lpTemplateName As String
End Type
標準モジュールへの記述
'ファイル参照
Private Sub FileSelBtn_Click()
    Dim ofn As OPENFILENAME
    Dim lngRet As Long, NULLPos As Long
    Dim FileName As String
    Dim Step1Index
    
    With ofn                             'GetOpenFileName関数に渡す構造体を設定
        .lStructSize = Len(ofn)
        .lpstrInitialDir = ThisWorkbook.Path    '(最初に表示するディレクトリ)
                                                '(フィルターでファイル種類を絞る)
        .lpstrFilter = "ToDoChart File(*.tdc)" & vbNullChar & "*.tdc"
        .nMaxFile = 256                        '(ファイル名の最大長(パス含む))
        .lpstrFile = String(256, vbNullChar)   '(ファイル名を格納する文字列
                                                ' NULLで埋めておく)
    End With
    
    lngRet = GetOpenFileName(ofn)   'ファイル選択ダイアログを表示。
                                '(「開く」を押すと.lpstrFileにファイル名が格納される。
                                '  実際に「開かれる」わけではない!)
    
    NULLPos = InStr(ofn.lpstrFile, vbNullChar)  'ファイル名の終り(NULLの位置)を調べる
    FileName = Left(ofn.lpstrFile, NULLPos - 1) 'ファイル名の有効部分を取り出す
    
    Step1Index = Worksheets("Step1").Index
    If FileName <> "" Then  'キャンセルを押された場合は実行しない。
        Worksheets(Step1Index).Cells(3, 1).Value = FileName

    End If

End Sub
どこかのサイトの情報を参考にしたんだが、忘れてしまった・・・