Recentemente tive de criar uma ferramenta em Access onde o usuário deveria indicar o caminho de uma planilha para importar no banco de dados. O caminho do arquivo deveria ser flexível e fácil de alterar, e a melhor maneira de fazê-lo pareceu ser então com as já conhecidas telinhas de seleção de arquivos do Windows.
Após alguma leitura na internet, encontrei a codificação necessária. É bastante simples, mas muito útil no desenvolvimento de soluções e basicamente não há alterações para uso em ambas as ferramentas (Excel/Access). Segue o código comentado:
Function AbrirArquivo()
Dim Caminho As String 'Caminho do arquivo
Dim fDialog As Office.FileDialog
'Configura caixa de seleção do arquivo
Set fDialog = Application.FileDialog(msoFileDialogFilePicker)
With fDialog
.AllowMultiSelect = False 'Habilita ou desabilita a seleção de múltiplos arquivos
.Title = "Selecionar arquivo..."
'.InitialFileName = 'Caminho inicial para seleção, não utilizado no exemplo
'Configura filtros da caixa de seleção
.Filters.Clear 'Limpa os filtros
.Filters.Add "Arquivos Excel - .xlsb", "*.xlsb" 'Adiciona filtro para arquivos .xlsb
.Filters.Add "Arquivos Excel - .xls", "*.xls" 'Adiciona filtro para arquivos .xlsb
If .Show = True Then 'Se o parâmetro .Show for igual à True significa
'que algum arquivo foi selecionado
Caminho = .SelectedItems.Item(1) 'Local + arquivo selecionados são passados para
'a variável chamada de "Caminho"
Else
MsgBox "Você clicou em cancelar"
End If
End With
AbrirArquivo = Caminho 'Atribui o caminho do arquivo ao retorno da função
End Function
Caso chamada dentro de uma célula do Excel, a função acima irá abrir a janela para seleção do arquivo e retornar o caminho indicado acrescido do nome do arquivo! Por exemplo, ao selecionar o arquivo "Exemplo.xlsb" na raiz do disco rígido "C:\", a função irá retornar a string "C:\Exemplo.xlsb". Ela também pode ser chamada diretamente de outra subrotina.
É isso, pessoal... Qualquer dúvida, sugestões ou consultoria, por favor escrevam para guiamacroexcel@gmail.com!
Obrigado e até a próxima!