Capítulo 17: Manipulação de Arquivos e Pastas do Windows via FileSystemObject

🎯 Objetivo da Aula

Nesta aula, você aprenderá a ultrapassar as fronteiras da planilha e interagir diretamente com o sistema operacional Windows utilizando a poderosa biblioteca Scripting.FileSystemObject (FSO). Você aprenderá a verificar a existência de pastas e arquivos (FolderExists, FileExists), criar diretórios organizados por Ano e Mês (CreateFolder) e gerar arquivos externos de dados delimitados (.csv e .txt) através dos métodos CreateTextFile e WriteLine.

Ao final desta aula, você terá desenvolvido o robô de exportação contábil e geração de arquivos do Manifesto Eletrônico (MDF-e) da FastLog S.A.


🏢 Cenário Prático (FastLog S.A.)

Empresa: FastLog Transportes & Logística Integrada S.A.
Problema: Toda noite, o assistente contábil precisava pegar os fretes faturados do dia, copiar para um bloco de notas, salvar manualmente como arquivo CSV delimitado por ponto e vírgula e mover o arquivo para a pasta da rede correspondente ao ano e mês (D:\FastLog_Arquivos\2026\10_Outubro\). Quando o colaborador esquecia de criar a pasta do mês ou salvava com separador de vírgula em vez de ponto e vírgula, o sistema fiscal da SEFAZ rejeitava o lote de MDF-e, bloqueando as notas fiscais dos caminhões na madrugada.
Sua Missão: Desenvolver o robô de automação ExportarLoteFiscalCSV, que cria automaticamente a estrutura de diretórios do mês no disco, formata as colunas em padrão CSV fiscal com ponto e vírgula, gera o arquivo físico com carimbo de data e registra uma cópia de segurança sem qualquer intervenção humana.


🧠 Fundamentos: A Teoria Traduzida

1. O que é o FileSystemObject (FSO)?

O FSO é um componente COM da biblioteca Microsoft Scripting Runtime que concede ao VBA controle total sobre as unidades de disco, diretórios e arquivos do Windows:

flowchart TD
    VBA["💻 Script VBA (Excel)"] --> FSO["📂 Objeto Scripting.FileSystemObject"]
    
    subgraph DISCO["Sistema Operacional Windows"]
        FSO --> D1["📁 Cria Diretórios: 'C:\FastLog_Exportacoes\2026-10\'"]
        FSO --> D2["📄 Cria Arquivo Físico: 'MDFE_20261001.csv'"]
        FSO --> D3["💾 Escreve Linhas: .WriteLine 'ID;Placa;Valor;Data'"]
        FSO --> D4["🔒 Fecha Arquivo: .Close"]
    end

    style VBA fill:#1a365d,stroke:#fff,stroke-width:2px,color:#fff
    style FSO fill:#2c3e50,stroke:#fff,stroke-width:2px,color:#fff
    style DISCO fill:#27ae60,stroke:#fff,stroke-width:2px,color:#fff
    style D1 fill:#2980b9,stroke:#fff,stroke-width:2px,color:#fff
    style D2 fill:#8e44ad,stroke:#fff,stroke-width:2px,color:#fff
    style D3 fill:#d35400,stroke:#fff,stroke-width:2px,color:#fff
    style D4 fill:#16a085,stroke:#fff,stroke-width:2px,color:#fff

2. Ligação Tardia (Late Binding) vs. Precoce (Early Binding)

Para utilizar o FSO, a forma mais compatível e recomendada em ambientes corporativos é a Ligação Tardia (Late Binding) através da função CreateObject:

1
2
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")

(Essa abordagem dispensa ter que ativar referências manuais nas opções do VBE, funcionando em qualquer computador da empresa!).

3. Principais Métodos do FSO

MétodoSintaxeFinalidade
FolderExistsfso.FolderExists(caminho)Retorna True se o diretório já existir no disco.
CreateFolderfso.CreateFolder(caminho)Cria uma nova pasta no sistema de arquivos.
FileExistsfso.FileExists(caminho)Retorna True se o arquivo físico existir.
CreateTextFileSet arq = fso.CreateTextFile(caminho, True)Cria ou sobrescreve um novo arquivo de texto.
WriteLinearq.WriteLine "texto"Grava uma linha de texto adicionando quebra de linha.
Closearq.CloseFecha o manipulador e libera o arquivo no Windows.

📖 Exemplo Guiado: Passo a Passo no Laboratório

No computador do laboratório, acesse o VBE com Alt + F11.

Passo 1: Inserção do Módulo de Automação de Arquivos

  1. No menu superior, clique em Inserir ➔ Módulo.
  2. Na janela de propriedades (F4), renomeie o módulo para: modIntegracaoFSO.
  3. Confirme a presença de Option Explicit.

🛠️ Prática Obrigatória 1: Criação de Pastas e Exportação em Formato CSV

Construiremos a rotina corporativa que varre os dados da planilha e os exporta para um arquivo .csv na pasta C:\FastLog_Exportacoes\Ano_Mes\.

Passo a Passo no Computador:

  1. No módulo modIntegracaoFSO, digite o seguinte procedimento completo:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    
    Option Explicit
    
    Sub ExportarLoteFiscalCSV()
        Dim fso As Object
        Dim arqTexto As Object
        Dim ws As Worksheet
        Dim strCaminhoBase As String
        Dim strPastaMes As String
        Dim strNomeArquivo As String
        Dim strCaminhoCompleto As String
        Dim lngUltimaLinha As Long
        Dim i As Long
        Dim strLinhaCSV As String
    
        Set ws = ThisWorkbook.Worksheets(1)
        lngUltimaLinha = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    
        If lngUltimaLinha < 2 Then
            MsgBox "Nenhum frete faturado para exportar!", vbExclamation, "Aviso"
            Exit Sub
        End If
    
        ' 1. Instanciação do FSO (Late Binding)
        Set fso = CreateObject("Scripting.FileSystemObject")
    
        ' 2. Definição da Estrutura de Diretórios
        strCaminhoBase = "C:\FastLog_Exportacoes"
        strPastaMes = strCaminhoBase & "\" & Format(Date, "yyyy-mm")
    
        ' Cria o diretório base se não existir
        If Not fso.FolderExists(strCaminhoBase) Then
            fso.CreateFolder strCaminhoBase
        End If
    
        ' Cria o subdiretório do mês se não existir
        If Not fso.FolderExists(strPastaMes) Then
            fso.CreateFolder strPastaMes
        End If
    
        ' 3. Nome do Arquivo com Timestamp
        strNomeArquivo = "MDFE_LOTE_" & Format(Now, "yyyymmdd_hhnnss") & ".csv"
        strCaminhoCompleto = strPastaMes & "\" & strNomeArquivo
    
        ' 4. Criação do Arquivo de Texto (True = Sobrescrever se existir)
        Set arqTexto = fso.CreateTextFile(strCaminhoCompleto, True)
    
        ' Grava o cabeçalho padronizado da SEFAZ
        arqTexto.WriteLine "ID_MANIFESTO;PLACA_VEICULO;MOTORISTA;VALOR_FRETE;DATA_EMISSAO"
    
        ' Varredura das linhas da planilha montando o CSV
        For i = 2 To lngUltimaLinha
            strLinhaCSV = ws.Cells(i, 1).Value & ";" & _
                          ws.Cells(i, 2).Value & ";" & _
                          ws.Cells(i, 3).Value & ";" & _
                          Replace(FormatNumber(ws.Cells(i, 4).Value, 2), ".", "") & ";" & _
                          Format(ws.Cells(i, 5).Value, "yyyy-mm-dd hh:nn:ss")
    
            arqTexto.WriteLine strLinhaCSV
        Next i
    
        ' 5. Fechamento seguro do arquivo no Windows
        arqTexto.Close
        Set arqTexto = Nothing
        Set fso = Nothing
    
        MsgBox "Lote fiscal exportado com sucesso!" & vbCrLf & vbCrLf & _
               "• Arquivo: " & strNomeArquivo & vbCrLf & _
               "• Pasta: " & strPastaMes & vbCrLf & _
               "• Total de Registros: " & (lngUltimaLinha - 1), _
               vbInformation, "FastLog FSO Integration"
    End Sub
  2. Preparação dos Dados no Excel:

    • Na Planilha 1, certifique-se de preencher a tabela de fretes faturados:
      • A1: ID | B1: Placa | C1: Motorista | D1: Valor | E1: Data
      • A2: MDF-101 | BRA2E19 | Carlos Mendes | 4500 | 01/10/2026 14:30:00
      • A3: MDF-102 | ABC1234 | Marcos Fonseca | 2850 | 01/10/2026 15:10:00
  3. Execução:

    • No VBE, pressione F5.
    • Abra o Explorador de Arquivos do Windows (Win + E).
    • Acesse a unidade C:\. Veja a pasta FastLog_Exportacoes criada automaticamente, contendo a subpasta do ano/mês e o arquivo .csv dentro dela!
    • Abra o arquivo no Bloco de Notas: os dados estão perfeitamente formatados com ponto e vírgula!

✅ Resultado Esperado (Prática 1):

O robô cria pastas e arquivos de forma autônoma no disco rígido sem exibir telas do sistema operacional ao operador.


🛠️ Prática Obrigatória 2: Leitura Automatizada de Arquivos Externos

Agora desenvolveremos a rotina reversa: leremos o arquivo recém-gerado linha por linha via método OpenTextFile do FSO e exibiremos o extrato das notas.

Passo a Passo no Computador:

  1. No mesmo módulo, insira o leitor de arquivos texto:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    
    Sub LerArquivoExportado()
        Dim fso As Object
        Dim arqLeitura As Object
        Dim strCaminho As String
        Dim strLinha As String
        Dim lngContador As Long
        Dim strConteudo As String
    
        Set fso = CreateObject("Scripting.FileSystemObject")
    
        ' Solicita ao operador o caminho do arquivo
        strCaminho = InputBox("Digite ou confirme o caminho do arquivo CSV a ser inspecionado:", _
                              "Leitor FSO FastLog", "C:\FastLog_Exportacoes")
    
        If strCaminho = "" Then Exit Sub
    
        ' Se o usuário digitou uma pasta, procura o primeiro arquivo
        If fso.FolderExists(strCaminho) Then
            Dim objPasta As Object, objArq As Object
            Set objPasta = fso.GetFolder(strCaminho)
            For Each objArq In objPasta.Files
                If LCase(fso.GetExtensionName(objArq.Path)) = "csv" Then
                    strCaminho = objArq.Path
                    Exit For
                End If
            Next objArq
        End If
    
        ' Validação de existência do arquivo físico
        If Not fso.FileExists(strCaminho) Then
            MsgBox "Arquivo não localizado no disco: " & strCaminho, vbCritical, "Erro de I/O"
            Exit Sub
        End If
    
        ' 1 = ForReading (Modo Apenas Leitura)
        Set arqLeitura = fso.OpenTextFile(strCaminho, 1)
    
        lngContador = 0
        strConteudo = ""
    
        ' Varre o arquivo linha por linha até o final do fluxo (AtEndOfStream)
        Do While Not arqLeitura.AtEndOfStream
            strLinha = arqLeitura.ReadLine
            lngContador = lngContador + 1
            If lngContador <= 5 Then ' Limita a exibição às primeiras 5 linhas
                strConteudo = strConteudo & "Linha " & lngContador & ": " & strLinha & vbCrLf
            End If
        Loop
    
        arqLeitura.Close
        Set arqLeitura = Nothing
        Set fso = Nothing
    
        MsgBox "ARQUIVO LIDO COM SUCESSO!" & vbCrLf & vbCrLf & _
               "• Caminho: " & strCaminho & vbCrLf & _
               "• Total de Linhas Lidas: " & lngContador & vbCrLf & vbCrLf & _
               "Prévia dos Dados:" & vbCrLf & strConteudo, _
               vbInformation, "Auditoria FSO"
    End Sub
  2. Execute a rotina LerArquivoExportado (F5):
    • O sistema abre o arquivo, lê os registros na velocidade do disco e confirma o número total de linhas lidas.

✅ Resultado Esperado (Prática 2):

O robô realiza operações completas de entrada e saída (I/O), sendo capaz de ler e gravar dados externos sem carregar janelas visuais.


📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_17_VBA_SeuNome_SeuSobrenome.xlsm.
  2. Acesse a plataforma Microsoft Teams.
  3. Abra a tarefa: “VBA - Cap 17: Automação com FileSystemObject (FSO)”.
  4. Anexe sua pasta de trabalho e entregue.

💡 Checkpoint de Gestão & TI

A interoperabilidade com o sistema de arquivos do Windows é a pedra fundamental do Robotic Process Automation (RPA). Em grandes empresas, os sistemas legados de ERP e os órgãos governamentais não se comunicam por planilhas, mas por arquivos planos (flat files) de texto e CSV. Ao dominar o FSO, o desenvolvedor capacita o Excel a agir como uma ponte automática entre a planilha do usuário e os servidores corporativos.


🔥 Desafio de Fixação: Backup Automático da Planilha

Crie a macro de contingência RealizarBackupDiario:

  1. Use o método fso.CopyFile ThisWorkbook.FullName, strDestino, True.
  2. O destino deve ser uma pasta C:\FastLog_Backups\.
  3. O nome do arquivo salvo deve incluir a data atual (ex: Backup_FastLog_20261001.xlsm).
  4. Exiba uma notificação avisando que a cópia de segurança foi gravada com sucesso.

🔑 Revelar Gabarito Oficial de Laboratório (Clique para expandir)
💡 Incentivo Pedagógico: Tente resolver as práticas e o desafio de fixação por conta própria antes de abrir o gabarito. Seus erros e tentativas durante o laboratório são a chave para a consolidação real do aprendizado!

Código Consolidado (modIntegracaoFSO):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
Option Explicit

Sub ExportarLoteFiscalCSV()
    Dim fso As Object
    Dim arqTexto As Object
    Dim ws As Worksheet
    Dim strCaminhoBase As String
    Dim strPastaMes As String
    Dim strNomeArquivo As String
    Dim strCaminhoCompleto As String
    Dim lngUltimaLinha As Long
    Dim i As Long
    Dim strLinhaCSV As String
    
    Set ws = ThisWorkbook.Worksheets(1)
    lngUltimaLinha = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    
    If lngUltimaLinha < 2 Then Exit Sub
    
    Set fso = CreateObject("Scripting.FileSystemObject")
    strCaminhoBase = "C:\FastLog_Exportacoes"
    strPastaMes = strCaminhoBase & "\" & Format(Date, "yyyy-mm")
    
    If Not fso.FolderExists(strCaminhoBase) Then fso.CreateFolder strCaminhoBase
    If Not fso.FolderExists(strPastaMes) Then fso.CreateFolder strPastaMes
    
    strNomeArquivo = "MDFE_LOTE_" & Format(Now, "yyyymmdd_hhnnss") & ".csv"
    strCaminhoCompleto = strPastaMes & "\" & strNomeArquivo
    
    Set arqTexto = fso.CreateTextFile(strCaminhoCompleto, True)
    arqTexto.WriteLine "ID_MANIFESTO;PLACA_VEICULO;MOTORISTA;VALOR_FRETE;DATA_EMISSAO"
    
    For i = 2 To lngUltimaLinha
        strLinhaCSV = ws.Cells(i, 1).Value & ";" & _
                      ws.Cells(i, 2).Value & ";" & _
                      ws.Cells(i, 3).Value & ";" & _
                      Replace(FormatNumber(ws.Cells(i, 4).Value, 2), ".", "") & ";" & _
                      Format(ws.Cells(i, 5).Value, "yyyy-mm-dd hh:nn:ss")
                      
        arqTexto.WriteLine strLinhaCSV
    Next i
    
    arqTexto.Close
    
    MsgBox "Lote exportado com sucesso para: " & strNomeArquivo, vbInformation, "FSO Sucesso"
End Sub

' Desafio de Fixação: Backup Automático
Sub RealizarBackupDiario()
    Dim fso As Object
    Dim strPastaBackup As String
    Dim strArquivoDestino As String
    
    Set fso = CreateObject("Scripting.FileSystemObject")
    strPastaBackup = "C:\FastLog_Backups"
    
    If Not fso.FolderExists(strPastaBackup) Then fso.CreateFolder strPastaBackup
    
    strArquivoDestino = strPastaBackup & "\Backup_FastLog_" & Format(Now, "yyyymmdd_hhnnss") & ".xlsm"
    fso.CopyFile ThisWorkbook.FullName, strArquivoDestino, True
    
    MsgBox "Backup de contingência concluído com sucesso!" & vbCrLf & strArquivoDestino, _
           vbInformation, "Segurança FastLog"
End Sub

📝 Atividade Extra: Questionário de Fixação (Caderno)

Instruções: Responda no caderno, de próprio punho, as 10 perguntas abaixo com base no que você estudou neste capítulo. Ao concluir, apresente o caderno ao professor para visto.

  1. O que representa a biblioteca Scripting.FileSystemObject (FSO) e qual é a sua utilidade em automações de escritório?
  2. Por que utilizamos a abordagem de Ligação Tardia (Late Binding) com CreateObject("Scripting.FileSystemObject")?
  3. Qual método do FSO utilizamos para verificar se um diretório já existe antes de criá-lo?
  4. Como funciona o método CreateFolder e o que ocorre se tentarmos criar uma pasta que já existe?
  5. Qual é o papel do segundo parâmetro booleano (True) no método fso.CreateTextFile(caminho, True)?
  6. O que o método WriteLine faz ao gravar dados em um arquivo de texto?
  7. Por que é estritamente obrigatório chamar o método .Close ao terminar de manipular um arquivo de texto?
  8. No Cenário da FastLog, por que o arquivo CSV foi gerado com separador de ponto e vírgula (;) em vez de vírgula (,)?
  9. Como a propriedade AtEndOfStream é utilizada no laço Do While durante a leitura de arquivos externos?
  10. No Desafio de Fixação, qual método do FSO foi empregado para duplicar a pasta de trabalho atual como backup?