GetOpenFileNameは、ファイル選択ダイアログボックスを開くことができるWindows API です。

Windows API GetOpenFileNameとは

■ GetOpenFileNameの宣言
Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long

■ GetOpenFileNameの構文
長整数型変数 = GetOpenFileName( OPENFILENAME構造体 )

GetOpenFileName使用例画面
Windows APIのコードを入力した画面

入力したVBAコードです。


Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _
    "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
Declare Function GetActiveWindow Lib "user32" () As Long

Const OFN_PATHMUSTEXIST = &H800
Const OFN_FILEMUSTEXIST = &H1000
Const OFN_HIDEREADONLY = &H4
Const BUFF_SIZE = 512
Type OPENFILENAME
    lStructSize As Long
    hwndOwner As Long
    hInstance As Long
    lpstrFilter As String
    lpstrCustomFilter As String
    nMaxCustFilter As Long
    nFilterIndex As Long
    lpstrFile As String
    nMaxFile As Long
    lpstrFileTitle As String
    nMaxFileTitle As Long
    lpstrInitialDir As String
    lpstrTitle As String
    flags As Long
    nFileOffset As Integer
    nFileExtension As Integer
    lpstrDefExt As String
    lCustData As Long
    lpfnHook As Long
    lpTemplateName As String
End Type

Sub ファイル選択ダイアログ()
    Dim lLen As Long
    Dim sFilter As String
    Dim sRetFile As String
    Dim tOpen As OPENFILENAME

    sFilter = "Excel ファイル (*.xls; *.xlsx; *.xlsm),*.xls; *.xlsx; *.xlsm"
    tOpen.lStructSize = Len(tOpen)
    tOpen.hwndOwner = GetActiveWindow()
    tOpen.hInstance = 0
    tOpen.lpstrFilter = sFilter
    tOpen.nFilterIndex = 1
    tOpen.flags = OFN_PATHMUSTEXIST Or OFN_FILEMUSTEXIST Or OFN_HIDEREADONLY
    tOpen.lpstrTitle = "ファイルを選択してください"
    tOpen.nMaxFile = BUFF_SIZE
    tOpen.lpstrFileTitle = String(BUFF_SIZE, vbNullChar)
    tOpen.nMaxFileTitle = BUFF_SIZE
    tOpen.lpstrFile = String(BUFF_SIZE, vbNullChar)
    tOpen.lpstrDefExt = vbNullChar
    If GetOpenFileName(tOpen) <> False Then
        lLen = InStr(tOpen.lpstrFile, vbNullChar) - 1
        sRetFile = Left(tOpen.lpstrFile, lLen)
        Range("B3") = sRetFile
    Else
        Range("B3") = "ファイルは選択されませんでした。"
    End If
    
End Sub

VBAプログラムの説明


GetOpenFileName Windows APIの宣言
Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _
"GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
GetActiveWindow Windows APIの宣言
Declare Function GetActiveWindow Lib "user32" () As Long
有効なパス及びファイル名でなければ入力を許さない
Const OFN_PATHMUSTEXIST = &H800
既存のファイル名しか入力を許さない
Const OFN_FILEMUSTEXIST = &H1000
「読み取り専用」チェックボックスを隠す
Const OFN_HIDEREADONLY = &H4
ファイル名保存用のエリア
Const BUFF_SIZE = 512
OPENFILENAME構造体
Type OPENFILENAME
lStructSize As Long
hwndOwner As Long
hInstance As Long
lpstrFilter As String
lpstrCustomFilter As String
nMaxCustFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
flags As Long
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustData As Long
lpfnHook As Long
lpTemplateName As String
End Type

Subプロシージャの宣言
Sub ファイル選択ダイアログ()
長整数型の変数を宣言
Dim lLen As Long
文字型の変数を宣言
Dim sFilter As String
文字型の変数を宣言
Dim sRetFile As String
OPENFILENAME構造体を宣言
Dim tOpen As OPENFILENAME
表示するファイルのフィルター
sFilter = "Excel ファイル (*.xls; *.xlsx; *.xlsm),*.xls; *.xlsx; *.xlsm"
OPENFILENAME構造体のサイズ
tOpen.lStructSize = Len(tOpen)
ダイアログボックスの親ウィンドウハンドル
tOpen.hwndOwner = GetActiveWindow()
インスタンスハンドル
tOpen.hInstance = 0
ファイルの種類
tOpen.lpstrFilter = sFilter
フィルターのインデックス
tOpen.nFilterIndex = 1
フラグ指定
tOpen.flags = OFN_PATHMUSTEXIST Or OFN_FILEMUSTEXIST Or OFN_HIDEREADONLY
ダイアログボックスのタイトル
tOpen.lpstrTitle = "ファイルを選択してください"
lpstrFileの変数サイズ
tOpen.nMaxFile = BUFF_SIZE
選択ファイル名の保存先
tOpen.lpstrFileTitle = String(BUFF_SIZE, vbNullChar)
pstrFileTitleのサイズ
tOpen.nMaxFileTitle = BUFF_SIZE
選択ファイル名の保存先(フルパス)
tOpen.lpstrFile = String(BUFF_SIZE, vbNullChar)
デフォルトのファイルの種類
tOpen.lpstrDefExt = vbNullChar
ダイアログボックスの戻り値がFalseでなければ(キャンセルでなければ)
If GetOpenFileName(tOpen) <> False Then
選択ファイルの長さを取得
lLen = InStr(tOpen.lpstrFile, vbNullChar) - 1
選択されたファイル名を取得
sRetFile = Left(tOpen.lpstrFile, lLen)
B3セルにファイル名を入力
Range("B3") = sRetFile
真でなければ
Else
B3セルにメッセージを入力
Range("B3") = "ファイルは選択されませんでした。"
IF文の終了
End If
プロシージャの終了
End Sub

ファイル選択ダイアログの実行画面
マクロ一覧から「ファイル選択ダイアログ」マクロを実行します。
マクロ一覧

実行しファイル選択ダイアログが開いている画面です。
ファイル選択ダイアログ

上のファイル選択ダイアログでファイルを選択し「開く」をクリックした場合のシートです。キャンセルをクリックした場合は、「ファイルは選択されませんでした。」と表示されます。
ファイルを選択した結果

Excelマクロのサンプルファイル:フリーダウンロード








Copyright (C) excel.usefulhp.com All rights reserved.