Как использовать filedialogbox для сохранения пути к файлу в строке с помощью VBA в Access

У меня есть файл Access, который я буду использовать для проверки качества данных.

Я буду вводить данные из трех файлов Excel, каждый в свою таблицу Access.

В настоящее время у меня есть три кнопки и соответствующие текстовые поля. Я вручную ввожу путь и имя файла в текстовое поле, нажимаю кнопку, и остальная часть моего макроса завершается, импортируя данные.

Вместо того, чтобы вручную вводить путь и имя файла в текстовое поле, я хотел бы использовать диалоговое окно выбора файлов, чтобы заполнить текстовое поле путем.

Возможно ли это в Access?

Спасибо заранее за вашу помощь.

Адам


person Adam Blunt    schedule 17.02.2016    source источник
comment
Похоже, вам нужен Application.FileDialog. Поскольку вам нужен полный путь, извлеките .SelectedItems(1) вместо Dir(.SelectedItems(1))   -  person HansUp    schedule 17.02.2016
comment
Вы должны были сначала погуглить это. Мне не нужно смотреть на это, чтобы понять, что это дубликат на многих уровнях.   -  person Anthony Griggs    schedule 17.02.2016


Ответы (5)


Этот код и работал для меня:

Private Sub Comando32_Click()
    Dim f As Object
    Dim strFile As String
    Dim strFolder As String
    Dim varItem As Variant

    Set f = Application.FileDialog(3)
    f.AllowMultiSelect = False

    If f.Show Then
        For Each varItem In f.SelectedItems
            strFile = Dir(varItem)
            strFolder = Left(varItem, Len(varItem) - Len(strFile))
            MsgBox "Folder: " & strFolder & vbCrLf & _
                "File: " & strFile
            Me.certidao.Value = varItem
        Next
    End If
    Set f = Nothing
End Sub
person Manuel Victorio    schedule 18.07.2019

Конечно, можно вызвать файл Dialog API в VBA!

Пример прямо из документации Microsoft VBA:

Private Sub cmdFileDialog_Click() 

   ' Requires reference to Microsoft Office XY.0 Object Library. 

   Dim fDialog As Office.FileDialog 
   Dim varFile As Variant 

   ' Clear listbox contents. 
   Me.FileList.RowSource = "" 

   ' Set up the File Dialog. 
   Set fDialog = Application.FileDialog(msoFileDialogFilePicker) 

   With fDialog 

      ' Allow user to make multiple selections in dialog box 
      .AllowMultiSelect = True 

      ' Set the title of the dialog box. 
      .Title = "Please select one or more files" 

      ' Clear out the current filters, and add our own. 
      .Filters.Clear 
      .Filters.Add "Access Databases", "*.MDB" 
      .Filters.Add "Access Projects", "*.ADP" 
      .Filters.Add "All Files", "*.*" 

      ' Show the dialog box. If the .Show method returns True, the 
      ' user picked at least one file. If the .Show method returns 
      ' False, the user clicked Cancel. 
      If .Show = True Then 

         'Loop through each file selected and add it to our list box. 
         For Each varFile In .SelectedItems 
            Me.FileList.AddItem varFile 
         Next 

      Else 
         MsgBox "You clicked Cancel in the file dialog box." 
      End If 
   End With 
End Sub

Обратите внимание, что вы должны включить ссылку на библиотеку Microsoft Office 11.0 (в окне кода выберите пункт меню Tools, Reference и выберите свою библиотеку для правильной версии вашей версии Office)

person Cisco    schedule 17.02.2016
comment
Привет, Cisco, только что заметил, что ты сказал под этим кодом. Я проверил, и у меня выбрана «Библиотека объектов Microsoft Office 14.0». У меня есть возможность переместить его в приоритет, так как в настоящее время он занимает 4-е место. Будет ли это иметь значение? - person Adam Blunt; 18.02.2016
comment
Я включил «Библиотека объектов Microsoft Excel 14.0» и «Библиотека объектов Microsoft 15». Теперь ошибка проходит мимо предыдущей ошибки, но теперь выдает «Метод или член данных не найден» с Me.txtFileSelect.RowSource = "". Я дважды проверил имена текстового поля и кнопки cmd, и они такие, как показано в коде. - person Adam Blunt; 18.02.2016

Спасибо за ответ.

Сначала я погуглил и перепробовал все, что нашел. Я также наткнулся на тот самый набор кода, вставленный выше. Я некоторое время играл с ним, и все, что я делал, возвращало ошибки. Я решил попробовать код в Excel вместо Access, и он сразу заработал. Единственное, что я мог подумать, это то, что код неприменим для доступа. После всего этого я задал вопрос здесь.

Private Sub cmdDialog_Click()

   Dim fDialog As Office.FileDialog
   Dim varFile As Variant

   Me.txtFileSelect.RowSource = ""

   Set fDialog = Application.FileDialog(msoFileDialogFilePicker)

   With fDialog

      .AllowMultiSelect = False
      .Title = "Please select one or more files"

      .Filters.Clear
      .Filters.Add "Excel Files", "*.XLSX"
      .Filters.Add "All Files", "*.*"

      If .Show = True Then

         For Each varFile In .SelectedItems
            Me.txtFileSelect.AddItem varFile
         Next

      Else
         MsgBox "You clicked Cancel in the file dialog box."
      End If
   End With
End Sub

С этим кодом я получаю: Ошибка компиляции; Пользовательский тип не идентифицирован

person Adam Blunt    schedule 18.02.2016
comment
Если ошибка компиляции выделяет Office.FileDialog, вы можете переключиться на позднюю привязку, как описано в этом ответе: тип FileDialog не определен в MS Access< /а> - person HansUp; 23.02.2016

Попробуйте этот код для одного файла:

MyFileURL = aBrowseForFile("C:\users\") 


Public Function aBrowseForFile(aStartFolder As String) As String

' Needs a reference to Microsoft Office Object Library 15.0

On Error GoTo Err_txtBrowseForFile

Dim fDialog As Office.FileDialog
Dim varfile As Variant
Dim strPath As String
Dim strFilter As String, strFileName As String
Dim Main_Dir As String, DefFolder As String


Set fDialog = Application.FileDialog(msoFileDialogFilePicker)


With fDialog
    .InitialView = msoFileDialogViewThumbnail
    .AllowMultiSelect = False
    .Title = "Please select one or more files"
    .InitialFileName = aStartFolder
    .InitialView = msoFileDialogViewThumbnail
    .Filters.Clear
    .Filters.Add "all files", "*.*"


     ' Show the dialog box. If the .Show method returns True, the
     ' user picked at least one file. If the .Show method returns
     ' False, the user clicked Cancel.

    If .Show = True Then
         aBrowseForFile = .SelectedItems(1)
    Else
        'MsgBox "You clicked Cancel in the file dialog box."
    End If
  End With

Exit_txtBrowseForFile:
       Exit Function

Err_txtBrowseForFile:
       MsgBox Err.Description, vbCritical, "MyApp"
       Resume Exit_txtBrowseForFile

    End Function

Поместите эту функцию в модуль, как есть. Не помещайте внутрь какой-либо другой код, чтобы вы могли вызывать его в других проектах и ​​создавать свой собственный набор инструментов.

Назовите это, как показано выше в вашей форме.

Этот код работает хорошо и проверен.

Если вы хотите проверить этот код, в окне отладки введите

debug.print aBrowseForFile("C:\users\") 

и посмотреть, что происходит. Если у вас есть другие ошибки времени выполнения или компиляции, задайте еще один вопрос.

Надеюсь это поможет

person Cisco    schedule 20.02.2016

Спасибо за ответ.

Я решил проблему в конце концов, я не выбрал базу данных объектов. Я нашел следующий код для работы:

Private Sub cmdInput_Click()

   Dim fDialog As Office.FileDialog
   Dim varFile As Variant

   Set fDialog = Application.FileDialog(msoFileDialogFilePicker)

   With fDialog

      .AllowMultiSelect = False
      .Title = "Please select a file"

      .Filters.Clear
      .Filters.Add "Excel Files", "*.XLSX"
      .Filters.Add "All Files", "*.*"

If .Show = True Then

For Each varFile In .SelectedItems

    DoCmd.TransferSpreadsheet acImport, 10, "InputData", varFile, True, ""
    Beep

    MsgBox "Import Complete!", vbExclamation, ""

Next
Else
         MsgBox "You clicked Cancel in the file dialog box."
End If

   End With

End Sub
person Adam Blunt    schedule 26.02.2016