Юлия Двуреченская
Юлия Двуреченская

Проблема с вызывом GetOpenFileName в VBA

Вот декларация (ситема Win7, 64)
Declare PtrSafe Function GetOpenFileName Lib "COMDLG32" Alias "GetOpenFileNameA" (file As OPENFILENAME) As Long
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
Function BrowseForFile(sInitDir As String, Optional ByVal sFileFilters As String, Optional sTitle As String = "Open File", Optional lParentHwnd As Long) As String
Dim tFileBrowse As OPENFILENAME
Const clMaxLen As Long = 254
tFileBrowse.lStructSize = OPENFILENAME_SIZE_VERSION_400
sFileFilters = Replace(sFileFilters, "|", vbNullChar)
sFileFilters = Replace(sFileFilters, ";", vbNullChar)
If Right$(sFileFilters, 1) <> vbNullChar Then
sFileFilters = sFileFilters & vbNullChar
End If
tFileBrowse.lpstrFilter = sFileFilters & "All Files (*.*)" & vbNullChar & "*.*" & vbNullChar
tFileBrowse.lpstrFile = String(clMaxLen, " ")
tFileBrowse.nMaxFile = clMaxLen + 1
tFileBrowse.lpstrFileTitle = Space$(clMaxLen)
tFileBrowse.nMaxFileTitle = clMaxLen + 1
tFileBrowse.lpstrInitialDir = sInitDir
tFileBrowse.hWndOwner = lParentHwnd
tFileBrowse.lpstrTitle = sTitle
tFileBrowse.flags = OFN_FILEMUSTEXIST Or OFN_PATHMUSTEXIST Or OFN_HIDEREADONLY Or OFN_ALLOWMULTISELECT
If GetOpenFileName(tFileBrowse) Then
BrowseForFile = Trim$(tFileBrowse.lpstrFile)
If Right$(BrowseForFile, 1) = vbNullChar Then
BrowseForFile = Left$(BrowseForFile, Len(BrowseForFile) - 1)
End If
End If
End Function

И проверка работы
Sub GetFile()
Debug.Print BrowseForFile("c:\", "Excel File (*.xls);*.xls", "Open Workbook")
End Sub

В результате запуска ничего не происходит. Ошибок нет. На выходе GetOpenFileName просто пустая строка. Много перечитал, решения не нашел.
Код используется в CorelDraw, поэтому штатные офисные средства (типа FileDialog не проходят) . Полагаю, остается только WinAPI.
Кстати, функция SHGetPathFromIDListA из shell32 работает отлично. Но это для папок.

Владимир
Владимир

попробуйте заполнить параметр lParentHwnd

Похожие вопросы
помогите с формой на VBA
как работать с вкладками в VBA?
Помогите с VBA, пожалуйста.
помогите! ! программка в vba!!
Как сделать такое в VBA?
Программирование в VBA
Проблема с кодом в VBA Excel
Проблема в написании линейной программы на языке VBA (см. внутри)
VBA -программирование
Задание по VBA