Quando usamos VBA no Excel, a maior parte é para automatizar nossas tarefas.
Isso também significa que, na maioria das vezes, trabalhamos com células e intervalos, planilhas, pastas de trabalho e outros objetos que fazem parte do aplicativo Excel.
Mas o VBA é muito mais poderoso e também pode ser usado para trabalhar com coisas fora do Excel.
Neste tutorial, vou mostrar como usar o VBA FileSystemObject (FSO) para trabalhar com arquivos e pastas em seu sistema ou drives de rede.
Este tutorial cobre:
O que é o VBA FileSystemObject (FSO)?
FileSystemObject (FSO) permite que você acesse o sistema de arquivos do seu computador. Usando-o, você pode acessar e modificar os arquivos/pastas/diretórios no sistema do seu computador.
Por exemplo, abaixo estão algumas das coisas que você pode fazer usando FileSystemObject no Excel VBA:
- Verifica se um arquivo ou pasta existe.
- Cria ou renomeia pastas/arquivos.
- Recebe uma lista de todos os nomes de arquivos (ou nomes de subpastas) em uma pasta.
- Copiar arquivos de uma pasta para outra.
Espero que você tenha a idéia.
Cobrirei todos estes exemplos acima (mais) mais tarde neste tutorial.
Apesar de algumas das coisas mencionadas acima também podem ser feitas usando funções VBA tradicionais (como a função DIR) e métodos, que levariam a códigos mais longos e complicados. FileSystemObject facilita o trabalho com arquivos e pastas enquanto mantém o código limpo e curto.
Note: FSO can only be used in Excel 2000 and later versions.
O que todos os objetos você pode acessar através do FileSystemObject?
Como mencionei acima, você pode acessar e modificar arquivos e pastas usando o FileSystemObject em VBA.
Below é uma tabela que mostra os objetos mais importantes que você pode acessar e modificar usando FSO:
Object | Descrição |
Drive | Drive Object permite que você obtenha informações sobre a unidade, como se ela existe ou não, seu nome do caminho, tipo de unidade (removível ou fixa), seu tamanho, etc. |
Pasta | ObjectoPasta permite-lhe criar ou modificar pastas no seu sistema. Por exemplo, você pode criar, apagar, renomear, copiar pastas usando este objeto. |
Arquivo | O objetoArquivo permite que você trabalhe com arquivos em seu sistema. Por exemplo, você pode criar, abrir, copiar, mover e excluir arquivos usando este objeto. |
TextStream | O objetoTextStream permite que você crie ou leia arquivos de texto. |
Cada um dos objectos acima tem métodos que pode utilizar para trabalhar com estes.
Para lhe dar um exemplo, se quiser apagar uma pasta, utilizará o método DeleteFolder do objecto Folder. Da mesma forma, se você quiser copiar um arquivo, você usará o método CopyFile do objeto File.
Não se preocupe se isto parecer esmagador ou difícil de entender. Você terá uma compreensão muito melhor quando você passar pelos exemplos que eu cobri neste tutorial.
Apenas para o propósito de referência, eu cobri todos os métodos FileSystemObject (para cada objeto) no final deste tutorial.
Habilitando FileSystemObject no Excel VBA
FileSystemObject não está disponível por padrão no Excel VBA.
Desde que estamos lidando com arquivos e pastas que estão fora do aplicativo Excel, precisamos primeiro criar uma referência para a biblioteca que abriga esses objetos (drives, arquivos, pastas).
Agora existem duas maneiras de começar a usar o FileSystemObject no Excel VBA:
- Configurando a referência para a Biblioteca de tempo de execução do Microsoft Scripting (Scrrun.dll)
- Criar um objecto para se referir à biblioteca a partir do próprio código
Embora ambos os métodos funcionem (e mostrar-lhe-ei como fazer isto a seguir), recomendo usar o primeiro método.
Definindo a Referência para a Biblioteca de Tempo de Execução de Scripts da Microsoft
Quando você cria uma referência para a Biblioteca de Tempo de Execução de Scripts, você permite ao Excel VBA o acesso a todas as propriedades e métodos de arquivos e pastas. Uma vez feito isso, você pode consultar os arquivos/pastas/objetos de dentro do Excel VBA (assim como você pode consultar as células, planilhas ou pastas de trabalho).
Below são os passos para criar uma referência à Biblioteca de Tempo de Execução de Scripts da Microsoft:
- No Editor VB, clique em Ferramentas.
- Clique em Referências.
- Na caixa de diálogo Referências que se abre, percorra as referências disponíveis e seleccione a opção ‘Microsoft Scripting Runtime’.
- Clique em OK.
Os passos acima permitiriam agora que você se referisse aos objetos FSO do Excel VBA.
Criando uma Instância do objeto FileSystemObject no Código
Após ter definido a referência para a biblioteca FileSystemObject Scripting, você precisa criar uma instância do objeto FSO no seu código.
Após isto ser criado, pode utilizá-lo em VBA.
Below é o código que irá definir a variável objecto MyFSO como um objecto FileSystemObject:
Sub CreatingFSO()Dim MyFSO As FileSystemObjectSet MyFSO = New FileSystemObjectEnd Sub
Neste código, primeiro declarei a variável MyFSO como um objecto do tipo FileSystemObject. Isto só é possível porque criei uma referência para a Biblioteca de tempo de execução do Microsoft Scripting. Se a referência não for criada, isto vai dar-lhe um erro (pois o Excel não reconheceria o que significa FileSystemObject).
Na segunda linha, duas coisas acontecem:
- A NOVA palavra-chave cria uma instância do FileSystemObject. Isto significa que agora eu posso usar todos os métodos do FileSystemObject para trabalhar com arquivos e pastas. Se não criar esta instância, não poderá aceder aos métodos do FSO.
- A palavra-chave SET define o objecto MyFSO para esta nova instância do FileSystemObject. Isto permite-me utilizar este objecto para aceder a ficheiros e pastas. Por exemplo, se eu precisar criar uma pasta, eu posso usar o método MyFSO.CreateFolder.
Se você quiser, você também pode combinar as duas instruções acima em uma, como mostrado abaixo:
Sub CreatingFSO()Dim MyFSO As New FileSystemObjectEnd Sub
Um grande benefício de usar este método (que é definir a referência para a Biblioteca de Tempo de Execução de Scripts da Microsoft) é que quando você usar os objetos FSO no seu código, você será capaz de usar a funcionalidade IntelliSense que mostra os métodos e propriedades associadas a um objeto (como mostrado abaixo).
Isso não é possível quando você cria a referência de dentro do código (coberto a seguir).
Criando um objeto a partir do código
Outra maneira de criar uma referência ao FSO é fazendo isso a partir do código. Neste método, você não precisa criar nenhuma referência (como feito no método anterior).
Quando você está escrevendo o código, você pode criar um objeto de dentro do código e se referir ao Scripting.FileSystemObject.
O código abaixo cria um objecto FSO e depois torna-o um objecto do tipo FileSystemObject.
Sub FSODemo()Dim FSO As ObjectSet FSO = CreateObject("Scripting.FileSystemObject")End Sub
Embora isto possa parecer mais conveniente, uma grande desvantagem de usar este método é que não mostraria um IntelliSense quando trabalha com objectos em FSO. Para mim, este é um grande negativo e eu sempre recomendo usar o método anterior de habilitar o FSO (que é definindo a referência ao ‘Microsoft Scripting Runtime’)
Exemplos de FileSystemObject VBA
Agora vamos mergulhar e dar uma olhada em alguns exemplos práticos de uso do FileSystemObject no Excel.
Exemplo 1: Verifique se um arquivo ou pasta existe
O código a seguir irá verificar se a pasta com o nome ‘Test’ existe ou não (no local especificado).
Se a pasta existir, a condição IF é True e mostra uma mensagem – ‘The Folder Exists’ em uma caixa de mensagem. E se não existir, mostra uma mensagem – ‘The Folder Does Not Exist’.
Sub CheckFolderExist()Dim MyFSO As FileSystemObjectSet MyFSO = New FileSystemObjectIf MyFSO.FolderExists("C:\Users\sumit\Desktop\Test") Then MsgBox "The Folder Exists"Else MsgBox "The Folder Does Not Exist"End IfEnd Sub
Simplesmente, você também pode verificar se um arquivo existe ou não.
O código abaixo verifica se existe ou não um arquivo com o nome Test.xlsx na pasta especificada.
Sub CheckFileExist()Dim MyFSO As FileSystemObjectSet MyFSO = New FileSystemObjectIf MyFSO.FileExists("C:\Users\sumit\Desktop\Test\Test.xlsx") Then MsgBox "The File Exists"Else MsgBox "The File Does Not Exist"End IfEnd Sub
Exemplo 2: Crie uma nova pasta no local especificado
O código abaixo criaria uma pasta com o nome ‘Test’ na unidade C do meu sistema (terá de especificar o caminho no seu sistema onde pretende criar a pasta).
Sub CreateFolder()Dim MyFSO As FileSystemObjectSet MyFSO = New FileSystemObjectMyFSO.CreateFolder ("C:\Users\sumit\Desktop\Test")End Sub
Embora este código funcione bem, ele mostraria um erro caso a pasta já exista.
O código abaixo verifica se a pasta já existe e cria uma pasta caso não exista. Caso a pasta já exista, ele mostrará uma mensagem. Para verificar se a pasta existe, usei o método FolderExists do FSO.
Sub CreateFolder()Dim MyFSO As FileSystemObjectSet MyFSO = New FileSystemObjectIf MyFSO.FolderExists("C:\Users\sumit\Desktop\Test") Then MsgBox "The Folder Already Exist"Else MyFSO.CreateFolder ("C:\Users\sumit\Desktop\Test")End IfEnd Sub
Exemplo 3: Obter uma lista de todos os arquivos em uma pasta
O código abaixo mostraria os nomes de todos os arquivos na pasta especificada.
Sub GetFileNames()Dim MyFSO As FileSystemObjectDim MyFile As FileDim MyFolder As FolderSet MyFSO = New Scripting.FileSystemObjectSet MyFolder = MyFSO.GetFolder("C:\Users\sumit\Desktop\Test")For Each MyFile In MyFolder.Files Debug.Print MyFile.NameNext MyFileEnd Sub
Este código é um pouco mais complexo do que aqueles que já vimos.
Como mencionei acima neste tutorial, quando você referencia a ‘Microsoft Scripting Runtime Library’, você pode usar o FileSystemObject assim como todos os outros objetos (como Arquivos e Pastas).
No código acima, eu uso três objetos – FileSystemObject, File, e Folder. Isto permite-me percorrer cada ficheiro na pasta especificada. Eu então uso a propriedade name para obter a lista de todos os nomes dos arquivos.
Nota que estou usando Debug.Print para obter os nomes de todos os arquivos. Estes nomes serão listados na janela imediata no Editor VB.
Exemplo 4: Obter a lista de todas as subpastas em uma pasta
O código abaixo dará os nomes de todas as subpastas na pasta especificada. A lógica é exatamente a mesma que a abordada no exemplo acima. Ao invés de arquivos, neste código, usamos subpastas.
Sub GetSubFolderNames()Dim MyFSO As FileSystemObjectDim MyFile As FileDim MyFolder As FolderDim MySubFolder As FolderSet MyFSO = New Scripting.FileSystemObjectSet MyFolder = MyFSO.GetFolder("C:\Users\sumit\Desktop\Test")For Each MySubFolder In MyFolder.SubFolders Debug.Print MySubFolder.NameNext MySubFolderEnd Sub
Exemplo 5: Copie um arquivo de um lugar para outro
O código abaixo copiará o arquivo da pasta ‘Source’ e o copiará para a pasta ‘Destination’.
Sub CopyFile()Dim MyFSO As FileSystemObjectDim SourceFile As StringDim DestinationFolder As StringSet MyFSO = New Scripting.FileSystemObjectSourceFile = "C:\Users\sumit\Desktop\Source\SampleFile.xlsx"DestinationFolder = "C:\Users\sumit\Desktop\Destination"MyFSO.CopyFile Source:=SourceFile, Destination:=DestinationFolder & "\SampleFileCopy.xlsx"End Sub
No código acima, usei duas variáveis – SourceFile e DestinationFolder.
O ficheiro de origem contém o endereço do ficheiro que quero copiar e a variável DestinationFolder contém o endereço da pasta para onde quero que o ficheiro seja copiado.
Note que não é suficiente dar o nome da pasta de destino quando se está a copiar um ficheiro. Você também precisa especificar o nome do arquivo. Você pode usar o mesmo nome de ficheiro ou também pode alterá-lo. No exemplo acima, eu copiei o arquivo e o nomeei SampleFileCopy.xlsx
Exemplo 6: Copie todos os arquivos de uma pasta para outra
O código abaixo irá copiar todos os arquivos da pasta de origem para a pasta de destino.
Sub CopyAllFiles()Dim MyFSO As FileSystemObjectDim MyFile As FileDim SourceFolder As StringDim DestinationFolder As StringDim MyFolder As FolderDim MySubFolder As FolderSourceFolder = "C:\Users\sumit\Desktop\Source"DestinationFolder = "C:\Users\sumit\Desktop\Destination"Set MyFSO = New Scripting.FileSystemObjectSet MyFolder = MyFSO.GetFolder(SourceFolder)For Each MyFile In MyFolder.Files MyFSO.CopyFile Source:=MyFSO.GetFile(MyFile), _ Destination:=DestinationFolder & "\" & MyFile.Name, Overwritefiles:=FalseNext MyFileEnd Sub
O código acima irá copiar todos os arquivos da pasta Fonte para a pasta de destino.
Nota que no método MyFSO.CopyFile, eu especifiquei a propriedade ‘Overwritefiles’ para ser Falso (isto é Verdadeiro por padrão). Isso garante que caso você já tenha o arquivo na pasta, ele não será copiado (e você verá um erro). Se você remover ‘Overwritefiles’ ou definir isto para True, caso haja arquivos na pasta de destino com o mesmo nome, estes seriam sobrescritos.
Se você quiser copiar os arquivos de uma determinada extensão apenas, você pode fazer isso usando uma instrução IF Then para verificar se a extensão é xlsx ou não.
Sub CopyExcelFilesOnly()Dim MyFSO As FileSystemObjectDim MyFile As FileDim SourceFolder As StringDim DestinationFolder As StringDim MyFolder As FolderDim MySubFolder As FolderSourceFolder = "C:\Users\sumit\Desktop\Source"DestinationFolder = "C:\Users\sumit\Desktop\Destination"Set MyFSO = New Scripting.FileSystemObjectSet MyFolder = MyFSO.GetFolder(SourceFolder)For Each MyFile In MyFolder.Files If MyFSO.GetExtensionName(MyFile) = "xlsx" Then MyFSO.CopyFile Source:=MyFSO.GetFile(MyFile), _ Destination:=DestinationFolder & "\" & MyFile.Name, Overwritefiles:=False End IfNext MyFileEnd Sub
Métodos FileSystemObject (FSO)
Aqui estão os métodos que você pode usar para cada objeto. Isto é apenas para fins de referência e não se preocupa muito com isso. O uso de alguns destes métodos foi mostrado nos exemplos acima.
Métodos FSO | Para Objeto | Descrição | |
DriveExists | Drive | Verifica se o drive existe ou não | |
GetDrive | Drive | Revolve uma instância do objecto da unidade com base no caminho especificado | |
GetDriveName | Drive | Revolve o nome da unidade | |
BuildPath | Arquivo/Pasta | Gerar um caminho a partir de um caminho existente e um nome | |
CopiarArquivo | Arquivo/Pasta | Copiar um ficheiro | |
GetAbsolutePathName | Arquivo/Pasta | Retornar a representação canónica do caminho | |
GetBaseName | Arquivo/Pasta | Retornar o nome base de um caminho. Por exemplo, “D:\TestFolder\TestFile.xlsm” irá retornar TextFile.xlsm | |
GetTempName | Arquivo/Pasta | Gerar nome que pode ser usado para nomear um arquivo temporário | |
CopyFolder | Pasta | Copia uma pasta de um local para outros | |
CriarPasta | Pasta | Cria uma nova pasta | |
DeleteFolder | Pasta | DeleteFolder | Delete a pasta especificada |
PastaExists | Pasta | Verifica se a Pasta existe ou não | |
GetFolder | Pasta | Pasta | Retorna uma instância do objecto da pasta com base no caminho especificado |
PacoteParentFolderName | Pasta | Retrocede o nome da pasta principal com base no caminho especificado | |
GetSpecialFolder | Pasta | Alcertar a localização de várias pastas do sistema. | |
MoveFolder | Folder | Moves a folder from one location to other | |
DeleteFile | File | Deletes a file | |
FileExists | Arquivo | Verifica se um arquivo existe ou não | |
GetExtensionName | Arquivo | Retorna a extensão do arquivo | |
GetFile | Arquivo | Retorna a instância de um arquivo objeto baseado no caminho especificado | |
GetFileName | Arquivo | Retorna o nome do arquivo | |
GetFileVersion | Arquivo | Retorna a versão do arquivo | |
MoveFile | Arquivo | Moves a file | |
CriarArquivo de Texto | Arquivo | Cria um ficheiro de texto | |
GetStandardStream | Arquivo | Retrie a entrada padrão, output or error stream | |
OpenTextFile | File | Abrir um ficheiro como um TextStream |
Pode Também Gostar dos seguintes Tutoriais do Excel:
- Obtenha uma Lista de Nomes de Arquivos em Pastas & Subpastas (usando Power Query).
- Obter a Lista de Nomes de Arquivos de uma Pasta no Excel (com e sem VBA).
- Entendendo os Tipos de Dados VBA do Excel (Variáveis e Constantes).
- Criando uma Função Definida pelo Usuário (UDF) no Excel VBA.