GetOpenFilename no VBA: Como Criar uma Janela para Escolher um Arquivo no Excel

Você já escreveu uma macro que abre um arquivo Excel com o caminho fixo, digitado diretamente no código, algo como Workbooks.Open "C:\pasta\arquivo.xlsx". Funciona bem até o dia em que o arquivo muda de nome, é movido de pasta, ou até o dia em que outra pessoa da equipe, com uma estrutura de pastas diferente no computador, tenta rodar a mesma macro e recebe um erro.

Deixar o caminho do arquivo fixo no código torna a macro frágil e pouco reutilizável — qualquer mudança na localização do arquivo obriga a abrir o editor do VBA e reescrever o caminho manualmente, algo que a maioria dos usuários finais não sabe fazer sozinho.

Neste artigo iremos mostrar como usar a função GetOpenFilename do VBA para abrir a janela padrão de seleção de arquivos do Windows dentro da sua macro, permitindo que o próprio usuário escolha visualmente qual arquivo abrir, sem precisar digitar nem saber o caminho completo.

Youtube

Assista ao vídeo abaixo, caso prefira aprender a como usar a função GetOpenFilename no VBA assistindo a um vídeo.

DOMINE EXCEL COMIGO

QUERO APRENDER EXCEL

Não se esqueça de se INSCREVER no nosso canal.

O que a GetOpenFilename realmente faz

A função Application.GetOpenFilename abre a janela nativa do Windows para escolha de arquivos — a mesma janela que aparece quando você clica em Arquivo > Abrir dentro do próprio Excel. A diferença fundamental é que essa função não abre o arquivo selecionado sozinha: ela apenas retorna, como texto, o caminho completo do arquivo escolhido pelo usuário. Cabe ao seu código, depois, usar esse caminho retornado para efetivamente abrir o arquivo com Workbooks.Open.

O uso mais básico da função é assim:

Sub SelecionarArquivo()

Dim caminhoArquivo As Variant
caminhoArquivo = Application.GetOpenFilename()

If caminhoArquivo <> False Then
    MsgBox "Arquivo escolhido: " & caminhoArquivo
End If

End Sub

Note que a variável que recebe o resultado precisa ser do tipo Variant, e não String. Isso porque, se o usuário clicar em “Cancelar” na janela em vez de escolher um arquivo, a função retorna o valor lógico False, e uma variável String não consegue armazenar False — apenas texto. Por isso a verificação If caminhoArquivo <> False Then é essencial em todo código que usa essa função: sem ela, a macro tenta usar um caminho que não existe e gera erro.

Parâmetros da GetOpenFilename

A função aceita alguns parâmetros opcionais que controlam o comportamento e a aparência da janela de seleção:

Tabela com os parâmetros FileFilter, FilterIndex, Title e MultiSelect da função GetOpenFilename e o que cada um faz

O parâmetro FileFilter é o mais usado na prática: ele define quais tipos de arquivo aparecem na lista suspensa de filtro da janela, escondendo arquivos de outras extensões e evitando que o usuário selecione, por engano, um arquivo incompatível com o que a macro espera processar. A sintaxe do FileFilter combina uma descrição textual com a extensão real, separadas por vírgula:

Sub SelecionarSoArquivosExcel()

Dim caminhoArquivo As Variant

caminhoArquivo = Application.GetOpenFilename( _
    FileFilter:="Arquivos do Excel (*.xlsx; *.xls), *.xlsx; *.xls", _
    Title:="Selecione a planilha para importar")

If caminhoArquivo <> False Then
    Workbooks.Open caminhoArquivo
End If

End Sub

Nesse exemplo, a janela mostra apenas arquivos com extensão .xlsx ou .xls na lista, e o título da janela é personalizado para “Selecione a planilha para importar”, orientando melhor o usuário sobre o que ele deve escolher naquele momento.

Permitindo selecionar mais de um arquivo (MultiSelect)

Por padrão, a GetOpenFilename permite escolher apenas um arquivo por vez. Para permitir que o usuário selecione vários arquivos de uma só vez (segurando Ctrl ou Shift na janela do Windows), use o parâmetro MultiSelect:=True. Quando esse parâmetro está ativo, o retorno da função deixa de ser um único texto e passa a ser um array, com um caminho de arquivo em cada posição:

Sub SelecionarVariosArquivos()

Dim arquivosSelecionados As Variant
Dim i As Integer

arquivosSelecionados = Application.GetOpenFilename( _
    FileFilter:="Arquivos do Excel (*.xlsx), *.xlsx", _
    MultiSelect:=True)

If IsArray(arquivosSelecionados) Then
    For i = LBound(arquivosSelecionados) To UBound(arquivosSelecionados)
        Workbooks.Open arquivosSelecionados(i)
    Next i
Else
    MsgBox "Nenhum arquivo foi selecionado."
End If

End Sub

A verificação IsArray(arquivosSelecionados) substitui a comparação com False usada no exemplo de seleção única, porque quando MultiSelect:=True e o usuário cancela a janela, o retorno também é False, mas quando ele seleciona ao menos um arquivo, o retorno é sempre um array — mesmo que seja um array com um único item.

Guardando o caminho em uma variável para reutilizar depois

Um padrão comum é usar a GetOpenFilename apenas para capturar o caminho, guardando-o em uma variável String separada, para poder reutilizar esse caminho em outras partes da macro sem precisar abrir a janela de seleção de novo:

Sub CapturarCaminhoEReutilizar()

Dim caminho As Variant
Dim caminhoTexto As String

caminho = Application.GetOpenFilename(FileFilter:="Arquivos do Excel (*.xlsx), *.xlsx")

If caminho = False Then
    MsgBox "Nenhum arquivo selecionado. A macro será encerrada."
    Exit Sub
End If

caminhoTexto = CStr(caminho)

'a partir daqui, "caminhoTexto" pode ser usado quantas vezes for necessário
Workbooks.Open caminhoTexto

End Sub

Esse padrão de sair da macro com Exit Sub assim que se confirma que o usuário cancelou a seleção evita que o restante do código tente processar um caminho inexistente, prevenindo erros mais à frente na execução.

✅ Sempre use uma variável Variant (nunca String) para receber o retorno direto da GetOpenFilename, por causa do valor False em caso de cancelamento.

❌ Não use a GetOpenFilename esperando que ela abra o arquivo sozinha — ela só retorna o caminho, quem abre é o Workbooks.Open logo depois.

Disponibilidade em outras versões

A função Application.GetOpenFilename está disponível em todas as versões do Excel para Windows com suporte a VBA: 2010, 2013, 2016, 2019 e 365. No Excel para Mac, essa função tem um comportamento diferente e mais limitado, já que a janela de seleção de arquivos do macOS funciona de forma distinta da do Windows — em versões recentes do Excel para Mac, ela geralmente funciona, mas vale testar antes de disponibilizar a macro para usuários de Mac. O Excel Online e o Google Sheets não suportam VBA, então esse recurso só existe na versão desktop do Excel para Windows.

Perguntas frequentes

Qual é a diferença entre GetOpenFilename e Workbooks.Open?

A GetOpenFilename apenas abre a janela de seleção de arquivos e retorna o caminho escolhido como texto, sem abrir o arquivo. O Workbooks.Open é quem efetivamente abre o arquivo no Excel, usando o caminho retornado pela GetOpenFilename como parâmetro.

Por que preciso usar uma variável Variant em vez de String para guardar o resultado?

Porque quando o usuário clica em Cancelar na janela de seleção, a função retorna o valor lógico False, que uma variável do tipo String não consegue armazenar. A variável Variant aceita tanto texto quanto o valor False, permitindo verificar corretamente se houve cancelamento.

Como permitir que o usuário selecione vários arquivos de uma vez?

Use o parâmetro MultiSelect:=True dentro da função. Quando ativado, o retorno passa a ser um array com o caminho de cada arquivo selecionado, que pode ser percorrido com um loop For para abrir todos os arquivos escolhidos.

Compartilhe ou Comente

Se você curtiu esse artigo aonde mostramos como usar a função GetOpenFilename no VBA para escolher um arquivo no Excel, compartilhe com as suas redes sociais e não se esqueça de deixar um comentário aqui embaixo caso você tenha ficado com alguma dúvida.

Sua macro ainda tem algum caminho de arquivo fixo digitado no código? Já teve algum problema quando um arquivo mudou de lugar e a macro parou de funcionar? Conta para nós nos comentários!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *