- Usando o FileSystemObject (FSO) no Excel VBA
- Criando um FileSystemObject
- Usando os Métodos ‘Existentes’
- Usando os Métodos ‘Get’
- GetAbsolutePathname
- GetBaseName
- GetDriveName
- GetExtensionName
- GetFile
- GetFolder
- GetParentFolderName
- Usando os Métodos ‘Criar’
- CriarPasta
- CreateTextFile
- Usando os métodos ‘Copiar’
- CopyFile
- CopyFolder
- Usando os Métodos ‘Move’
- MoveFile
- MoveFolder
- Usando os métodos ‘Delete’
- DeleteFile
- DeleteFolder
- Outros métodos no FSO
- OpenAsTextStream.
- BuildPath
- OpenTextFile
- Propriedades do FSO
- Drives
- Nome
- Caminho
- Tamanho
- Type
Usando o FileSystemObject (FSO) no Excel VBA
O FileSystemObject (FSO) lhe dá acesso a toda uma gama de funções para acessar o sistema de arquivos do seu computador. Usando este objeto, você pode facilmente acessar arquivos, pastas e drives e também ler e escrever em arquivos.
Muitas das funções FSO poderiam ser escritas por você em VBA tradicional, mas exigiriam mais codificação, e seriam mais difíceis para um desenvolvedor entrante manter e entender. O FSO é uma API (Application Programming Interface) experimentada e testada e é mais confiável que seu próprio código. É fácil de usar, pronta e disponível.
O FSO funciona de acordo com os padrões e configurações internacionais que você tem no seu computador. Se você estiver distribuindo seu aplicativo Excel globalmente, então usando o FSO irá cuidar de quaisquer diferenças nas configurações entre países, o que seu próprio código teria problemas.
O FSO permitirá que você faça quase tudo em código VBA que você poderia fazer no Windows File Explorer. Ele lhe dá acesso completo ao sistema de arquivos do Windows.
Criando um FileSystemObject
O FileSytemObject não faz parte do Excel VBA. Você pode usar o FSO criando um objeto (late binding) em VBA:
Sub CreateFSO()Set MyFSO = CreateObject("Scripting.FileSystemObject")End Sub
Alternativamente, você pode adicionar uma referência em VBA para a biblioteca FSO. Isto é chamado binding inicial e é mais rápido que o binding tardio, já que o objeto não precisa ser criado quando seu código é executado.
Para adicionar uma referência, você precisa pressionar Alt-F11 para entrar no Visual Basic Editor (VBE), e então usar ‘Tools|References’ do menu VBE. Isto irá exibir uma janela pop-up para você selecionar a referência relevante (veja abaixo).
Relatar para baixo a lista de referências disponíveis até que você possa ver ‘Microsoft Scripting Runtime’. Marque a caixa e clique em OK, e a biblioteca é agora parte da sua aplicação.
A localização do ficheiro da biblioteca DLL é C:\Windows\SysWOW64\scrrrun.dll
Se você está distribuindo seu aplicativo para outros colegas ou localidades, é essencial que eles tenham este arquivo no local correto em seu computador, caso contrário seu código irá errar.
Vale a pena colocar uma armadilha de erro no evento ‘WorkbookOpen’ usando o comando Dir para verificar se o arquivo existe. Se ele estiver ausente, então dê uma mensagem de aviso e feche o arquivo Excel.
Após a referência ter sido adicionada, você pode usar o seguinte código para criar o FSO:
Sub TestFSO()Dim MyFSO As New FileSystemObjectEnd Sub
Todos os exemplos neste artigo usarão esta metodologia para criar o FSO.
O FSO tem muitos métodos e propriedades disponíveis. Estes estão divididos aqui em seções de acordo com o que eles podem fazer.
Usando os Métodos ‘Existentes’
Você pode usar um método FSO para verificar se uma unidade, uma pasta ou um arquivo existe. Estes métodos são fáceis de usar e requerem apenas um parâmetro.
Sub CheckExistance()Dim MyFSO As New FileSystemObjectMsgBox MyFSO.DriveExists("C:")MsgBox MyFSO.FolderExists("C:\temp\")MsgBox MyFSO.FileExists("C:\temp\testfile.txt")End Sub
Estas instruções retornarão todas ‘True’ assumindo que o seu computador tem uma unidade C:, uma pasta chamada ‘Temp’ e um ficheiro na pasta Temp chamado ‘testfile.txt’
As cadeias de texto nos parâmetros não são sensíveis a maiúsculas e minúsculas. Você não pode usar wildcards em nenhum destes métodos.
Você também não pode usar URLs (Uniform Resource Locators) para descrever uma pasta ou localização de arquivo. O FSO funciona puramente no Sistema Operacional Windows e no sistema de arquivos nele existente. Para uma localização de servidor externo, você precisa primeiro mapear uma unidade para isso, e depois usar o próprio caminho da unidade.
Usando os Métodos ‘Get’
O FSO tem 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 de arquivo ou pasta, como data de criação ou data modificada.
GetAbsolutePathname
Esta irá fornecer um caminho completo a partir da raiz do drive especificado.
Sintax is:
GetAbsolutePathName (pathspec)
Sub AbsolutePath()Dim MyFSO As New FileSystemObject, Pth As StringPth = "c:..."MsgBox MyFSO.GetAbsolutePathName(Pth)End Sub
Esta irá retornar uma string ‘C:\Users\Richard\Documents’. Isto é porque o caminho foi especificado como C: seguido de três pontos. Cada ponto significa um próximo nível dentro da estrutura de pastas.
GetBaseName
Esta retorna o nome de um arquivo ou pasta especificado.
Syntax is:
GetBaseName (path)
Sub BaseName()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, então ele não retorna o sufixo do arquivo.
Se o caminho não puder ser encontrado então uma string em branco será retornada.
GetDrive
Isso permite que você use código para acessar informações da unidade, baseado na letra da unidade especificada.
Syntax is:
GetDrive (drivespec)
Sub DriveInfo()Dim MyFSO As New FileSystemObject, Pth As String, Dr As DrivePth = "C:"Set Dr = MyFSO.GetDrive(Pth)MsgBox Dr.FreeSpaceEnd Sub
Este método retorna um objeto de drive baseado no drive especificado. Você pode usar este objeto para acessar informações sobre o drive, como espaço livre disponível.
GetDriveName
Este método separa o nome do drive de uma string caminho / nome de arquivo.
Sintaxe é:
GetDriveName (path)
Sub DriveName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetDriveName(Pth)End Sub
Esta irá retornar ‘C:’
GetExtensionName
Esta irá retornar o sufixo do arquivo no caminho especificado.
Sintaxe é:
GetExtensionName (path)
Sub ExtensionName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetExtensionName(Pth)End Sub
Esta irá retornar ‘txt’.
Se nenhum arquivo for especificado, então 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.
Sintaxe é:
GetFile (filespec)
Sub FileInfo()Dim MyFSO As New FileSystemObject, Pth As String, Fn As FilePth = "C:\temp\testfile.txt"Set Fn = MyFSO.GetFile(Pth)MsgBox Fn.DateCreatedEnd Sub
Esta 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 ‘file not found’.
Sub FileName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetFileName(Pth)End Sub
Isso retornará ‘testfile.txt’.
GetFolder
Isso criará um objeto de pasta para a pasta base no caminho especificado. O caminho deve conter apenas os nomes das pastas. Nenhum nome de arquivo deve ser incluído caso contrário um erro ocorrerá.
Syntax é:
GetFolder (folderspec)
Sub FolderInfo()Dim MyFSO As New FileSystemObject, Pth As String, Fo As FolderPth = "C:\temp"Set Fo = MyFSO.GetFolder(Pth)MsgBox Fo.DateCreatedEnd Sub
O objeto pasta tem várias informações que podem ser acessadas. Neste caso, ele retorna a data em que a pasta foi criada.
Você também pode usar este método para recuperar todos os nomes dos arquivos dentro de uma determinada pasta:
Sub FileNames()Dim MyFSO As New FileSystemObject, Pth As String, Fo As Folder, Fn As FilePth = "C:\temp"Set Fo = MyFSO.GetFolder(Pth)For Each Fn In Fo.Files MsgBox Fn.NameNext FnEnd Sub
Este código irá iterar através da pasta ‘Temp’ e exibir cada nome de arquivo encontrado.
GetParentFolderName
Este método irá retornar o nome da pasta no próximo nível acima na hierarquia de pastas.
Sintax is:
GetParentFolderName (path)
Sub FolderName()Dim MyFSO As New FileSystemObject, Pth As String, Fo As FolderPth = "C:\users\richard"MsgBox MyFSO.GetParentFolderName(Pth)End Sub
Isso retornará ‘Users’ pois este é o ‘parent’ para a pasta ‘richard’.
Usando os Métodos ‘Criar’
Com o FSO você pode criar uma nova pasta e caminho e criar um arquivo texto.
CriarPasta
Você pode especificar um novo nome de caminho de pasta a ser criado. Um perigo disto é que se a pasta já existir, então ocorrerá um erro. Você pode usar o método ‘FolderExists’ para garantir que isso não aconteça.
Syntax is:
CreateFolder (foldername)
Sub CreateNewFolder()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\MyFolder"If MyFSO.FolderExists(Pth) = False Then MyFSO.CreateFolder (Pth)End IfEnd Sub
Este código irá criar uma nova pasta chamada ‘MyFolder’ sob o caminho existente ‘C:\temp’.
CreateTextFile
Este método permite que você crie um arquivo de texto simples e escreva diretamente nele.
Syntax is:
CreateTextFile (filename, ])
Sub CreateTextFile()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\Myfile.txt"Set Fn = MyFSO.CreateTextFile(Pth,True)Fn.Write "Add my own text here" & vbLf & "This is the second line"Fn.CloseEnd Sub
Este código cria um ficheiro de texto chamado ‘Myfile.txt’ na pasta ‘Temp’ da drive ‘C:’ e depois escreve-lhe duas linhas de texto.
Nota que um caractere de alimentação de linha é concatenado na string que está sendo escrita.
Se o caminho para o qual você está escrevendo não existe, então um erro irá ocorrer. Você pode usar o método ‘FolderExists’ para verificar isso antes de criar o arquivo.
Existe um parâmetro opcional para sobrescrever o arquivo existente se necessário – isso pode ser Verdadeiro ou Falso. O padrão é True.
Usando os métodos ‘Copiar’
Pode usar estes métodos para copiar um arquivo ou uma pasta para outro local.
CopyFile
Este método irá copiar um arquivo de um local de pasta para outro. Note que a cópia falhará se o local de destino tiver o atributo read-only definido.
Syntax is:
CopyFile source, destination,
Sub CopyFile()Dim MyFSO As New FileSystemObjectMyFSO.CopyFile "C:\temp\*.txt", "C:\temp\myfolder\", TrueEnd Sub
Este código fará uma cópia de todos os arquivos de texto (txt) em ‘C:\temp’ para ‘C:\temp\myfolder\’, sobrescrevendo o arquivo onde for necessário. A configuração padrão para Overwrite é True.
Você pode usar um curinga asterisco (*) para os nomes dos arquivos, mas você não pode usar um curinga (?) para representar caracteres únicos.
CopyFolder
Você pode usar este método para copiar uma pasta inteira de um local para outro.
Syntax is:
CopyFolder source, destination,
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’ tinha uma pasta dentro dela chamada ‘myfolder’.
Existem quatro resultados possíveis ao usar este método:
- Se o destino não existe, então a pasta e o conteúdo da fonte é copiado.
- Se o destino já existe, então ocorre um erro.
- Se o destino é uma pasta, então a pasta de origem e o seu conteúdo será copiado. Um erro ocorrerá se Overwrite estiver definido para False e já houver uma cópia de um arquivo no destino.
- Se o destino estiver definido para somente leitura, um erro ocorrerá se Overwrite estiver definido para false.
Este método pára no primeiro erro que encontrar. Não há retrocesso de nenhuma ação que tenha tido sucesso antes que o erro ocorra.
Usando os Métodos ‘Move’
Estes métodos podem ser usados para mover arquivos ou pastas para outros locais. Isto é o mesmo que cortar de um local e colar em outro local. Note que se o arquivo a ser movido estiver aberto, então o método Mover falhará com um erro.
MoveFile
Este método é usado para mover um arquivo específico para outro local. Wildcards são permitidos no último componente do caminho do código fonte.
Syntax is:
MoveFile source, destination
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 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á retrocesso de nenhuma ação que tenha tido sucesso antes do erro ocorrer.
MoveFolder
Este método move uma pasta específica de um local para outro.
Syntax is:
MoveFolder (source, destination)
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’. A ‘myfolder’ é efetivamente excluída e a ‘mydestination’ é criada, juntamente com o conteúdo da ‘myfolder’.
Se a pasta de destino já existe, então ocorre um erro.
Usando os métodos ‘Delete’
Estes métodos são usados para excluir arquivos ou pastas. Eles devem ser usados com cuidado pois não há métodos de rollback ou desfazer se algo der errado.
DeleteFile
Isso elimina arquivos individuais ou um grupo de arquivos usando curingas.
Syntax is:
DeleteFile filespec,
Sub DeleteFiles()Dim MyFSO As New FileSystemObjectMyFSO.DeleteFile "C:\temp\*"End Sub
Este código irá apagar todos os ficheiros da pasta ‘C:\temp’
O parâmetro Force é opcional e está definido para True ou False. Se estiver definido para Verdadeiro, então os arquivos somente leitura serão excluídos. O padrão é False.
DeleteFolder
Este método exclui uma pasta especificada e seu conteúdo.
Syntax is:
DeleteFolder folderspec,
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 está definido para True ou False. Se estiver definido para Verdadeiro, então as pastas somente leitura serão deletadas. O padrão é False.
Wildcards pode ser usado no último componente do caminho. Se a pasta não for encontrada, ocorrerá um erro.
Este método pára no primeiro erro que encontrar. Não há rollback de nenhuma ação que tenha tido sucesso antes do erro ocorrer.
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 escrito. A vantagem deste método é que ele pode abrir qualquer tipo de arquivo e extrair o texto disponível.
Sintaxe é:
OpenAsTextStream (])
O parâmetro ‘iomode’ permite somente leitura (1), leitura/escrita (2), e anexar (8). O parâmetro ler/escrever sobrescreve 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 TextStream()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")Set ts = f.OpenAsTextStream(2)ts.Write "My new text"ts.CloseSet 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’. Ele então abre o fluxo de texto como ler / escrever (2) e escreve 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.
Nota que a linha lida deve ser colocada em uma variável antes que ela possa ser exibida em uma caixa de mensagem.
BuildPath
Este método anexará uma pasta ou nome de arquivo ao final de um caminho de pasta existente. Isto apenas cria uma string de texto e não cria a nova pasta.
Syntax is:
BuildPath (caminho, nome)
Sub BuildPth()Dim MyFSO As New FileSystemObjectnp = MyFSO.BuildPath("C:\temp", "ANewFolder")MsgBox npEnd Sub
Isto irá exibir ‘C:\temp\ANewFolder’. Entretanto, se você quiser realmente usar esta pasta, você precisa usar o método ‘CreateFolder’.
OpenTextFile
Este método permite que os arquivos sejam abertos e lidos ou escritos de acordo com os parâmetros definidos. Ele funciona de forma similar ao método OpenAsTextStream.
Syntax is:
OpenTextFile (filename, ]])
O parâmetro ‘iomode’ permite ForReading, ForWriting, e ForAppending. O parâmetro ForWriting substitui o arquivo.
O parâmetro ‘create’ é um valor booleano. True significa que um novo arquivo será criado se o nome do arquivo especificado não existir. Falso significa que nenhum arquivo será criado se o nome do arquivo não for encontrado. O padrão é False.
O parâmetro ‘format’ pode ser definido para TristateFalse, TristateMixed, TristateTrue, e TristateUseDefault dependendo se o arquivo é ASCII ou Unicode.
Sub OpenTxtFile()Dim MyFSO As New FileSystemObjectSet 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 ‘myfile.txt’.
Uma vantagem que o método OpenTextFile tem sobre o OpenAsTextStreamMethod é que ele tem quedas 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
Esta propriedade detém uma coleção de unidades disponíveis no seu computador.
Sub Drv()Dim MyFSO As New FileSystemObject, d As DriveSet Dr = MyFSO.DrivesFor Each d In Dr MsgBox d.DriveLetterNext dEnd Sub
Este código irá retornar cada letra de unidade disponível no seu computador.
Nome
Este código irá retornar o nome de um arquivo ou pasta especificado.
Sub NameExample()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")i = f.Name & " on Drive " & UCase(f.Drive) & vbCrLfi = i & "Created: " & f.DateCreated & vbCrLfi = i & "Last Accessed: " & f.DateLastAccessed & vbCrLfi = i & "Last Modified: " & f.DateLastModifiedMsgBox iEnd Sub
Este código irá dar o nome do arquivo e informações sobre ele usando a propriedade Drive.
Caminho
A propriedade Path irá separar o caminho para fora de uma especificação de arquivo.
Sub PathExample()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")i = f.Path & f.Name & " on Drive " & UCase(f.Drive) & vbCrLfi = i & "Created: " & f.DateCreated & vbCrLfi = i & "Last Accessed: " & f.DateLastAccessed & vbCrLfi = i & "Last Modified: " & f.DateLastModifiedMsgBox iEnd Sub
Este exemplo funciona da mesma forma que o exemplo Nome, excepto que agora fornece o caminho para o ficheiro.
Tamanho
A propriedade Tamanho dará o tamanho de uma pasta ou de um ficheiro.
Sub FSize()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFolder("C:\temp\")MsgBox f.SizeEnd Sub
Este código acima irá retornar o tamanho da pasta ‘C:\temp\’.
Sub FSize()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")MsgBox f.SizeEnd Sub
Este código acima irá retornar o tamanho do arquivo ‘myfile’.txt’.
Type
A propriedade type retornará o texto do arquivo ou pasta tipo.
Sub FType()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFolder("C:\temp\")MsgBox f.TypeEnd Sub
Este código acima retornará o texto ‘File folder’.
Sub FType()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")MsgBox f.TypeEnd Sub
Este código acima retornará o texto ‘Text document’.
Note o uso de ‘GetFolder’ e ‘GetFile’ em cada exemplo.