2009-07-07 26 views

risposta

38

miei commenti sulla risposta di Renaud Bompuis incasinato.

In realtà, è possibile utilizzare l'associazione tardiva, e non è necessario il riferimento alla libreria di oggetti 11,0.

Il seguente codice funzionerà senza alcun riferimento:

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

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

Nota che le opere di cui sopra e nel runtime anche.

+2

+1 Speravo sempre che fosse possibile, la chiave per fare il lavoro di rilegatura tardiva sta passando l'opzione numerica piuttosto che msoOpenFileDialog ecc. Così semplice ma una grande risposta:) –

+0

Puoi, ma non dovrebbe. Con l'associazione tardiva si sta codificando al buio .. Quando si aggiunge il riferimento e si dichiara correttamente e si imposta l'oggetto filedialog, l'IDE mostra suggerimenti, mentre con l'associazione tardiva non lo farà. – Chris

+1

@Chris OTOH, utilizzando l'associazione anticipata significa che gli utenti devono avere anche i riferimenti aggiunti. Ciò significa che l'associazione tardiva è necessaria per alcune applicazioni. –

17

In Access 2007 non vi resta che utilizzare Application.FileDialog.

Ecco l'esempio dalla documentazione di accesso:

' 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 

Quando il campione dice, basta assicurarsi di avere un riferimento a Access 12.0 Object Library Microsoft (sotto il VBE IDE> Strumenti> Riferimenti menu).

+0

In realtà, è possibile utilizzare l'associazione tardiva e il riferimento alla libreria di oggetti 11.0 non è richiesto. Il seguente codice funzionerà senza alcun riferimento: Dim f As Object Set f = f.AllowMultiSelect Application.FileDialog (3) = True f.Show MsgBox "il file scelto =" & f.SelectedItems Count Nota che le opere di cui sopra e ho anche il runtime. Albert D.Kallal Edmonton, Alberta Canada [email protected] –

+0

L'esempio è copiato da qui: http://support.microsoft.com/en-us/kb/824272 – Mike

2

aggiunta a quanto Albert ha già detto:

Questo codice (un mashup di vari campioni) offre la possibilità di avere una finestra di dialogo Salva con nome

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 
+1

Questo è solo il codice per la stessa risposta che tutti hanno dato. È più prolisso e mostra più opzioni, ma è solo una ripetizione delle risposte esistenti. –

+0

@ David-W-Fenton No, non lo è. Restituisce un nome file e ti permette di impostare un filtro, che nessuna delle altre risposte fa. È privo di dipendenze di Office e può essere incollato direttamente in qualsiasi modulo o modulo, quindi è plug and play. Questa è la risposta migliore, e come per le altre risposte la tua critica è ancora più adatta per le persone che copiano/incollano dalla documentazione. –

0

sono d'accordo John M ha la migliore risposta alle OP di domanda. Il pensiero non dichiarato esplicitamente, lo scopo apparente è quello di ottenere un nome di file selezionato, mentre altre risposte restituiscono conteggi o elenchi. Vorrei aggiungere, tuttavia, che msofiledialogfilepicker potrebbe essere una soluzione migliore in questo caso. Per esempio:

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 

Nota: il valore di varfile rimarrà lo stesso, poiché multiselect è falso (solo elemento mai selezionato). Ho usato il suo valore al di fuori del circuito con uguale successo. Probabilmente è una pratica migliore farlo come ha fatto John M., comunque. Inoltre, il selettore di cartelle può essere utilizzato per ottenere una cartella selezionata. Preferisco sempre l'associazione in ritardo, ma penso che l'oggetto sia nativo della libreria di accesso predefinita, quindi potrebbe non essere necessario qui

1

Ho una soluzione simile a quella sopra e funziona per l'apertura, il salvataggio, la selezione dei file. Lo incollo nel proprio modulo e lo utilizzo in tutti i DB di accesso creati. Come afferma il codice, richiede la libreria oggetti di Microsoft Office 14.0. Solo un'altra opzione suppongo:

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 
Problemi correlati