web-dev-qa-db-fra.com

Comment afficher la boîte de dialogue «Ouvrir un fichier» dans Access 2007 VBA?

Comment pourrais-je afficher une boîte de dialogue d'ouverture de fichier (ou de sélection de fichier) dans Access 2007 VBA?

J'ai essayé d'utiliser Application.GetOpenFileName comme je le ferais dans Excel, mais cette fonction n'existe pas dans Access.

34
jwoolard

Mes commentaires sur la réponse de Renaud Bompuis ont mal tourné.

En fait, vous pouvez utiliser une liaison tardive et la référence à la bibliothèque d'objets 11.0 n'est pas requise.

Le code suivant fonctionnera sans aucune référence:

 Dim f    As Object 
 Set f = Application.FileDialog(3) 
 f.AllowMultiSelect = True 
 f.Show 

 MsgBox "file choosen = " & f.SelectedItems.Count 

Notez que ce qui précède fonctionne également bien lors de l'exécution.

45
Albert D. Kallal

Dans Access 2007, il vous suffit d'utiliser Application.FileDialog.

Voici l'exemple de la documentation Access:

' Requires reference to Microsoft Office 12.0 Object Library. '
Private Sub cmdFileDialog_Click()
   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

Comme le dit l'exemple, assurez-vous simplement d'avoir une référence à la Bibliothèque d'objets Microsoft Access 12. (sous le menu VBE IDE> Outils> Références).

19
Renaud Bompuis

Ajout à ce qu'Albert a déjà dit:

Ce code (un mashup de divers exemples) offre la possibilité d'avoir une boîte de dialogue SaveAs

Function getFileName() As String
    Dim fDialog    As Object
    Set fDialog = Application.FileDialog(msoFileDialogSaveAs)
    Dim varFile As Variant

    With fDialog
       .AllowMultiSelect = False
       .Title = "Select File Location to Export XLSx :"
       .InitialFileName = "jeffatwood.xlsx"

    If .Show = True Then
       For Each varFile In .SelectedItems
         getFileName = varFile
       Next
    End If
End With
End Function
3
John M

J'ai une solution similaire à ce qui précède et cela fonctionne pour l'ouverture, l'enregistrement, la sélection de fichiers. Je le colle dans son propre module et l'utilise dans toutes les bases de données Access que je crée. Comme le code l'indique, il nécessite la bibliothèque d'objets Microsoft Office 14.0. Juste une autre option, je suppose:

Public Function Select_File(InitPath, ActionType, FileType)
    ' Requires reference to Microsoft Office 14.0 Object Library.

    Dim fDialog As Office.FileDialog
    Dim varFile As Variant


    If ActionType = "FilePicker" Then
        Set fDialog = Application.FileDialog(msoFileDialogFilePicker)
        ' Set up the File Dialog.
    End If
    If ActionType = "SaveAs" Then
        Set fDialog = Application.FileDialog(msoFileDialogSaveAs)
    End If
    If ActionType = "Open" Then
        Set fDialog = Application.FileDialog(msoFileDialogOpen)
    End If
    With fDialog
        .AllowMultiSelect = False
        ' Disallow user to make multiple selections in dialog box
        .Title = "Please specify the file to save/open..."
        ' Set the title of the dialog box.
        If ActionType <> "SaveAs" Then
            .Filters.Clear
            ' Clear out the current filters, and add our own.
            .Filters.Add FileType, "*." & FileType
        End If
        .InitialFileName = InitPath
        ' Show the dialog box. If the .Show method returns True, the
        ' user picked a 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
                'return the subroutine value as the file path & name selected
                Select_File = varFile
            Next
        End If
    End With
End Function
2
MarkII

Je suis d'accord que John M a la meilleure réponse à la question de OP. Bien que cela ne soit pas dit explicitement, l'objectif apparent est d'obtenir un nom de fichier sélectionné, tandis que d'autres réponses renvoient soit des décomptes, soit des listes. J'ajouterais cependant que le msofiledialogfilepicker pourrait être une meilleure option dans ce cas. c'est à dire:

Dim f As object
Set f = Application.FileDialog(msoFileDialogFilePicker)
dim varfile as variant 
f.show
with f
    .allowmultiselect = false
     for each varfile in .selecteditems
        msgbox varfile
     next varfile
end with

Remarque: la valeur de varfile restera la même car la sélection multiple est fausse (un seul élément est sélectionné). J'ai utilisé sa valeur en dehors de la boucle avec un succès égal. Cependant, il est probablement préférable de le faire comme l'a fait John M. En outre, le sélecteur de dossier peut être utilisé pour obtenir un dossier sélectionné. Je préfère toujours la liaison tardive, mais je pense que l'objet est natif de la bibliothèque d'accès par défaut, il peut donc ne pas être nécessaire ici

0
akw