Usando VBA FileSystemObject (FSO) no Excel – Easy Overview & Examples

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:

  1. Configurando a referência para a Biblioteca de tempo de execução do Microsoft Scripting (Scrrun.dll)
  2. 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.

Nota: Quando activa o FileSystemObject, pode aceder a todos os objectos nele contidos. Isto inclui o FileSystemObject, Drive, Files, Folders, etc. Eu estarei focando principalmente no FileSystemObject neste tutorial.

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:

  1. No Editor VB, clique em Ferramentas.
  2. Clique em Referências.
  3. Na caixa de diálogo Referências que se abre, percorra as referências disponíveis e seleccione a opção ‘Microsoft Scripting Runtime’.
  4. 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:

  1. 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.
  2. 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.

Dica Pro: Ao copiar arquivos, há sempre uma chance de sobrescrever arquivos. Uma boa ideia, neste caso, é adicionar o carimbo da hora junto com o nome. Isto irá assegurar que os nomes são sempre diferentes e você pode facilmente rastrear quais arquivos foram copiados em que momento.

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.

Deixe uma resposta

O seu endereço de email não será publicado.