Arquivos de Texto


Arquivos de texto são uma fonte comum para para armazenar e transportar informações.

Neste tópico será abordado acesso, principais funções e maneiras de importar e exportar estes dados com VBA.


VBA Open

Para realizar tarefas com um arquivo de texto no VBA é preciso, primeiramente, acessá-lo. Faremos isso através da instrução Open.

Open exige parâmetros para:

    Open LocaldoArquivo For Modo As #NumerodoArquivo

Cada um destes parâmetros será detalhado a seguir.


Local do Arquivo

Pode-se atribuir o local do arquivo de duas formas:

    LocaldoArquivo = "C:\teste\banco-de-dados.txt" 'Diretamente pelo caminho das pastas

    LocaldoArquivo = Application.GetOpenFilename() 'Através da caixa de diálogo selecionando o arquivo

A primeira forma é utilizada quando o caminho não altera constantemente. Já a segunda dá a liberdade, a cada execução, para se escolher um caminho diferente.

Ambas as formas resultarão em LocaldoArquivo associada a uma String do local do arquivo.


Modo de acesso

O modo de acesso deve ser substituído por um dos seguintes comandos:

Output - Utilizado para gravar conteúdo do Excel para o arquivo de texto (substituindo um antigo, caso existir)

Input - Utilizado para ler o arquivo
Append - Utilizado para adicionar conteúdo a um arquivo (sem substituí-lo, caso existir)
Binary - Utilizado para ler e gravar dados em formato de byte
Random - Utilizado para colocar caracteres de um tamanho definido

O foco deste tutorial será apenas em: Input (importar) e Output (exportar).


Número do Arquivo

Cada arquivo aberto no VBA deve ser associado a um número entre 1 e 511 precedido de hashtag #. Normalmente se inicia no #1 e segue sucessivamente para #2, #3, etc.

Utilize a função FreeFile() para obter o próximo número de arquivo disponível. Se nenhum estiver em uso, FreeFile() retornará 1.


Testando Instrução Open

O código a seguir acessará o arquivo que for selecionado com Application.GetOpenFilename()

Sub TesteOpen()

    Dim LocalArquivo As String

    LocalArquivo = Application.GetOpenFilename()
    'Abre a caixa de diálogo para selecionar o arquivo

    'Repare que LocaldoArquivo será uma String de caminho E.g. "C:\..."

    Dim NumArquivo As Integer

    NumArquivo = FreeFile() 'Atribui o primeiro número de arquivo disponível (E.g.: #1)

    Open LocalArquivo For Input As #NumArquivo

    Close #NumArquivo 'Fecha o arquivo (o número em NumArquivo poder ser reutilizado)
End Sub

Apesar do acesso, nenhuma informação foi importada ou exportada. Para realizarmos estas ações, precisaremos do auxílio das funções Input e Output respectivamente.


Importar Arquivo de Texto

Para importar conteúdo de um arquivo de texto para o Excel utilizaremos um arquivo exemplo chamado "banco-de-dados.txt" e a função Input:

Banco TXT
Sub ImportarSimples()

    Dim LocalArquivo As String

    LocalArquivo = Application.GetOpenFilename()
    'Abre a caixa de diálogo para selecionar o arquivo

    'Repare que LocaldoArquivo será uma String de caminho Ex. "C:\...\banco-de-dados.txt"

    Dim NumArquivo As Integer

    Open LocalArquivo For Input As #1 'Arquivo será associado ao #1

    PrimeiroCaractere = Input(1, #1) 'Coleta 1 caractere do arquivo #1
    SegundoCaractere = Input(1, #1) 'Coleta mais 1 caractere, sendo este o próximo (o 2° neste caso)

    MsgBox PrimeiroCaractere
    MsgBox SegundoCaractere

    Close #1 'Fecha o arquivo (para o número #1 poder ser reutilizado)
End Sub
MsgBox A
MsgBox q

Para coletar todos os caracteres de uma só vez podemos utilizar a função LOF:

Sub ImportarLOF()

    Dim LocalArquivo As String

    LocalArquivo = Application.GetOpenFilename()
    'Abre a caixa de diálogo para selecionar o arquivo

    'Repare que LocaldoArquivo será uma String de caminho E.g. "C:\..."

    Dim NumArquivo As Integer

    Open LocalArquivo For Input As #1 'Arquivo será associado ao #1

    MsgBox LOF(1)  'Quantidade total de caracteres do arquivo #1

    TodosCaracteres = Input(LOF(1), #1) 'Coleta todos caractere do arquivo #1

    MsgBox TodosCaracteres

    Close #1 'Fecha o arquivo (para o número #1 poder ser reutilizado)
End Sub

LOF retorna o número de bytes do arquivo aberto com Open. Como se trata de um arquivo de texto, cada byte é correspondente a um caractere. Sendo assim, o número de bytes será igual ao número de caracteres.

Para importar os dados para planilha podemos utilizar o código a seguir:

Sub ImportarTexto ()
    Dim LocaldoArquivo As String
    Dim NumArquivo As Integer
    Dim Dadosdetexto As String
    Dim QuebraLinha as Variant
    Dim UltLinha as Integer
    Dim PrimLinha as Integer

    'Abre a caixa de diálogo para selecionar o arquivo
    LocaldoArquivo = Application.GetOpenFilename()
    'Ou indique um caminho com LocaldoArquivo = "C:\LOCAL_DO_ARQUIVO\banco-de-dados.txt"

    NumArquivo = FreeFile() ' Atribui o primeiro número de arquivo disponível (E.g.: #1)

    Open LocaldoArquivo For Input As #NumArquivo 'Abre o arquivo em modo de leitura

    'Passar o Conteúdo para Planilha---
    Dadosdetexto = Input(LOF(NumArquivo), NumArquivo) 'Carrega todo conteúdo do arquivo na variável
    QuebraLinha = Split(Dadosdetexto, vbCrLf) 'Cria um vetor com cada linha do arquivo 
    UltLinha = UBound(QuebraLinha) 'Determina a última linha do vetor
    PrimLinha = LBound(QuebraLinha) 'Determina a primeira linha do vetor
    'Transpõem os vetores para a planilha 
    Range("A1").Resize((UltLinha) - (PrimLinha) + 1).Value = Application.Transpose(QuebraLinha)
    '----------------------------------
    Close #NumArquivo 'Fecha o arquivo (para o número em NumArquivo poder ser reutilizado)
End Sub

vbCrLf é referente ao caractere não visível CrLf que indica quebra de linha do arquivo.


Principais Funções Relacionadas a Open

Função Descrição
FreeFile Retorna o próximo número disponível para a declaração Open. Importante ao trabalhar com múltiplos arquivos.
BOF Retorna True caso esteja no começo do arquivo definido com #número.
EOF Retorna True caso tenha terminado a leitura do arquivo definido com #número.
LOF Retorna o tamanho em bytes do arquivo definido com #número.
Loc Retorna a posição atual de leitura e escrita para a declaração Open.

BOF e EOF auxiliam na construção de Loops quando se deseja trabalhar caractere por caractere, ou linha por linha.

Caractere por caractere

    'Coletar de um em um
    Caracteres = Input(1, #1) 'Coleta 1 caractere do arquivo #1
    Caracteres = Caracteres & Input(1, #1) 'Coleta mais 1 caractere, sendo este o próximo
    Caracteres = Caracteres & Input(1, #1) 'Coleta mais 1 caractere, sendo este o próximo
    '...

Loop com auxílio do EOF

    'Loop com auxílio de EOF
    Caracteres = ""
    Do While Not EOF(1)
        Caracteres = Caracteres & Input(1, #1)
    Loop

Loop com auxílio do BOF

    'Uma outra forma com BOF
    Do While BOF(1)
        Caracteres = Caracteres & Input(1, #1)
    Loop

Exportar Arquivo de Texto

Para exportar conteúdo da planilha para um arquivo de texto:

Sub ExportarTexto()

    Dim Ultlinha As Long
    Dim UltColuna As Long
    Dim NovoArquivo As String
    Dim NumArquivo As Integer
    Dim DadoCell As Variant

    NumArquivo = FreeFile ' Atribui o primeiro número de arquivo disponível (E.g.: #1)

    'Determina a última linha da planilha com dados
    Ultlinha = Cells(Rows.Count, 1).End(xlUp).Row

    'Determina a última coluna da planilha com dados
    UltColuna = Cells(1, Columns.Count).End(xlToLeft).Column
    NovoArquivo = "C:\Teste\Exportado.txt" 'Utilize uma pasta já existente

    'Exporta os dados da planilha para o arquivo criado
    Open NovoArquivo For Output As #NumArquivo
    For i = 1 To Ultlinha
        For j = 1 To UltColuna
            If j = UltColuna Then
                DadoCell = DadoCell & Cells(i, j).Value
            Else
                DadoCell = DadoCell & Cells(i, j).Value & " "
            End If
        Next j
        Print #NumArquivo, DadoCell
        DadoCell = ""
    Next i
    Close #NumArquivo 'Salva e fecha o arquivo de texto com os dados
End Sub

Caso a pasta que você esteja salvando o arquivo ainda não exista, irá ocorrer um erro.


Arquivo CSV

Um arquivo .csv (Comma Separated Values ou em português: Valores delimitados por vírgula), como o nome sugere, é um arquivo de texto no qual os itens de cada linha estão separados por vírgulas, delimitando o que deve ir em cada coluna.

Exemplo CSV

É um tipo muito comum de arquivo, e como cada linha refere-se, diversas vezes, a múltiplas colunas, pode necessitar um tratamento com auxílio de loops e funções, como BOF e EOF.


Importar Arquivo CSV

Para facilitar a importação, utiliza-se a instrução Line Input (que funciona linha por linha), ao invés de apenas Input (que funciona caractere por caractere).

Sub AbrirTextoCSV()
    Dim LocaldoArquivo As String
    Dim NumArquivo As Integer
    Dim LinhaDoArquivo As String
    Dim ItemDaLinha As Variant
    Dim UltLinha As Long

    'Abre a caixa de diálogo para selecionar o arquivo
    LocaldoArquivo = Application.GetOpenFilename()
    'Ou indique um caminho Ex: LocaldoArquivo = "C:\teste\banco-de-dados.txt"

    NumArquivo = FreeFile ' Atribui o primeiro número de arquivo disponível (Ex: #1)

    Open LocaldoArquivo For Input As #NumArquivo 'Abre o arquivo em modo de leitura

    Do Until EOF(NumArquivo)
        Line Input #NumArquivo, LinhaDoArquivo 'Coleta a linha inteira e associa a LinhaDoArquivo
            ItemDaLinha = Split(LinhaDoArquivo, ", ")
            i = i + 1
            UltLinha = UBound(ItemDaLinha)
            For j = 1 To UltLinha + 1
                Cells(i, j).Value = ItemDaLinha(j - 1)
            Next
    Loop

    Close #NumArquivo
End Sub

Exportar Arquivo CSV

Similar a exportação de texto, porém obrigatório a utilização de ", " na separação dos elementos.

Sub GravarTextoCSV()

    Dim Ultlinha As Long
    Dim UltColuna As Long
    Dim NovoArquivo As String
    Dim NumArquivo As Integer
    Dim DadoCell As Variant

    NumArquivo = FreeFile ' Atribui o primeiro número de arquivo disponível (Ex: #1)

    'Determina a última linha da planilha com dados
    Ultlinha = Cells(Rows.Count, 1).End(xlUp).Row

    'Determina a última coluna da planilha com dados
    UltColuna = Cells(1, Columns.Count).End(xlToLeft).Column
    NovoArquivo = "C:\Teste\Exportado.csv" 'Utilize uma pasta já existente

    'Exporta os dados da planilha para o arquivo criado
    Open NovoArquivo For Output As #NumArquivo
        For i = 1 To Ultlinha
            For j = 1 To UltColuna
                If j = UltColuna Then
                    DadoCell = DadoCell & Cells(i, j).Value
                Else
                    DadoCell = DadoCell & Cells(i, j).Value & ", " 'Necessário ", "
                End If
            Next j
            Print #NumArquivo, DadoCell
            DadoCell = ""
        Next i
    Close #NumArquivo 'Salva e fecha o arquivo de texto com os dados
End Sub

Caso a pasta que você esteja salvando o arquivo ainda não exista, irá ocorrer um erro.



SuperExcelVBA.com é um site voltado ao aprendizado de VBA. Exemplos e explicações podem ter sido simplificados para maior e mais veloz compreensão. Estamos constantemente nos atualizando e corrigindo erros, porém não existe garantia sobre o conteúdo disponível no site. Todos os direitos reservados.

Excel ® é uma marca registrada da Microsoft Corporation.

© 2019 SuperExcelVBA | SOBRE

Protected by Copyscape