エクセル術

ファイルを開くダイアログ

■ マクロで別ファイルを開く


マクロを作っていて別ファイルを開きたい時ってよくあると思います。別ファイルの○○のデータを使用したい。ファイルを開く時どうしてますか?
絶対パス?(C:\Document….)って指定してません?そうすると指定ファイルの場所を変えれませんし、ファイル名すら変える事が出来なくなってしまいます。無い場合エラーとなりますし。
そんな時にはファイルを開くダイアログを使用。
エクセルマクロではこれを簡単に使う事が出来ます。
16-1.jpg


■ マクロで別ファイルを開く


まず開く用のボタンを作ります。コマンドボタン1。これをダブルクリックするとVBAの画面が開き
Private Sub CommandButton1_Click() ~ End Sub が表示されます。

その中に下記を記入します。
Private Sub CommandButton1_Click()
Dim Fkouzou As OPENFILENAME
Dim lngRet As Long, NULLPos As Long
Dim FileName As String
Dim wb2 As Workbook
With Fkouzou                             'GetOpenFileName関数に渡す構造体を設定
.lStructSize = Len(Fkouzou)
.lpstrInitialDir = ThisWorkbook.Path    '(最初に表示するディレクトリ)
'(フィルターでファイル種類を絞る)
.lpstrFilter = "Excel(*.xls)" & vbNullChar & "*.xls" _
& vbNullChar & "Text(*.txt)" & vbNullChar & "*.txt"
.nMaxFile = 256                        '(ファイル名の最大長(パス含む))
.lpstrFile = String(256, vbNullChar)   '(ファイル名を格納する文字列
' NULLで埋めておく)
End With
lngRet = GetOpenFileName(Fkouzou)   'ファイル選択ダイアログを表示。
'(「開く」を押すと.lpstrFileにファイル名が格納される。
'  実際に「開かれる」わけではない!)
NULLPos = InStr(Fkouzou.lpstrFile, vbNullChar)  'ファイル名の終り(NULLの位置)を調べる
FileName = Left(Fkouzou.lpstrFile, NULLPos - 1) 'ファイル名の有効部分を取り出す
If FileName <> "" Then  'キャンセルを押された場合は実行しない。
Set wb2 = Workbooks.Open(FileName)  '指定されたファイルを開く
End If
End Sub

それとVBAにて標準モジュールを追加し、下記を記入します。

'ファイルを開くダイアログを表示する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

この例ではフィルターを使い.xls .txtしか選択出来ないようにしています。
内容の解説については黄色文字で書かれている部分を読んでください。

モバイルバージョンを終了