2011-05-11 20 views
7

De una pregunta anterior sé cómo hacer para que el usuario haga clic en el botón "navegador" y navegue a un archivo específico que tal vez quiera abrir.VBA Excel Getting File Path (finaliza con la carpeta)

Código:

Private Sub CommandButton2_Click() 
    Dim vaFiles As Variant 

    vaFiles = Application.GetOpenFilename() 

    ActiveSheet.Range("B9") = vaFiles 
End Sub 

Quiero crear un segundo botón de navegación que le permitirá al usuario navegar a una carpeta. Esta carpeta va a ser donde guardan el archivo .pdf que crea mi programa. Aquí está el problema: el GetOpenFilename requiere que el usuario haga clic en un archivo. Si no hay ningún archivo en la carpeta, no hay nada que el usuario pueda hacer.

espero que haya sido lo suficientemente claro ...

Gracias

Respuesta

18

utilizar el objeto Application.FileDialog

Sub SelectFolder() 
    Dim diaFolder As FileDialog 

    ' Open the file dialog 
    Set diaFolder = Application.FileDialog(msoFileDialogFolderPicker) 
    diaFolder.AllowMultiSelect = False 
    diaFolder.Show 

    MsgBox diaFolder.SelectedItems(1) 

    Set diaFolder = Nothing 
End Sub 
1

Uso Application.GetSaveAsFilename() de la misma manera que utilizó Application.GetOpenFilename()

+0

Si la carpeta está vacía y hago clic en el botón "Guardar", no ocurre nada. Esperaba que al hacer clic en el botón "Guardar" o "Abrir" saldría del navegador y luego, en este caso, guardaría la ruta del archivo a la celda especificada. Gracias por responder –

+0

Espero que mi explicación de lo que sucede sea clara. Si elijo una carpeta vacía como la ruta de guardado objetivo y luego presiono "cancelar", el texto en mi celda especificada se convierte en "FALSO". Cuando ejecuto el programa, funciona, pero no le dice a qué carpeta se está guardando el archivo pdf (aunque lo eligieron) y cuando se guarda, aparece la palabra "FALSE" al principio, de modo que "FALSEOutput_report" .pdf "en lugar de" Output_report.pdf ". ¿Alguien puede explicar por qué funciona así? Gracias –

+0

@Jesse La función devuelve falso si hace clic en cancelar y en el nombre del archivo de lo contrario. No estoy seguro de por qué concatena FALSO al inicio del nombre de archivo en ciertos casos. Parte de la confusión podría ser que esta función solo está obteniendo un nombre de archivo para usted, no está haciendo ningún ahorro para usted. Esa parte depende de tu programa. – jonsca

2

En el menú Herramientas del Editor de VBA, haga clic en referencias ... de desplazamiento hasta "Microsoft Shell Controls And Automation" y elígelo.

Sub FolderSelection() 
    Dim MyPath As String 
    MyPath = SelectFolder("Select Folder", "") 
    If Len(MyPath) Then 
     MsgBox MyPath 
    Else 
     MsgBox "Cancel was pressed" 
    End If 
End Sub 

'Both arguements are optional. The first is the dialog caption and 
'the second is is to specify the top-most visible folder in the 
'hierarchy. The default is "My Computer." 

Function SelectFolder(Optional Title As String, Optional TopFolder _ 
         As String) As String 
    Dim objShell As New Shell32.Shell 
    Dim objFolder As Shell32.Folder 

'If you use 16384 instead of 1 on the next line, 
'files are also displayed 
    Set objFolder = objShell.BrowseForFolder _ 
          (0, Title, 1, TopFolder) 
    If Not objFolder Is Nothing Then 
     SelectFolder = objFolder.Items.Item.Path 
    End If 
End Function 

Source Link.

3

han añadido ManejadorError a esto en caso de que el usuario pulsa el botón cancelar en lugar de seleccionar una carpeta. Entonces, en lugar de recibir un mensaje de error horrible, aparece un mensaje que indica que se debe seleccionar una carpeta y luego termina la rutina. El código siguiente también almacena la ruta de la carpeta en un nombre de rango (que solo está vinculado a la celda A1 en una hoja).

Sub SelectFolder() 

Dim diaFolder As FileDialog 

'Open the file dialog 
On Error GoTo ErrorHandler 
Set diaFolder = Application.FileDialog(msoFileDialogFolderPicker) 
diaFolder.AllowMultiSelect = False 
diaFolder.Title = "Select a folder then hit OK" 
diaFolder.Show 
Range("IC_Files_Path").Value = diaFolder.SelectedItems(1) 
Set diaFolder = Nothing 
Exit Sub 

ErrorHandler: 
Msg = "No folder selected, you must select a folder for program to run" 
Style = vbError 
Title = "Need to Select Folder" 
Response = MsgBox(Msg, Style, Title) 

End Sub 
0

Esto podría ayudarle a cabo:

Sub SelectFolder() 
    Dim diaFolder As FileDialog 
    Dim Fname As String 

    Set diaFolder = Application.FileDialog(msoFileDialogFolderPicker) 
    diaFolder.AllowMultiSelect = False 
    diaFolder.Show 

    Fname = diaFolder.SelectedItems(1) 

    ActiveSheet.Range("B9") = Fname 

End Sub 
+0

Por favor, marque la respuesta correctamente. – shruti1810

1

Si quiere buscar una carpeta por defecto: Por ejemplo, "D: \ Default_Folder" simplemente inicializar el atributo "InitialFileName"

Dim diaFolder As FileDialog 

' Open the file dialog 
Set diaFolder = Application.FileDialog(msoFileDialogFolderPicker) 
diaFolder.AllowMultiSelect = False 
diaFolder.InitialFileName = "D:\Default_Folder" 
diaFolder.Show