MyTetra Share
Делитесь знаниями!
Диалоги
16.03.2019
23:43
Текстовые метки: k_Диалоги,access, FileDialog
Раздел: !Закладки - VBA

Имейте ввиду, что Application.FileDialog в А2007/2010 не работает (или работает не всё). Те примеры диалога, что вы нашли, слишком громоздки и непонятны для начинающих профи. Можно проще:

Public Function SelectFileDialogForAccess(Optional fSaveMode As Boolean, _
    Optional strInitialDir As String, _
    Optional strFilterString As String = "Все файлы (*.*)|Файлы MSAccess (*.mdb;*.mde;*.mda)", _
    Optional ByVal fMultiSelect As Boolean, _
    Optional ByVal DefSaveFileName As String, _
    Optional strTitle As String = "Выбор файла", _
    Optional ByVal strButtonName As String) As String
'РАБОТАЕТ ТОЛЬКО В ACCESS! Версия не ниже А2000.
'Открывает диалог выбора файла или нескольких файлов (при fMultiSelect=True).
'Возвращает полный путь к выбранному файлу или строку из полных путей, разделеленных символом vbTab (при fMultiSelect=True).
'Список файлов можно ограничить фильтром в strFilterString (синтаксис должен соответствовать предложенному по умолчанию).
'В strInitialDir можно указать путь к папке, которая будет открыта при вызове диалога.
'При fSaveMode=Труе в диалоге становится доступным поле "Имя файла", где может быть изменено имя выбранного файла.
' При вызове диалога в этом поле отражается текст, указанный в DefSaveFileName, который функция вернет, если не выделять
' другой файл в диалоге (папку можно менять). При этом, если не указано расширение и выбран фильтр по конкретному расширению,
' то оно добавится к имени файла.
'В strTitle и strButtonName можно указать заголовок диалога и наименование кнопки выбора.
Dim ret As Long, strFile As String, intFlags As Integer

    WizHook.Key = 51488399
 
 If fSaveMode Then
    strFile = DefSaveFileName & String(255, Chr(0))
    fMultiSelect = False
 ElseIf fMultiSelect Then
    strFile = String(5000, Chr(0))
    intFlags = 12
 Else
    strFile = String(255, Chr(0))
 End If
    
    ret = WizHook.GetFileName(Application.hWndAccessApp, "", strTitle, strButtonName, _
        strFile, strInitialDir, strFilterString, 0, 0, intFlags, Not fSaveMode)
        
' Проверим, не произошел ли возврат в результате нажатия клавиши Esc (-302)
 If ret <> -302 Then
    SelectFileDialogForAccess = strFile
 End If
End Function

А вот пример, выводящий выбранные файлы в окне отладки. Вместо Debug.Print можно выполнить DoCmd.TransferText.

Sub TestDialog()
Dim s$, v, i&
s = SelectFileDialogForAccess(, CurrentProject.Path, , True)
If Len(s) = 0 Then Exit Sub
v = Split(s, vbTab)
For i = LBound(v) To UBound(v)
Debug.Print v(i)
Next
End Sub


Ну и до кучи диалог выбора папки на той же основе:

Public Function SelectFolderDialogForAccess(Optional strInitialDir As String, _
    Optional strTitle As String = "Выбор папки", _
    Optional ByVal strButtonName As String) As String
Dim ret As Long, strFolder As String
'РАБОТАЕТ ТОЛЬКО В ACCESS! Версия не ниже А2000.
'Открывает диалог выбора папки, возвращает полный путь к выбранной папке.
'В strInitialDir можно указать путь к папке, которая будет открыта при вызове диалога.
'В strTitle и strButtonName можно указать заголовок диалога и наименование кнопки выбора.
    
    WizHook.Key = 51488399
 
    strFolder = String(255, Chr(0))
    
    ret = WizHook.GetFileName(Application.hWndAccessApp, "", strTitle, strButtonName, _
        strFolder, strInitialDir, "*.*", 0, 0, 32, True)
        
' Проверим, не произошел ли возврат в результате нажатия клавиши Esc (-302)
 If ret <> -302 Then
    SelectFolderDialogForAccess = strFolder
 End If
End Function
Так же в этом разделе:
 
MyTetra Share v.0.52
Яндекс индекс цитирования