Usando o FileSystemObject no Excel VBA

Written by

Mel Jenkins

Reviewed by

Steve Rynearson

Translated by

Daniel Caramello

Last updated on September 8, 2023

Usando o FileSystemObject (FSO) no Excel VBA

O FileSystemObject (FSO) dá acesso a uma ampla gama de funções para acessar o sistema de arquivos do computador. Com esse objeto, é possível acessar facilmente arquivos, pastas e unidades, além de ler e gravar em arquivos.

Muitas das funções do FSO poderiam ser escritas por você no VBA tradicional, mas exigiriam mais codificação e seriam mais difíceis de serem mantidas e compreendidas por um novo desenvolvedor. O FSO é uma API (Interface de Programação de Aplicativos) testada e comprovada e é mais confiável do que o seu próprio código. É fácil de usar e está pronto e disponível.

O FSO funciona de acordo com os padrões internacionais e as configurações que você tem em seu computador. Se estiver distribuindo seu aplicativo Excel globalmente, o uso do FSO cuidará de todas as diferenças de configurações entre países, o que seu próprio código teria dificuldade em fazer.

O FSO permitirá que você faça quase tudo no código VBA que poderia fazer no Explorador de Arquivos do Windows. Ele lhe dá acesso completo ao sistema de arquivos do Windows.

Criação de um FileSystemObject

O FileSytemObject não faz parte do Excel VBA. Você pode usar o FSO criando um objeto (vinculação tardia) no VBA:

Sub CriarFSO()
Set MeuFSO = CreateObject("Scripting.FileSystemObject")
End Sub

Como alternativa, você pode adicionar uma referência à biblioteca FSO no VBA. Isso é chamado de vinculação antecipada e é mais rápido do que a vinculação tardia, pois o objeto não precisa ser criado quando o código é executado.

Para adicionar uma referência, é necessário pressionar Alt-F11 para entrar no Editor do Visual Basic (VBE) e, em seguida, usar “Ferramentas|Referências” no menu do VBE. Isso exibirá uma janela pop-up para que você selecione a referência relevante (veja abaixo).

Role a lista de referências disponíveis até ver “Microsoft Scripting Runtime”. Marque a caixa e clique em OK, e a biblioteca agora faz parte do seu aplicativo.

O local do arquivo da biblioteca DLL é C:\Windows\SysWOW64\scrrun.dll.

Se você estiver distribuindo o aplicativo para outros colegas ou locais, é essencial que eles tenham esse arquivo no local correto no computador, caso contrário, o código apresentará erros.

Vale a pena colocar uma armadilha de erro no evento ‘WorkbookOpen’ usando o comando Dir para verificar se o arquivo existe. Se ele não existir, emita uma mensagem de aviso e feche o arquivo do Excel.

Depois que a referência tiver sido adicionada, você poderá usar o código a seguir para criar o FSO:

Sub TesteFSO()
Dim MeuFSO As New FileSystemObject
End Sub

Todos os exemplos deste artigo usarão essa metodologia para criar o FSO.

referencia scripting runtime

O FSO tem muitos métodos e propriedades disponíveis. Eles estão divididos aqui em seções de acordo com o que podem fazer.

Uso dos Métodos “Exists” (Existe)

Você pode usar um método de FSO para verificar se uma unidade, uma pasta ou um arquivo existe. Esses métodos são fáceis de usar e exigem apenas um parâmetro.

Sub VerificarExistencia()
Dim MeuFSO As New FileSystemObject
MsgBox MeuFSO.DriveExists("C:")
MsgBox MeuFSO.FolderExists("C:\temp\")
MsgBox MeuFSO.FileExists("C:\temp\arquivoteste.txt")
End Sub

Todas essas instruções retornarão “True”, supondo que seu computador tenha uma unidade C:, uma pasta chamada “Temp” e um arquivo na pasta Temp chamado “arquivoteste.txt”.

As cadeias de texto nos parâmetros não diferenciam maiúsculas de minúsculas. Não é possível usar curingas em nenhum desses métodos.

Também não é possível usar URLs (Uniform Resource Locators) para descrever um local de pasta ou arquivo. O FSO funciona exclusivamente no sistema operacional Windows e no sistema de arquivos nele contido. Para um local de servidor externo, primeiro você precisa mapear uma unidade para isso e, em seguida, usar o próprio caminho da unidade.

Uso dos Métodos “Get” (Obter)

O FSO tem vários métodos para obter informações sobre o arquivo e o caminho, seja dividindo o caminho e o arquivo, seja obtendo informações sobre o arquivo ou a pasta, como a data de criação ou de modificação.

GetAbsolutePathname

Fornecerá um caminho completo a partir da raiz da unidade especificada.

A sintaxe é:

GetAbsolutePathName(pathpec)

Sub TesteAbsolutePath()
Dim MeuFSO As New FileSystemObject, Pth As String
Pth = "c:..."
MsgBox MeuFSO.GetAbsolutePathName(Pth)
End Sub

Isso retornará uma cadeia de caracteres ‘C:\Users\Richard\Documents’. Isso ocorre porque o caminho foi especificado como C: seguido de três pontos. Cada ponto significa um próximo nível na estrutura de pastas.

GetBaseName

Retorna o nome de um arquivo ou pasta especificado.

A sintaxe é a seguinte:

GetBaseName (caminho)

Sub TesteBaseName()
Dim MeuFSO As New FileSystemObject, Pth As String
Pth = "C:\temp\arquivoteste.txt"
MsgBox MeuFSO.GetBaseName(Pth)
End Sub

Esse código retornará “arquivoteste”. O método retorna a última seção no nome do caminho. Se for um arquivo, ele não retornará o sufixo do arquivo.

Se o caminho não puder ser encontrado, será retornada uma string em branco.

GetDrive

Permite usar o código para acessar as informações da unidade, com base na letra da unidade especificada.

A sintaxe é a seguinte

GetDrive(drivespec)

Sub DriveInfo()
Dim MeuFSO As New FileSystemObject, Pth As String, Dr As Drive
Pth = "C:"
Set Dr = MeuFSO.GetDrive(Pth)
MsgBox Dr.FreeSpace
End Sub

Esse método retorna um objeto de unidade com base na unidade especificada. Você pode usar esse objeto para acessar informações sobre a unidade, como o espaço livre disponível.

GetDriveName

Esse método separa o nome da unidade de uma cadeia de caracteres de caminho/nome de arquivo.

A sintaxe é

GetDriveName(path)

Sub TesteDriveName()
Dim MeuFSO As New FileSystemObject, Pth As String
Pth = "C:\temp\arquivoteste.txt"
MsgBox MeuFSO.GetDriveName(Pth)
End Sub

Isso retornará ‘C:’

GetExtensionName

Isso retornará o sufixo do arquivo no caminho especificado.

A sintaxe é:

GetExtensionName(path)

Sub TesteExtensionName()
Dim MeuFSO As New FileSystemObject, Pth As String
Pth = "C:\temp\arquivoteste.txt"
MsgBox MeuFSO.GetExtensionName(Pth)
End Sub

Isso retornará ‘txt’.

Se nenhum arquivo for especificado, será retornada uma cadeia de caracteres vazia.

GetFile

Esse método retorna um objeto de arquivo, que contém várias informações sobre o próprio arquivo.

A sintaxe é:

GetFile(filespec)

Sub InfoArquivo()
Dim MeuFSO As New FileSystemObject, Pth As String, Fn As File
Pth = "C:\temp\arquivoteste.txt"
Set Fn = MeuFSO.GetFile(Pth)
MsgBox Fn.DateCreated
End Sub

Isso retornará a data e a hora em que o arquivo especificado foi criado. Se nenhum arquivo for especificado ou se o arquivo não existir, você receberá um erro de “arquivo não encontrado”.

Sub NomeArquivo()
Dim MeuFSO As New FileSystemObject, Pth As String
Pth = "C:\temp\arquivoteste.txt"
MsgBox MeuFSO.GetFileName(Pth)
End Sub

Isso retornará ‘aquivoteste.txt’.

GetFolder

Esse comando cria um objeto de pasta para a pasta base no caminho especificado. O caminho deve conter apenas nomes de pastas. Nenhum nome de arquivo deve ser incluído, caso contrário, ocorrerá um erro.

A sintaxe é:

GetFolder(folderspec)

Sub InfoPasta()
Dim MeuFSO As New FileSystemObject, Pth As String, Fo As Folder
Pth = "C:\temp"
Set Fo = MeuFSO.GetFolder(Pth)
MsgBox Fo.DateCreated
End Sub

O objeto de pasta contém várias informações que podem ser acessadas. Nesse caso, ele retorna a data em que a pasta foi criada.

Você também pode usar esse método para recuperar todos os nomes de arquivos em uma determinada pasta.

Sub NomesArquivos()
Dim MeuFSO As New FileSystemObject, Pth As String, Fo As Folder, Fn As File
Pth = "C:\temp"
Set Fo = MeuFSO.GetFolder(Pth)
For Each Fn In Fo.Files
    MsgBox Fn.Name
Next Fn
End Sub

Esse código percorrerá a pasta ‘Temp’ e exibirá cada nome de arquivo encontrado.

 

GetParentFolderName

Esse método retornará o nome da pasta no próximo nível acima na hierarquia de pastas.

A sintaxe é:

GetParentFolderName(path)

Sub NomePasta()
Dim MeuFSO As New FileSystemObject, Pth As String, Fo As Folder
Pth = "C:\users\richard"
MsgBox MeuFSO.GetParentFolderName(Pth)
End Sub

Isso retornará “Users”, pois esse é o “pai” da pasta “richard”.

Uso dos métodos “Create” (Criar)

Com o FSO, você pode criar uma nova pasta e um novo caminho e criar um arquivo de texto.

CreateFolder

Você pode especificar um novo nome de caminho de pasta a ser criado. O perigo disso é que, se a pasta já existir, ocorrerá um erro. Você pode usar o método ‘FolderExists’ para garantir que isso não ocorra.

A sintaxe é:

CreateFolder (foldername)

Sub CriarPastaNova()
Dim MeuFSO As New FileSystemObject, Pth As String
Pth = "C:\temp\MinhaPasta"
If MeuFSO.FolderExists(Pth) = False Then
    MeuFSO.CreateFolder (Pth)
End If
End Sub

Esse código criará uma nova pasta chamada “MinhaPasta” no caminho existente “C:\temp”.

CreateTextFile

Esse método permite que você crie um arquivo de texto simples e escreva diretamente nele.

A sintaxe é

CreateTextFile (filename, [ overwrite, [ unicode ]])

Sub CriarArquivoTexto()
Dim MeuFSO As New FileSystemObject, Pth As String
Pth = "C:\temp\MeuArquivo.txt"
Set Fn = MeuFSO.CreateTextFile(Pth,True)
Fn.Write "Adicionar o meu próprio texto aqui." & vbLf & "Esta é a segunda linha"
Fn.Close
End Sub

Esse código cria um arquivo de texto chamado ‘MeuArquivo.txt’ na pasta ‘Temp’ da unidade ‘C:’ e, em seguida, grava duas linhas de texto nele.

Observe que um caractere de avanço de linha é concatenado na string que está sendo gravada.

Se o caminho no qual você está gravando não existir, ocorrerá um erro. Você pode usar o método “FolderExists” para verificar isso antes de criar o arquivo.

Há um parâmetro opcional para sobrescrever o arquivo existente, se necessário – pode ser True ou False. O padrão é True.

Uso dos métodos “Copy” (Copiar)

Você pode usar esses métodos para copiar um arquivo ou uma pasta para outro local.

CopyFile

Esse método copiará um arquivo de um local de pasta para outro. Observe que a cópia falhará se o local de destino tiver o atributo somente leitura definido.

A sintaxe é:

CopyFile source, destination, [ overwrite ]

Sub CopiarArquivo()
Dim MeuFSO As New FileSystemObject
MeuFSO.CopyFile "C:\temp\*.txt", "C:\temp\MinhaPasta", True
End Sub

Esse código fará uma cópia de todos os arquivos de texto (txt) em “C:\temp” para “C:\temp\MinhaPasta”, sobrescrevendo o arquivo quando necessário. A configuração padrão para Sobrescrever é Verdadeiro.

Você pode usar um curinga de asterisco (*) para os nomes de arquivos, mas não pode usar um curinga de ponto de interrogação (?) para representar caracteres únicos.

CopyFolder

Você pode usar esse método para copiar uma pasta inteira de um local para outro.

A sintaxe é a seguinte:

CopyFolder source, destination, [ overwrite ]

Sub CopiarPasta()
Dim MeuFSO As New FileSystemObject
MeuFSO.CopyFolder "C:\temp\*", "C:\users\richard\"
End Sub

Esse código copia todas as pastas e arquivos abaixo de “C:\temp” para “C:\users\richard”. A nova pasta criada será “C:\users\richard\MinhaPasta”, pois “C:\temp” tinha uma pasta dentro dela chamada “MinhaPasta”.

Há quatro resultados possíveis ao usar esse método

  • Se o destino não existir, a pasta de origem e o conteúdo serão copiados.
  • Se o destino já existir, ocorrerá um erro.
  • Se o destino for uma pasta, a pasta de origem e seu conteúdo serão copiados. Ocorrerá um erro se Overwrite estiver definido como False e já houver uma cópia de um arquivo no destino.
  • Se o destino estiver definido como somente leitura, ocorrerá um erro se Overwrite estiver definido como false.

Esse método para no primeiro erro que encontrar. Não há reversão de nenhuma ação que tenha sido bem-sucedida antes da ocorrência do erro.

Uso dos métodos ‘Move’

Esses métodos podem ser usados para mover arquivos ou pastas para outros locais. Isso é o mesmo que cortar de um local e colar em outro local. Observe que, se o arquivo a ser movido estiver aberto, o método Move falhará com um erro.

MoveFile

Esse método é usado para mover um arquivo específico para outro local. São permitidos curingas no último componente de caminho da fonte.

A sintaxe é a seguinte:

MoveFile origem, destino

Sub MoverUmArquivo()
Dim MeuFSO As New FileSystemObject
MeuFSO.MoveFile "C:\temp\*", "C:\temp\MinhaPasta"
End Sub

Esse código move todos os arquivos encontrados em “C:\temp” para “C:\temp\MinhaPasta”.

As pastas de origem e de destino devem existir, pois a pasta de destino não é criada automaticamente.

Esse método para no primeiro erro que encontra. Não há reversão de nenhuma ação que tenha sido bem-sucedida antes da ocorrência do erro.

MoveFolder

Esse método move uma pasta específica de um local para outro.

A sintaxe é a seguinte:

MoveFolder(origem, destino)

Sub MoverUmaPasta()
Dim MeuFSO As New FileSystemObject
MeuFSO.MoveFolder "C:\temp\MinhaPasta", "C:\temp\MeuDestino"
End Sub

Esse código move a pasta “MinhaPasta” e o conteúdo para a pasta “MeuDestino”. A pasta “MinhaPasta” é efetivamente excluída e a pasta “MeuDestino” é criada, juntamente com o conteúdo da pasta “MinhaPasta”.

Se a pasta de destino já existir, ocorrerá um erro.

Uso dos métodos “Delete” (excluir)

Esses métodos são usados para excluir arquivos ou pastas. Eles devem ser usados com cuidado, pois não há métodos de reversão se algo der errado.

DeleteFile

Esse método exclui arquivos individuais ou um grupo de arquivos usando curingas.

A sintaxe é a seguinte

DeleteFile filespec, [ force ]

Sub ApagarArquivos()
Dim MeuFSO As New FileSystemObject
MeuFSO.DeleteFile "C:\temp\*"
End Sub

Esse código excluirá todos os arquivos da pasta “C:\temp”.

O parâmetro Force é opcional e é definido como True (verdadeiro) ou False (falso). Se for definido como True, os arquivos somente leitura serão excluídos. O padrão é False.

DeleteFolder

Esse método exclui uma pasta especificada e seu conteúdo.

A sintaxe é:

DeleteFolder folderspec, [ force ]

Sub ApagarPastas()
Dim MeuFSO As New FileSystemObject
MeuFSO.DeleteFolder "C:\temp\MeuDestino"
End Sub

Esse código excluirá a pasta “MeuDestino” e todos os arquivos contidos nela. A pasta “temp” permanecerá.

O parâmetro Force é opcional e é definido como True (verdadeiro) ou False (falso). Se for definido como True, as pastas somente leitura serão excluídas. O padrão é False.

Os curingas podem ser usados no último componente do caminho. Se a pasta não for encontrada, ocorrerá um erro.

Esse método para no primeiro erro que encontrar. Não há reversão de nenhuma ação que tenha sido bem-sucedida antes da ocorrência do erro.

 

Outros Métodos no FSO

OpenAsTextStream.

Esse método abre um arquivo especificado como um objeto Text Stream e permite que ele seja lido ou gravado. A vantagem desse método é que ele pode abrir qualquer tipo de arquivo e extrair o texto disponível.

A sintaxe é a seguinte

OpenAsTextStream ([ iomode, [ format ]])

O parâmetro “iomode” permite somente leitura (1), leitura/gravação (2) e acréscimo (8). O parâmetro read/write substitui o arquivo.

O parâmetro ‘format’ é definido como -2 para o padrão do sistema, -1 para abrir o arquivo como Unicode e 0 para abrir o arquivo como ASCII (American Standard Code for Information Interchange).

Sub TesteTextStream()
Dim MeuFSO As New FileSystemObject
Set f = MeuFSO.GetFile("C:\temp\MeuArquivo.txt")
Set ts = f.OpenAsTextStream(2)
ts.Write "Meu Novo Texto"
ts.Close
Set ts = f.OpenAsTextStream(1)
s = ts.ReadLine
MsgBox s
ts.Close
End Sub

Esse código obtém um arquivo de texto existente e o cria como um objeto usando o método ‘GetFile’. Em seguida, ele abre o fluxo de texto como leitura/gravação (2) e grava uma linha de texto. Em seguida, o arquivo é fechado e reaberto como leitura (1) e uma linha é lida dele, que é exibida como uma caixa de mensagem.

Observe que a linha lida deve ser colocada em uma variável antes de ser exibida em uma caixa de mensagem.

BuildPath

Esse método acrescentará um nome de pasta ou de arquivo ao final de um caminho de pasta existente. Isso cria apenas uma cadeia de texto e não cria de fato a nova pasta.

A sintaxe é

BuildPath(path, name)

Sub BuildPth()
Dim MeuFSO As New FileSystemObject
np = MeuFSO.BuildPath("C:\temp", "UmaNovaPasta")
MsgBox np
End Sub

Isso exibirá ‘C:\temp\UmaNovaPasta’. No entanto, se você quiser realmente usar essa pasta, precisará usar o método ‘CreateFolder’.

OpenTextFile

Esse método permite que os arquivos sejam abertos e lidos ou gravados de acordo com os parâmetros definidos. Ele funciona de forma semelhante ao método OpenAsTextStream.

A sintaxe é a seguinte:

OpenTextFile(filename, [ iomode, [ create, [ format ]]])

O parâmetro “iomode” permite ForReading (para leitura), ForWriting (para gravação) e ForAppending (para acréscimo). O parâmetro ForWriting substitui o arquivo.

O parâmetro “create” é um valor booleano. True (verdadeiro) significa que um novo arquivo será criado se o nome de arquivo especificado não existir. False (falso) significa que nenhum arquivo será criado se o nome de arquivo não for encontrado. O padrão é False.

O parâmetro ‘format’ pode ser definido como TristateFalse, TristateMixed, TristateTrue e TristateUseDefault, dependendo do fato de o arquivo ser ASCII ou Unicode

Sub AbrirArquivoTxt()
Dim MeuFSO As New FileSystemObject
Set ts = MeuFSO.OpenTextFile("C:\temp\MeuArquivo.txt", ForReading, False, TristateUseDefault)
s = ts.ReadLine
MsgBox s
ts.Close
End Sub

Esse código lerá uma linha do arquivo de texto ‘MeuArquivo.txt’

Uma vantagem do método OpenTextFile sobre o OpenAsTextStreamMethod é que ele tem menus suspensos para os parâmetros, que são mais significativos do que tentar lembrar os valores numéricos apropriados para as várias opções de parâmetros.

Propriedades do FSO

Drives

Essa propriedade contém uma coleção de unidades disponíveis em seu computador.

Sub Drv()
Dim MeuFSO As New FileSystemObject, d As Drive
Set Dr = MeuFSO.Drives
For Each d In Dr
 MsgBox d.DriveLetter
Next d
End Sub

Esse código retornará cada letra de unidade disponível em seu computador.

Name (Nome)

Retorna o nome de um arquivo ou pasta especificado.

Sub ExemploNome()
Dim MeuFSO As New FileSystemObject
Set f = MeuFSO.GetFile("C:\temp\MeuArquivo.txt")
i = f.Name & " no Drive " & UCase(f.Drive) & vbCrLf
i = i & "Criado: " & f.DateCreated & vbCrLf
i = i & "Último acesso: " & f.DateLastAccessed & vbCrLf
i = i & "Última modificação: " & f.DateLastModified
MsgBox i
End Sub

Esse código fornecerá o nome do arquivo e informações sobre ele usando a propriedade Drive.

Path (Caminho)

A propriedade Path separará o caminho de uma especificação de arquivo.

Sub ExemploCaminho()
Dim MeuFSO As New FileSystemObject
Set f = MeuFSO.GetFile("C:\temp\MeuArquivo.txt")
i = f.Path & f.Name & " no Drive " & UCase(f.Drive) & vbCrLf
i = i & "Criado: " & f.DateCreated & vbCrLf
i = i & "Último acesso: " & f.DateLastAccessed & vbCrLf
i = i & "Última modificação: " & f.DateLastModified
MsgBox i
End Sub

Esse exemplo funciona da mesma forma que o ExemploNome, exceto pelo fato de que agora ele fornece o caminho para o arquivo.

Size (Tamanho)

A propriedade Size fornecerá o tamanho de uma pasta ou de um arquivo.

Sub TamanhoPasta()
Dim MeuFSO As New FileSystemObject
Set f = MeuFSO.GetFolder("C:\temp\")
MsgBox f.Size
End Sub

O código acima retornará o tamanho da pasta ‘C:\temp\’.

Sub TamanhoArquivo()
Dim MeuFSO As New FileSystemObject
Set f = MeuFSO.GetFile("C:\temp\MeuArquivo.txt")
MsgBox f.Size
End Sub

Esse código acima retornará o tamanho do arquivo ‘MeuArquivo.txt’

Type (Tipo)

A propriedade type retornará o texto do tipo de arquivo ou pasta.

Sub TipoPasta()
Dim MeuFSO As New FileSystemObject
Set f = MeuFSO.GetFolder("C:\temp\")
MsgBox f.Type
End Sub

O código acima retornará o texto ‘Pasta de Arquivos’.

Sub TipoArquivo()
Dim MeuFSO As New FileSystemObject
Set f = MeuFSO.GetFile("C:\temp\MeuArquivo.txt")
MsgBox f.Type
End Sub

O código acima retornará o texto “Documento de texto”.

Observe o uso de ‘GetFolder’ e ‘GetFile’ em cada exemplo.

vba-free-addin

Exemplos de Add-ins de Códigos VBA

Acesse facilmente todos os exemplos de código que se encontram em nosso site.

Simply navigate to the menu, click, and the code will be inserted directly into your module. .xlam add-in.

(Nenhuma instalação necessária!)

Baixe de Graça

Retornar aos Exemplos de Códigos VBA