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 seu computador. Usando esse objeto, você pode acessar facilmente arquivos, pastas e unidades, além de ler e gravar arquivos.
Muitas das funções do FSO poderiam ser escritas por você no VBA tradicional, mas exigiria mais codificação e seria mais difícil para um novo desenvolvedor manter e entender. O FSO é uma API (Interface de Programação de Aplicativo) experimentada e testada e é mais confiável do que seu próprio código. É fácil de usar e está pronto e disponível.
O FSO funciona de acordo com os padrões e configurações internacionais que você possui em seu computador. Se você estiver distribuindo seu aplicativo Excel globalmente, o uso do FSO cuidará de quaisquer diferenças nas configurações entre os países, o que seu próprio código teria problemas para fazer.
O FSO permitirá que você faça quase tudo no código VBA que você poderia fazer no Windows File Explorer. Ele fornece 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 (ligação tardia) no VBA:
123 | Sub CreateFSO ()Definir MyFSO = CreateObject ("Scripting.FileSystemObject")End Sub |
Como alternativa, você pode adicionar uma referência ao VBA para a biblioteca FSO. Isso é chamado de vinculação inicial 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, você precisa pressionar Alt-F11 para entrar no Editor do Visual Basic (VBE) e, em seguida, usar ‘Ferramentas | Referências’ no menu VBE. Isso exibirá uma janela pop-up para você selecionar 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.
A localização do arquivo de biblioteca DLL é C: \ Windows \ SysWOW64 \ scrrun.dll
Se você estiver distribuindo seu aplicativo para outros colegas ou locais, é essencial que eles tenham esse arquivo no local correto em seus computadores, caso contrário, seu código apresentará um erro.
Vale a pena colocar uma armadilha de erro no evento ‘WorkbookOpen’ usando o comando Dir para verificar se o arquivo existe. Se estiver ausente, envie uma mensagem de aviso e feche o arquivo do Excel.
Depois de adicionar a referência, você pode usar o seguinte código para criar o FSO:
123 | Sub TestFSO ()Dim MyFSO As New FileSystemObjectEnd Sub |
Todos os exemplos neste artigo usarão essa metodologia para criar o FSO.
O FSO tem muitos métodos e propriedades disponíveis. Eles são divididos aqui em seções de acordo com o que eles podem fazer.
Usando os métodos ‘existe’
Você pode usar um método FSO para verificar se existe uma unidade, uma pasta ou um arquivo. Esses métodos são fáceis de usar e requerem apenas um parâmetro.
123456 | Sub CheckExistance ()Dim MyFSO As New FileSystemObjectMsgBox MyFSO.DriveExists ("C:")MsgBox MyFSO.FolderExists ("C: \ temp \")MsgBox MyFSO.FileExists ("C: \ temp \ testfile.txt")End Sub |
Todas essas declarações retornarão ‘True’ assumindo que seu computador tenha uma unidade C :, uma pasta chamada ‘Temp’ e um arquivo na pasta Temp chamada ‘testfile.txt’
As strings de texto nos parâmetros não diferenciam maiúsculas de minúsculas. Você não pode usar curingas em nenhum desses métodos.
Você também não pode usar URLs (Uniform Resource Locators) para descrever uma pasta ou local de arquivo. O FSO funciona puramente no sistema operacional Windows e no sistema de arquivos nele. Para um local de servidor externo, primeiro você precisa mapear uma unidade para isso e, em seguida, usar o próprio caminho da unidade.
Usando os métodos ‘Get’
O FSO possui vários métodos para obter informações sobre o arquivo e o caminho, seja dividindo o caminho e o arquivo, ou obtendo informações sobre o arquivo ou pasta, como data de criação ou data de modificação.
GetAbsolutePathname
Isso fornecerá um caminho completo da raiz da unidade especificada.
A sintaxe é:
GetAbsolutePathName (pathspec)
12345 | Sub AbsolutePath ()Dim MyFSO As New FileSystemObject, Pth As StringPth = "c: …"MsgBox MyFSO.GetAbsolutePathName (Pth)End Sub |
Isso retornará uma string ‘C: \ Usuários \ Richard \ Documentos’. Isso ocorre porque o caminho foi especificado como C: seguido por três pontos. Cada ponto significa um próximo nível dentro da estrutura de pastas.
GetBaseName
Isso retorna o nome de um arquivo ou pasta especificado.
A sintaxe é:
GetBaseName(caminho)
12345 | Nome da subbase ()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C: \ temp \ testfile.txt"MsgBox MyFSO.GetBaseName (Pth)End Sub |
Este código retornará ‘testfile’. 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, uma string em branco será retornada.
GetDrive
Isso permite que você use o código para acessar as informações da unidade, com base na letra da unidade especificada.
A sintaxe é:
GetDrive (drivepec)
123456 | Sub DriveInfo ()Dim MyFSO As New FileSystemObject, Pth As String, Dr As DrivePth = "C:"Defina Dr = MyFSO.GetDrive (Pth)MsgBox Dr.FreeSpaceEnd Sub |
Este método retorna um objeto de unidade com base na unidade especificada. Você pode usar este objeto para acessar informações sobre a unidade, como o espaço livre disponível.
Cansado de procurar exemplos de código VBA? Experimente o AutoMacro!
GetDriveName
Este método separará o nome da unidade de uma string de caminho / nome de arquivo.
A sintaxe é:
GetDriveName (caminho)
12345 | Nome da subunidade ()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C: \ temp \ testfile.txt"MsgBox MyFSO.GetDriveName (Pth)End Sub |
Isso retornará 'C:'
GetExtensionName
Isso retornará o sufixo do arquivo no caminho especificado.
A sintaxe é:
GetExtensionName (caminho)
12345 | Nome da subextensão ()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C: \ temp \ testfile.txt"MsgBox MyFSO.GetExtensionName (Pth)End Sub |
Isso retornará 'txt'.
Se nenhum arquivo for especificado, uma string vazia será retornada.
GetFile
Este método retorna um objeto de arquivo, que contém várias informações sobre o próprio arquivo.
A sintaxe é:
GetFile (especificação de arquivo)
123456 | Sub FileInfo ()Dim MyFSO As New FileSystemObject, Pth As String, Fn As FilePth = "C: \ temp \ testfile.txt"Definir Fn = MyFSO.GetFile (Pth)MsgBox Fn.DateCreatedEnd Sub |
Isso retornará a data e 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’.
12345 | Nome do subarquivo ()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C: \ temp \ testfile.txt"MsgBox MyFSO.GetFileName (Pth)End Sub |
Isso retornará ‘testfile.txt’.
GetFolder
Isso 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)
123456 | Sub FolderInfo ()Dim MyFSO As New FileSystemObject, Pth As String, Fo As FolderPth = "C: \ temp"Definir Fo = MyFSO.GetFolder (Pth)MsgBox Fo.DateCreatedEnd Sub |
O objeto de pasta contém várias informações que podem ser acessadas. Neste caso, retorna a data em que a pasta foi criada.
Você também pode usar este método para recuperar todos os nomes de arquivo em uma determinada pasta:
12345678 | Sub FileNames ()Dim MyFSO As New FileSystemObject, Pth As String, Fo As Folder, Fn As FilePth = "C: \ temp"Definir Fo = MyFSO.GetFolder (Pth)Para cada Fn em Fo.FilesMsgBox Fn.NamePróximo FnEnd Sub |
Este código irá iterar através da pasta ‘Temp’ e exibir cada nome de arquivo encontrado.
GetParentFolderName
Este método retornará o nome da pasta no próximo nível acima na hierarquia de pastas.
A sintaxe é:
GetParentFolderName (caminho)
12345 | Nome da subpasta ()Dim MyFSO As New FileSystemObject, Pth As String, Fo As FolderPth = "C: \ users \ richard"MsgBox MyFSO.GetParentFolderName (Pth)End Sub |
Isso retornará ‘Usuários’, pois este é o ‘pai’ da pasta ‘richard’.
Programação VBA | O Code Generator funciona para você!
Usando os métodos ‘Criar’
Com o FSO você pode criar uma nova pasta e caminho e criar um arquivo de texto.
Criar pasta
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 aconteça.
A sintaxe é:
Criar pasta(nome da pasta)
1234567 | Sub CreateNewFolder ()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C: \ temp \ MyFolder"Se MyFSO.FolderExists (Pth) = False, entãoMyFSO.CreateFolder (Pth)Fim seEnd Sub |
Este código criará uma nova pasta chamada ‘MyFolder’ no caminho existente ‘C: \ temp’.
CreateTextFile
Este método permite criar um arquivo de texto simples e escrever diretamente nele.
A sintaxe é:
CreateTextFile (nome do arquivo, [ sobrescrever, [ Unicode ]])
1234567 | Sub CreateTextFile ()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C: \ temp \ Myfile.txt"Definir Fn = MyFSO.CreateTextFile (Pth, True)Fn.Write "Adicionar meu próprio texto aqui" & vbLf & "Esta é a segunda linha"Fn.CloseEnd Sub |
Este código cria um arquivo de texto chamado ‘Myfile.txt’ na pasta ‘Temp’ da unidade ‘C:’ e, em seguida, escreve duas linhas de texto nele.
Observe que um caractere de alimentação de linha é concatenado na string que está sendo escrita.
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 é verdadeiro.
Usando os métodos ‘Copiar’
Você pode usar esses métodos para copiar um arquivo ou pasta para outro local.
Programação VBA | O Code Generator funciona para você!
CopyFile
Este método irá copiar um arquivo de um local de pasta para outro. Observe que a cópia falhará se o local de destino tiver o conjunto de atributos somente leitura.
A sintaxe é:
CopyFile fonte, destino, [ sobrescrever ]
1234 | Sub CopyFile ()Dim MyFSO As New FileSystemObjectMyFSO.CopyFile "C: \ temp \ *. Txt", "C: \ temp \ myfolder \", VerdadeiroEnd Sub |
Este código fará uma cópia de todos os arquivos de texto (txt) em ‘C: \ temp’ em ‘C: \ temp \ myfolder \’, substituindo o arquivo quando necessário. A configuração padrão para Substituir é Verdadeiro.
Você pode usar um caractere curinga asterisco (*) para os nomes de arquivo, mas não pode usar um caractere curinga de ponto de interrogação (?) Para representar caracteres únicos.
CopyFolder
Você pode usar este método para copiar uma pasta inteira de um local para outro.
A sintaxe é:
CopyFolder fonte, destino, [ sobrescrever ]
1234 | Sub CopyFolder ()Dim MyFSO As New FileSystemObjectMyFSO.CopyFolder "C: \ temp \ *", "C: \ users \ richard \"End Sub |
Este código copia todas as pastas e arquivos abaixo de ‘C: \ temp’ para ‘C: \ users \ richard’. A nova pasta criada será ‘C: \ users \ richard \ myfolder’, pois ‘C: \ temp’ contém uma pasta chamada ‘myfolder’.
Existem quatro resultados possíveis ao usar este 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 for definido como False e já houver uma cópia de um arquivo no destino.
- Se o destino for definido como somente leitura, ocorrerá um erro se overwrite for definido como falso.
Este método pára no primeiro erro que encontra. Não há reversão de nenhuma ação bem-sucedida antes da ocorrência do erro.
Usando os métodos ‘Mover’
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. Observe que, se o arquivo a ser movido estiver aberto, o método Mover falhará com um erro.
MoveFile
Este método é usado para mover um arquivo específico para outro local. Curingas são permitidos no último componente do caminho da origem.
A sintaxe é:
MoveFile fonte, destino
1234 | Sub MoveAFile ()Dim MyFSO As New FileSystemObjectMyFSO.MoveFile "C: \ temp \ *", "C: \ temp \ myfolder"End Sub |
Este código move todos os arquivos encontrados em ‘C: \ temp’ para ‘C: \ temp \ myfolder’.
As pastas de origem e de destino devem existir, pois a pasta de destino não é criada automaticamente.
Este método pára no primeiro erro que encontra. Não há reversão de nenhuma ação bem-sucedida antes da ocorrência do erro.
Programação VBA | O Code Generator funciona para você!
MoveFolder
Este método move uma pasta específica de um local para outro.
A sintaxe é:
MoveFolder (fonte, destino)
1234 | Sub MoveAFolder ()Dim MyFSO As New FileSystemObjectMyFSO.MoveFolder "C: \ temp \ myfolder", "C: \ temp \ mydestination"End Sub |
Este código move a pasta ‘myfolder’ e o conteúdo para a pasta ‘mydestination’. ‘Myfolder’ é efetivamente excluído e ‘mydestination’ é criado, junto com o conteúdo de ‘myfolder’.
Se a pasta de destino já existir, ocorrerá um erro.
Usando os métodos ‘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 ou desfazer se algo der errado.
DeleteFile
Isso exclui arquivos individuais ou um grupo de arquivos usando curingas.
A sintaxe é:
DeleteFile especificação de arquivo, [ força ]
1234 | Sub DeleteFiles ()Dim MyFSO As New FileSystemObjectMyFSO.DeleteFile "C: \ temp \ *"End Sub |
Este código excluirá todos os arquivos da pasta ‘C: \ temp’
O parâmetro Force é opcional e definido como True ou False. Se for definido como True, os arquivos somente leitura serão excluídos. O padrão é falso.
DeleteFolder
Este método exclui uma pasta especificada e seu conteúdo.
A sintaxe é:
DeleteFolder folderspec, [ força ]
1234 | Sub DeleteFolders ()Dim MyFSO As New FileSystemObjectMyFSO.DeleteFolder "C: \ temp \ MyDestination"End Sub |
Este código excluirá a pasta ‘MyDestination’ e todos os arquivos dentro dessa pasta. A pasta ‘temp’ permanecerá.
O parâmetro Force é opcional e definido como True ou False. Se for definido como True, as pastas somente leitura serão excluídas. O padrão é falso.
Os curingas podem ser usados no último componente do caminho. Se a pasta não for encontrada, ocorrerá um erro.
Este método pára no primeiro erro que encontra. Não há reversão de nenhuma ação bem-sucedida antes da ocorrência do erro.
Programação VBA | O Code Generator funciona para você!
Outros métodos no FSO
OpenAsTextStream.
Este 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 é:
OpenAsTextStream ([ iomode, [ formato ]])
O parâmetro 'iomode' permite somente leitura (1), leitura / gravação (2) e anexação (8). O parâmetro de leitura / gravação 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).
1234567891011 | Sub TextStream ()Dim MyFSO As New FileSystemObjectDefina f = MyFSO.GetFile ("C: \ temp \ myfile.txt")Defina ts = f.OpenAsTextStream (2)ts.Write "Meu novo texto"ts.CloseDefina ts = f.OpenAsTextStream (1)s = ts.ReadLineMsgBox sts.CloseEnd Sub |
Este 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. O arquivo é então fechado e reaberto como lido (1) e uma linha é lida a partir dele, que é então 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
Este método anexará um nome de pasta ou arquivo ao final de um caminho de pasta existente. Isso apenas cria uma string de texto e não cria de fato a nova pasta.
A sintaxe é:
BuildPath (caminho, nome)
12345 | Sub BuildPth ()Dim MyFSO As New FileSystemObjectnp = MyFSO.BuildPath ("C: \ temp", "ANewFolder")MsgBox npEnd Sub |
Isso exibirá ‘C: \ temp \ ANewFolder’. No entanto, se você deseja realmente usar esta pasta, você precisa usar o método ‘CreateFolder’.
OpenTextFile
Este método permite que os arquivos sejam abertos e lidos ou gravados de acordo com os parâmetros definidos. Ele funciona de maneira semelhante ao método OpenAsTextStream.
A sintaxe é:
OpenTextFile (nome do arquivo, [ iomode, [ Criar, [ formato ]]])
O parâmetro 'iomode' permite ForReading, ForWriting e ForAppending. O parâmetro ForWriting substitui o arquivo.
O parâmetro ‘criar’ é um valor booleano. Verdadeiro significa que um novo arquivo será criado se o nome do arquivo especificado não existir. False significa que nenhum arquivo será criado se o nome do arquivo não for encontrado. O padrão é falso.
O parâmetro ‘format’ pode ser definido como TristateFalse, TristateMixed, TristateTrue e TristateUseDefault, dependendo se o arquivo é ASCII ou Unicode.
1234567 | Sub OpenTxtFile ()Dim MyFSO As New FileSystemObjectDefina ts = MyFSO.OpenTextFile ("C: \ temp \ myfile.txt", ForReading, False, TristateUseDefault)s = ts.ReadLineMsgBox sts.CloseEnd Sub |
Este código irá ler uma linha do arquivo de texto ‘meuarquivo.txt’.
Uma vantagem que o método OpenTextFile tem 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âmetro.
Programação VBA | O Code Generator funciona para você!
Propriedades do FSO
Drives
Esta propriedade contém uma coleção de unidades disponíveis em seu computador.
1234567 | Sub Drv ()Dim MyFSO As New FileSystemObject, d As DriveDefinir Dr = MyFSO.DrivesPara Cada d Em DrMsgBox d.DriveLetterPróximo dEnd Sub |
Este código retornará cada letra de unidade disponível em seu computador.
Nome
Isso retorna o nome de um arquivo ou pasta especificado.
123456789 | Sub NameExample ()Dim MyFSO As New FileSystemObjectDefina f = MyFSO.GetFile ("C: \ temp \ myfile.txt")i = f.Nome & "no Drive" & UCase (f.Drive) & vbCrLfi = i & "Criado:" & f.DateCreated & vbCrLfi = i & "Último acesso:" & f.DateLastAccessed & vbCrLfi = i & "Última modificação:" & f.DateLastModifiedMsgBox iEnd Sub |
Este código fornecerá o nome do arquivo e informações sobre ele usando a propriedade Drive.
Caminho
A propriedade Path separará o caminho de uma especificação de arquivo.
123456789 | Sub PathExample ()Dim MyFSO As New FileSystemObjectDefina f = MyFSO.GetFile ("C: \ temp \ myfile.txt")i = f.Path & f.Name & "on Drive" & UCase (f.Drive) & vbCrLfi = i & "Criado:" & f.DateCreated & vbCrLfi = i & "Último acesso:" & f.DateLastAccessed & vbCrLfi = i & "Última modificação:" & f.DateLastModifiedMsgBox iEnd Sub |
Este exemplo funciona da mesma maneira que o exemplo de Nome, exceto que agora fornece o caminho para o arquivo.
Programação VBA | O Code Generator funciona para você!
Tamanho
A propriedade Size fornecerá o tamanho de uma pasta ou arquivo.
12345 | Sub FSize ()Dim MyFSO As New FileSystemObjectDefina f = MyFSO.GetFolder ("C: \ temp \")MsgBox f.SizeEnd Sub |
Este código acima retornará o tamanho da pasta ‘C: \ temp \’.
12345 | Sub FSize ()Dim MyFSO As New FileSystemObjectDefina f = MyFSO.GetFile ("C: \ temp \ myfile.txt")MsgBox f.SizeEnd Sub |
Este código acima retornará o tamanho do arquivo ‘meuarquivo.txt’.
Modelo
A propriedade type retornará o texto para o tipo de arquivo ou pasta.
12345 | Sub FType ()Dim MyFSO As New FileSystemObjectDefina f = MyFSO.GetFolder ("C: \ temp \")MsgBox f.TypeEnd Sub |
Este código acima retornará o texto ‘Pasta de arquivos’.
12345 | Sub FType ()Dim MyFSO As New FileSystemObjectDefina f = MyFSO.GetFile ("C: \ temp \ myfile.txt")MsgBox f.TypeEnd Sub |
Este código acima retornará o texto ‘Documento de texto’.
Observe o uso de ‘GetFolder’ e ‘GetFile’ em cada exemplo.