Usando o FileSystemObject no Excel VBA

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.

Você vai ajudar o desenvolvimento do site, compartilhando a página com seus amigos

wave wave wave wave wave