WindowsAPIを使用する
#If VBA7 Then Private Declare PtrSafe Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long Private Declare PtrSafe Function GetSaveFileName Lib "comdlg32.dll" Alias "GetSaveFileNameA" (pOpenfilename As OPENFILENAME) As Long Private Type OPENFILENAME lStructSize As Long hwndOwner As LongPtr hInstance As LongPtr 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 LongPtr lpTemplateName As String End Type #Else Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long Private Declare Function GetSaveFileName Lib "comdlg32.dll" Alias "GetSaveFileNameA" (pOpenfilename As OPENFILENAME) As Long Private 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 #End If Private Const OFN_HIDEREADONLY = &H4 '読み取り専用オプションを非表示 Private Const OFN_FILEMUSTEXIST = &H1000 'ファイルの存在確認 Public Function fileOpenDialog(ByVal hwnd As Long, ByVal initialDirectory As String, ByVal initialFileName As String, ParamArray fileFilters() As Variant) As String Dim openFile As OPENFILENAME Dim result As Long fileOpenDialog = "" openFile.lpstrFilter = createFilterString(fileFilters) openFile.nFilterIndex = 1 openFile.hwndOwner = hwnd openFile.lpstrFile = String(201, 0) #If VBA7 Then openFile.nMaxFile = LenB(openFile.lpstrFile) - 1 openFile.lStructSize = LenB(openFile) #Else openFile.nMaxFile = Len(openFile.lpstrFile) - 1 openFile.lStructSize = Len(openFile) #End If openFile.lpstrFileTitle = openFile.lpstrFile openFile.nMaxFileTitle = openFile.nMaxFile openFile.lpstrInitialDir = initialDirectory openFile.lpstrFile = initialFileName & String(201 - Len(initialFileName), Chr(0)) openFile.lpstrTitle = "ファイルを開く" openFile.flags = OFN_HIDEREADONLY + OFN_FILEMUSTEXIST result = GetOpenFileName(openFile) If result <> 0 Then fileOpenDialog = Trim(Left(openFile.lpstrFile, InStr(1, openFile.lpstrFile, vbNullChar) - 1)) End If End Function Public Function fileSaveDialog(ByVal hwnd As Long, ByVal initialDirectory As String, ByVal initialFileName As String, ByVal fileExtension As String) As String Dim openFile As OPENFILENAME Dim result As Long fileSaveDialog = "" openFile.lpstrFilter = fileExtension & "ファイル (*." & fileExtension & ")" & Chr(0) & "*." & fileExtension openFile.nFilterIndex = 1 openFile.hwndOwner = hwnd openFile.lpstrFile = String(201, 0) #If VBA7 Then openFile.nMaxFile = LenB(openFile.lpstrFile) - 1 openFile.lStructSize = LenB(openFile) #Else openFile.nMaxFile = Len(openFile.lpstrFile) - 1 openFile.lStructSize = Len(openFile) #End If openFile.lpstrFileTitle = openFile.lpstrFile openFile.nMaxFileTitle = openFile.nMaxFile openFile.lpstrInitialDir = initialDirectory openFile.lpstrFile = initialFileName & String(201 - Len(initialFileName), Chr(0)) openFile.lpstrDefExt = fileExtension openFile.lpstrTitle = "ファイルの保存" openFile.flags = 0 result = GetSaveFileName(openFile) If result <> 0 Then fileSaveDialog = Trim(Left(openFile.lpstrFile, InStr(1, openFile.lpstrFile, vbNullChar) - 1)) End If End Function Private Function createFilterString(ByVal fileFilters As Variant) As String Dim filterString As String filterString = "" For i = 0 To UBound(fileFilters) Dim filter() As String filter = Split(fileFilters(i), "|") If Len(filterString) > 0 Then filterString = filterString & Chr(0) End If If UBound(filter) = 1 Then filterString = filterString & filter(0) & Chr(0) & filter(1) ElseIf UBound(filter) = 0 Then filterString = filterString & filter(0) End If Next i createFilterString = filterString End Function