titulo.jpg

Home

Principal

Assinar

 

Dicas

Excel

Word

Outlook

Office/VBA

Suplementos

Vídeos

Outros

Busque neste site:

Loading
 

Usar Janela para Obter Caminho de Arquivos ou Pastas

Última atualização: 31/10/2011

Introdução

Caminho de um Arquivo

   -Caminho de Múltiplos Arquivos

Caminho de uma Pasta

Referências

 

Introdução

Está página mostra como obter uma interface amigável para um usuário selecionar um arquivo ou pasta através do VBA.

 

Caminho de um Arquivo

Com o código apresentado, a seguinte tela será mostrada para o usuário escolher um arquivo:

Veja o exemplo:

Private Sub GetArquivo()

    Dim sArquivo
    Dim sEspecificação As String
    Dim sTítulo As String
    
    sEspecificação = "Arquivos de Excel (*.xls*),*.xls*"
    sTítulo = "Selecione um arquivo do Excel:"
    
    sArquivo = CStr(Application.GetOpenFilename(sEspecificação, , sTítulo, , False))
    
    If sArquivo <> CStr(False) Then
        Debug.Print sArquivo
    Else
        'Nenhum arquivo foi selecionado
    End If

End Sub

A função utilizada foi o GetOpenFilename. O parâmetro sTítulo é o título que aparece na janela. O parâmetro sEspecificação se traduz pela extensão dos arquivos que serão visualizados. O último parâmetro, False, especifica que apenas um arquivo pode ser selecionado. Em outras palavras, não se pode fazer uma multiseleção de arquivos. Se quiser selecionar mais de um arquivo, veja a seção a seguir.

Observe que o método retorna False para nenhum arquivo selecionado (clique em Cancelar) e o caminho completo do arquivo, para um arquivo selecionado.

É utilizado CStr para converter o resultado da função numa String e determinar se algum arquivo foi selecionado ou não.

 

Caminho de Múltiplos Arquivos

Veja como fica uma janela que permite multiseleção:

O código utilizado foi:

Private Sub GetArquivos()
    
    Dim sArquivos
    Dim sEspecificação As String
    Dim l As Long
    Dim sTítulo As String
    
    sEspecificação = "Arquivos de Excel (*.xls*),*.xls*"
    sTítulo = "Selecione um arquivo do Excel:"
    
    sArquivos = Application.GetOpenFilename(sEspecificação, , sTítulo, , True)
    
    If TypeName(sArquivos) = "Variant()" Then
        For l = LBound(sArquivos) To UBound(sArquivos)
            Debug.Print sArquivos(l)
        Next l
    Else
        'Nenhum arquivo foi selecionado
    End If

End Sub

Observe o True como parâmetro na função GetOpenFilename: significa que uma multiseleção pode ser feita.

O tipo se sArquivos varia: se nada for selecionado (Cancelar), é retornado uma Boolean (de valor False). Caso contrário, é retornado um vetor Variant de tamanho 1 até o número de arquivos selecionados, explicando o teste condicional do tipo TypeName(sArquivos). Observe que há também o código para iterar em cada um dos itens selecionados.

 

Caminho de uma Pasta

Se você quiser obter o caminho de uma Pasta ao invés de um arquivo, deverá utilizar uma chamada API.

Veja a janela que reproduz o exemplo:

O código utilizado é:

'Declarações API
#If VBA7 Then
    Private Type BROWSEINFO
        hOwner As LongPtr
        pidlRoot As LongPtr
        pszDisplayName As String
        lpszTitle As String
        ulFlags As Long
        lpfn As LongPtr
        lParam As LongPtr
        iImage As Long
    End Type
                        
    Private Declare PtrSafe Function SHBrowseForFolder Lib "shell32.dll" Alias "SHBrowseForFolderA" _
        (lpBrowseInfo As BROWSEINFO) As LongPtr
    Private Declare PtrSafe Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" _
        (ByVal pidl As LongPtr, ByVal pszPath As String) As Boolean
#Else
    Private Type BROWSEINFO
        hOwner As Long
        pidlRoot As Long
        pszDisplayName As String
        lpszTitle As String
        ulFlags As Long
        lpfn As Long
        lParam As Long
        iImage As Long
    End Type
                        
    Private Declare Function SHBrowseForFolder Lib "shell32.dll" Alias "SHBrowseForFolderA" _
        (lpBrowseInfo As BROWSEINFO) As Long
    Declare Function SHBrowseForFolder Lib "shell32.dll" _
        Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long
#End If

Private Const BIF_RETURNONLYFSDIRS = &H1

Sub GetPasta()
    
    Dim bnfo As BROWSEINFO
    Dim sCaminho As String
    Dim lÍndice As Long
    Dim vJanela As Variant
    Dim iPosição As Integer
    Dim sPasta As String
 
    'vJanela foi declarada como Variant porque ela é do tipo
    'Long se o Office for 2007, e LongPtr se o Office for 2010.
 
    'A pasta raiz é o Desktop:
    bnfo.pidlRoot = 0&

    'Título
    bnfo.lpszTitle = "Selecione uma Pasta:"
    
    'Tipo de dado retornado:
    bnfo.ulFlags = &H1

    'Mostra a janela:
    vJanela = SHBrowseForFolder(bnfo)
    
    'Analisa e trata o resultado:
    sCaminho = Space(512)
    lÍndice = SHGetPathFromIDList(ByVal vJanela, ByVal sCaminho)
    If lÍndice Then
        iPosição = InStr(sCaminho, Chr(0))
        sPasta = Left(sCaminho, iPosição - 1)
        Debug.Print sPasta
    Else
        'Nenhuma Pasta foi selecionada
    End If

End Sub

 

Referências

John Walkenbach: http://www.j-walk.com/ss/excel/tips/tip29.htm

Para baixar um arquivo de exemplo pronto, clique aqui.

 

---

Site de Felipe Costa Gualberto.

Belo Horizonte, Brasil, 2009-2013.

felipe@ambienteoffice.com.br