Usando VBA FileSystemObject (FSO) no Excel - Visão geral fácil e exemplos

Quando usamos o VBA no Excel, a maior parte dele é 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, mostrarei como usar o VBA FileSystemObject (FSO) para trabalhar com arquivos e pastas em seu sistema ou unidades de rede.

O que é 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 em seu sistema de computador.

Por exemplo, abaixo estão algumas das coisas que você pode fazer usando FileSystemObject no Excel VBA:

  • Verifique se existe um arquivo ou pasta.
  • Crie ou renomeie pastas / arquivos.
  • Obtenha uma lista de todos os nomes de arquivo (ou nomes de subpasta) em uma pasta.
  • Copie arquivos de uma pasta para outra.

Espero que você tenha a idéia.

Vou cobrir todos os exemplos acima (e mais) posteriormente neste tutorial.

Embora algumas das coisas mencionadas acima também possam ser feitas usando funções e métodos tradicionais do VBA (como a função DIR), isso levaria a códigos mais longos e complicados. FileSystemObject facilita o trabalho com arquivos e pastas enquanto mantém o código limpo e curto.

Observação: o FSO só pode ser usado no Excel 2000 e em versões posteriores.

O que todos os objetos podem ser acessados ​​por meio de FileSystemObject?

Como mencionei acima, você pode acessar e modificar arquivos e pastas usando o FileSystemObject no VBA.

Abaixo está uma tabela que mostra os objetos mais importantes que você pode acessar e modificar usando o FSO:

Objeto Descrição
Dirigir O objeto Drive permite que você obtenha informações sobre a unidade, como se existe ou não, seu nome de caminho, tipo de unidade (removível ou fixa), seu tamanho, etc.
Pasta O objeto Pasta permite criar ou modificar pastas em seu sistema. Por exemplo, você pode criar, excluir, renomear e copiar pastas usando este objeto.
Arquivo Objeto de arquivo 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 objeto TextStream permite criar ou ler arquivos de texto.

Cada um dos objetos acima possui métodos que você pode usar para trabalhar com eles.

Para dar um exemplo, se quiser excluir uma pasta, você usará o método DeleteFolder do objeto Pasta. Da mesma forma, se quiser copiar um arquivo, você usará o método CopyFile do objeto File.

Não se preocupe se isso parecer opressor ou difícil de entender. Você terá um entendimento muito melhor quando passar pelos exemplos que eu abordei neste tutorial.

Apenas para fins de referência, 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.

Como estamos lidando com arquivos e pastas que estão fora do aplicativo Excel, precisamos primeiro criar uma referência para a biblioteca que contém esses objetos (unidades, arquivos, pastas).

Agora, existem duas maneiras de começar a usar FileSystemObject no Excel VBA:

  1. Definir a referência à Biblioteca de tempo de execução de scripts da Microsoft (Scrrun.dll)
  2. Criar um objeto para se referir à biblioteca a partir do próprio código

Embora ambos os métodos funcionem (e vou mostrar como fazer isso a seguir), recomendo usar o primeiro método.

Nota: Ao ativar FileSystemObject, você pode acessar todos os objetos nele. Isso inclui o FileSystemObject, Drive, Arquivos, Pastas, etc. Estarei focando principalmente no FileSystemObject neste tutorial.

Definindo a referência para a biblioteca de tempo de execução de scripts da Microsoft

Ao criar uma referência à Biblioteca de Tempo de Execução de Scripting, você permite que o Excel VBA tenha acesso a todas as propriedades e métodos de arquivos e pastas. Feito isso, você pode consultar o objeto de arquivos / pastas / unidades de dentro do Excel VBA (da mesma forma que pode consultar as células, planilhas ou pastas de trabalho).

Abaixo estão as etapas 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 é aberta, role pelas referências disponíveis e marque a opção ‘Microsoft Scripting Runtime’.
  4. Clique OK.

As etapas acima agora permitem que você consulte os objetos FSO do Excel VBA.

Criação de uma instância de FileSystemObject no código

Depois de definir a referência para a biblioteca Scripting FileSystemObject, você precisa criar uma instância do objeto FSO em seu código.

Depois de criado, você pode usá-lo no VBA.

Abaixo está o código que irá definir a variável de objeto MyFSO como um objeto FileSystemObject:

Sub CreatingFSO () Dim MyFSO As FileSystemObject Set MyFSO = New FileSystemObject End Sub

Neste código, primeiro declarei a variável MyFSO como um objeto do tipo FileSystemObject. Isso só é possível porque criei uma referência à Biblioteca de tempo de execução de scripts da Microsoft. Se a referência não for criada, isso dará a você um erro (já que o Excel não reconheceria o que significa FileSystemObject).

Na segunda linha, duas coisas acontecem:

  1. A palavra-chave NEW cria uma instância do FileSystemObject. Isso significa que agora posso usar todos os métodos de FileSystemObject para trabalhar com arquivos e pastas. Se você não criar esta instância, não poderá acessar os métodos do FSO.
  2. A palavra-chave SET define o objeto MyFSO para esta nova instância de FileSystemObject. Isso me permite usar este objeto para acessar arquivos e pastas. Por exemplo, se eu precisar criar uma pasta, posso usar o método MyFSO.CreateFolder.

Se desejar, você também pode combinar as duas declarações acima em uma, conforme mostrado abaixo:

Sub CreatingFSO () Dim MyFSO As New FileSystemObject End Sub

Um grande benefício de usar este método (que é definir a referência à Biblioteca de tempo de execução de scripts da Microsoft) é que, ao usar os objetos FSO em seu código, você poderá usar o recurso IntelliSense que mostra os métodos e propriedades associados a um objeto (conforme mostrado abaixo).

Isso não é possível quando você cria a referência de dentro do código (abordado a seguir).

Criação de um objeto a partir do código

Outra forma 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).

Ao escrever o código, você pode criar um objeto de dentro do código e consultar o Scripting.FileSystemObject.

O código a seguir cria um objeto FSO e o torna um tipo FileSystemObject.

Sub FSODemo () Dim FSO As Object Set FSO = CreateObject ("Scripting.FileSystemObject") End Sub

Embora isso possa parecer mais conveniente, uma grande desvantagem de usar esse método é que ele não mostraria um IntelliSense quando você trabalha com objetos no FSO. Para mim, isso é uma grande negativa e eu sempre recomendo usar o método anterior de habilitar o FSO (que é definindo a referência para ‘Microsoft Scripting Runtime’)

Exemplos de VBA FileSystemObject

Agora vamos mergulhar e dar uma olhada em alguns exemplos práticos do uso de FileSystemObject no Excel.

Exemplo 1: Verifique se existe um arquivo ou pasta

O código a seguir irá verificar se a pasta com o nome ‘Teste’ existe ou não (no local especificado).

Se a pasta existir, a condição IF é Verdadeira e mostra uma mensagem - ‘A pasta existe’ em uma caixa de mensagem. E se não existir, mostra uma mensagem - The Folder Does Not Exist ’.

Sub CheckFolderExist () Dim MyFSO As FileSystemObject Set MyFSO = New FileSystemObject If MyFSO.FolderExists ("C: \ Users \ sumit \ Desktop \ Test") Then MsgBox "A pasta existe" Else MsgBox "A pasta não existe" End If End Sub

Da mesma forma, você também pode verificar se um arquivo existe ou não.

O código a seguir verifica se existe um arquivo com o nome Test.xlsx na pasta especificada ou não.

Sub CheckFileExist () Dim MyFSO As FileSystemObject Set MyFSO = New FileSystemObject If MyFSO.FileExists ("C: \ Users \ sumit \ Desktop \ Test \ Test.xlsx") Then MsgBox "O arquivo existe" Else MsgBox "O arquivo não existe "End If End Sub

Exemplo 2: Criar uma nova pasta no local especificado

O código a seguir criaria uma pasta com o nome ‘Test’ na unidade C do meu sistema (você terá que especificar o caminho em seu sistema onde deseja criar a pasta).

Sub CreateFolder () Dim MyFSO As FileSystemObject Set MyFSO = New FileSystemObject MyFSO.CreateFolder ("C: \ Users \ sumit \ Desktop \ Test") End Sub

Embora esse código funcione bem, ele mostraria um erro caso a pasta já exista.

O código a seguir verifica se a pasta já existe e cria uma pasta se não existir. Caso a pasta já exista, mostra uma mensagem. Para verificar se a pasta existe, usei o Método FolderExists do FSO.

Sub CreateFolder () Dim MyFSO As FileSystemObject Set MyFSO = New FileSystemObject If MyFSO.FolderExists ("C: \ Users \ sumit \ Desktop \ Test") Then MsgBox "A pasta já existe" Else MyFSO.CreateFolder ("C: \ Usuários \ sumit \ Desktop \ Test ") End If End Sub

Exemplo 3: obtenha uma lista de todos os arquivos em uma pasta

O código a seguir mostraria os nomes de todos os arquivos na pasta especificada.

Sub GetFileNames () Dim MyFSO As FileSystemObject Dim MyFile As File Dim MyFolder As Folder Set MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder ("C: \ Users \ sumit \ Desktop \ Test") Para cada MyFile em MyFolder.Files Debug.Print MyFile.Name Next MyFile End Sub

Este código é um pouco mais complexo que os que já vimos.

Como mencionei acima neste tutorial, quando você faz referência à ‘Microsoft Scripting Runtime Library’, você pode usar FileSystemObject, bem como todos os outros objetos (como arquivos e pastas).

No código acima, eu uso três objetos - FileSystemObject, File e Folder. Isso me permite percorrer cada arquivo na pasta especificada. Em seguida, uso a propriedade name para obter a lista de todos os nomes de arquivo.

Observe que estou usando Debug.Print para obter os nomes de todos os arquivos. Esses nomes serão listados na janela imediata no Editor VB.

Exemplo 4: obtenha a lista de todas as subpastas em uma pasta

O código a seguir fornecerá os nomes de todas as subpastas na pasta especificada. A lógica é exatamente a mesma descrita no exemplo acima. Em vez de arquivos, neste código, usamos subpastas.

Sub GetSubFolderNames () Dim MyFSO As FileSystemObject Dim MyFile As File Dim MyFolder As Folder Dim MySubFolder As Folder Set MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder ("C: \ Users \ sumit \ Desktop \ Test") Para cada MySubFolder Em MyFolder.SubFolders Debug.Print MySubFolder.Name Next MySubFolder End Sub

Exemplo 5: copiar um arquivo de um lugar para outro

O código a seguir irá copiar o arquivo da pasta ‘Source’ e copiá-lo para a pasta ‘Destination’.

Sub CopyFile () Dim MyFSO As FileSystemObject Dim SourceFile As String Dim DestinationFolder As String Set MyFSO = New Scripting.FileSystemObject SourceFile = "C: \ Users \ sumit \ Desktop \ Source \ SampleFile.xlsx" DestinationFolder = "C: \ Usuários \ sumit \ Desktop \ Destination "Fonte MyFSO.CopyFile: = SourceFile, Destination: = DestinationFolder &" \ SampleFileCopy.xlsx "End Sub

No código acima, usei duas variáveis ​​- SourceFile e DestinationFolder.

O Arquivo de Origem contém o endereço do arquivo que desejo copiar e a variável DestinationFolder contém o endereço da pasta para a qual desejo que o arquivo seja copiado.

Observe que não é suficiente fornecer o nome da pasta de destino ao copiar um arquivo. Você também precisa especificar o nome do arquivo. Você pode usar o mesmo nome de arquivo ou também alterá-lo. No exemplo acima, copiei o arquivo e chamei-o de SampleFileCopy.xlsx

Exemplo 6: Copiar todos os arquivos de uma pasta para outra

O código a seguir copiará todos os arquivos da pasta de origem para a pasta de destino.

Sub CopyAllFiles () Dim MyFSO As FileSystemObject Dim MyFile As File Dim SourceFolder As String Dim DestinationFolder As String Dim MyFolder As Folder Dim MySubFolder As Folder SourceFolder = "C: \ Users \ sumit \ Desktop \ Source" DestinationFolder = "C: \ Users \ sumit \ Desktop \ Destination "Set MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder (SourceFolder) Para Cada MyFile In MyFolder.Files MyFSO.CopyFile Source: = MyFSO.GetFile (MyFile), _ Destination: = DestinationFolder &" "& MyFile.Name, Overwritefiles: = False Next MyFile End Sub

O código acima irá copiar todos os arquivos da pasta de origem para a pasta de destino.

Observe que no método MyFSO.CopyFile, eu especifiquei a propriedade ‘Overwritefiles’ como False (isso é True por padrão). Isso garante que, caso você já tenha o arquivo na pasta, ele não seja copiado (e você verá um erro). Se você remover ‘Overwritefiles’ ou definir como True, caso haja arquivos na pasta de destino com o mesmo nome, eles serão substituídos.

Dica profissional: Ao copiar arquivos, sempre há uma chance de sobrescrevê-los. Uma boa ideia, neste caso, é adicionar o carimbo de data / hora junto com o nome. Isso garantirá que os nomes sejam sempre diferentes e que você possa rastrear facilmente quais arquivos foram copiados e a que horas.

Se você deseja copiar os arquivos de apenas uma determinada extensão, 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 FileSystemObject Dim MyFile As File Dim SourceFolder As String Dim DestinationFolder As String Dim MyFolder As Folder Dim MySubFolder As Folder SourceFolder = "C: \ Users \ sumit \ Desktop \ Source" DestinationFolder = "C: \ Users \ sumit \ Desktop \ Destination "Set MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder (SourceFolder) Para cada MyFile In MyFolder.Files If MyFSO.GetExtensionName (MyFile) =" xlsx "Then MyFSO.CopyFile Source: = MyFSetFileFile.G (MyFile), _ Destination: = DestinationFolder & "\" & MyFile.Name, Overwritefiles: = False End If Next MyFile End Sub

Métodos FileSystemObject (FSO)

Aqui estão os métodos que você pode usar para cada objeto. Isso é apenas para referência e não se preocupe muito com isso. O uso de alguns deles foi mostrado nos exemplos cobertos acima.

Métodos FSO Para Objeto Descrição
DriveExists Dirigir Verifica se a unidade existe ou não
GetDrive Dirigir Retorna uma instância do objeto drive com base no caminho especificado
GetDriveName Dirigir Executa novamente o nome da unidade
BuildPath Pasta de arquivo Gere um caminho a partir de um caminho existente e um nome
CopyFile Pasta de arquivo Copia um arquivo
GetAbsolutePathName Pasta de arquivo Retorna a representação canônica do caminho
GetBaseName Pasta de arquivo Retorna o nome da base de um caminho. Por exemplo, “D: \ TestFolder \ TestFile.xlsm” retornará TextFile.xlsm
GetTempName Pasta de arquivo Gere um nome que pode ser usado para nomear um arquivo temporário
CopyFolder Pasta Copia uma pasta de um local para outro
Criar pasta Pasta Cria uma nova pasta
DeleteFolder Pasta Exclui a pasta especificada
FolderExists Pasta Verifica se a pasta existe ou não
GetFolder Pasta Retorna uma instância do objeto de pasta com base no caminho especificado
GetParentFolderName Pasta Recupera o nome da pasta pai com base no caminho especificado
GetSpecialFolder Pasta Obtenha a localização de várias pastas do sistema.
MoveFolder Pasta Move uma pasta de um local para outro
DeleteFile Arquivo Exclui um arquivo
O arquivo existe 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 objeto de arquivo com base no caminho especificado
GetFileName Arquivo Retorna o nome do arquivo
GetFileVersion Arquivo Retorna a versão do arquivo
MoveFile Arquivo Move um arquivo
CreateTextFile Arquivo Cria um arquivo de texto
GetStandardStream Arquivo Recupere a entrada, saída ou fluxo de erro padrão
OpenTextFile Arquivo Abra um arquivo como um TextStream

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

wave wave wave wave wave