0232 – Manipulando arquivos txt via VBA – Parte 2

Bom dia, retomando o assunto do nosso post (0227 – Manipulando arquivos txt via VBA – Parte 1) vimos como criar, copiar e apagar arquivos txt utilizando o VBA.

Hoje vamos aprender a extrair dados de arquivos txt cujas informações estejam estruturadas, ou seja, organizadas por colunas que são separadas entre si por um caractere específico, que normalmente é uma vírgula ou uma tabulação.

Eis um exemplo típico de arquivo txt separado por tabulações e que usaremos como ponto de partida.

Exemplo de Arquivo txt - Fonte IBGE

Exemplo de Arquivo txt – Fonte IBGE

Os dados representam as informações referentes ao censo de 2010 para os estados brasileiros: População, Área, Densidade demográfica e Número de municípios.

O nosso objetivo é ler as linhas do arquivo txt e transferir o conteúdo para células de planilha.

Para isso iniciaremos com esse código aqui:

Sub ImportTxtFile()
Dim strTextLine
Dim strTextFile
Dim intFileNumber

'Nome completo do arquivo a ser aberto
strTextFile = "C:\USERS\ADILSON\DESKTOP\0231TXT.TXT"

'Criar numeração
intFileNumber = 1

'Criar conexão com o arquivo txt
Open strTextFile For Input As #intFileNumber

'Loop para percorrer as linhas do arquivo até o seu final
Do While Not EOF(intFileNumber)
   Line Input #intFileNumber, strTextLine
Loop

'Fechar a conexão com o arquivo
Close #intFileNumber

End Sub

Compreendendo o código:

Variáveis

  • strFileName é uma varíavel do tipo String para armazenarmos o nome completo do arquivo do qual extrairemos os dados.
  • intFileNumber é uma variável do tipo Integer que armazenará um número inteiro que servirá de referência para o arquivo. Se houver necessidade de referenciar vários arquivos, cada um deverá receber a sua numeração.
  • strTextLine é uma variável do tipo String, para a qual serão transferidas as informações da linha de texto do arquivo conectado

Instruções:

Open strTextFile For Input As #intFileNumber

Essa linha representa a criação de uma conexão de entrada de dados com o arquivo especificado em strTexFile e numerada como intFileNumber

Do While Not EOF(intFileNumber)
Line Input #intFileNumber, strTextLine
Loop

Esse Loop irá percorrer todas as linhas do arquivo indexado como intFileNumber. A cada linha será transferida a informação encontrada para a variável strTextFile. O Loop será interrompido ao chegar ao final do arquivo (EOF: End Of File, em tradução literal: Final do Arquivo).

Close #intFileNumber

É fechada a conexão com o arquivo indexado. A variável está livre e pode indexar outro arquivo se houver necessidade.

Essa estrutura é básica e pode ser utilizada como alicerce para qualquer código similar.

No entanto, observem que as informações estão sendo apenas lidas. Não houve a transferência para nenhum outro local.

Se executarmos o código sobre o arquivo exemplo, a primeira linha retornará:

"REGIÃO  ESTADO  SIGLA   CAPITAL POPULAÇÃO   ÁREA (Km2)  DENS DEMOGR (hab/km2)   Nº MUNICÍPIOS   FONTE"

Ou seja, conforme esperado, os rótulos dos campos de dados, separados por tabulações.

Se transferirmos os dados desta forma para um célula do Excel, teremos que, em seguida, separar os dados distribuindo-os pelas diferentes colunas.

Para evitarmos isso, vamos utilizar a função Split. Essa função divide o conteúdo de um texto em diferentes partes, indicado um caractere de separação. No nosso exemplo, os elementos estão separados por tabulações. Deste modo, a linha de comando a ser utilizada é:

strSplitedLine = Split(strTextLine, vbTab)

Através dessa linha, os diferentes valores serão separados como elementos de uma matriz chamada strSplitedLine.

Para percorrer os elementos dessa matriz, iremos lançar mão de outro loop.

Cuidados adicionais:

A segunda linha do arquivo txt contém uma sequência de caracteres “=”. Se tentarmos utilizar a linha de comando acima isso irá gerar um erro. Portanto temos que evitar que essa linha seja importada

Os campos possuem diferentes tipos de variáveis:

REGIÃO, ESTADO, SIGLA, CAPITAL e FONTE são textos

POPULAÇÃO e Nº DE MUNICÍPIOS são números inteiros

ÁREA (Km2) e DENS DEMOGR (hab/km2) são valores decimais

Desta forma teremos que lidar com esses dados de formas diferentes ao importá-los para a planilha. Os dados na forma de texto não precisam de cuidados adicionais, mas utilizaremos as funções CLng e CDbl, para importar respectivamente os dados inteiros e decimais. (Utilizamos CLng ao invés de CInt para evitar possibilidade de estouro de capacidade da variável)

Feitas essas considerações e designada a planilha OUTPUT para receber os dados, chegamos a essa versão final do código.

Option Explicit
Sub ImportTxtFile()

Dim strTextLine         As String
Dim strTextFile         As String
Dim strSplitedLine()    As String
Dim intFileNumber       As Integer
Dim intElementCount     As Integer
Dim lngRowCount         As Long
Dim wksOutput           As Worksheet
Dim varFieldValue       As Variant


'Nome completo do arquivo a ser aberto
strTextFile = "C:\USERS\ADILSON\DESKTOP\0231TXT.TXT"

'Criar numeração
intFileNumber = 1

'Criar conexão com o arquivo txt
Open strTextFile For Input As #intFileNumber

'Contador de linhas de planilha
lngRowCount = 1

'Definir a planilha que receberá as informações
Set wksOutput = ThisWorkbook.Sheets("OUTPUT")

'Loop para percorrer as linhas do arquivo até o seu final
Do While Not EOF(intFileNumber)
    
    'Transferir as informações para a variável strTextLine
    Line Input #intFileNumber, strTextLine
    
    'Evitar a importação da linha de separação com sinais "="
    If Left(strTextLine, 1)  "=" Then
        
        'Transferir o elementos de strTextFile para a matriz strSplitedLine
        strSplitedLine = Split(strTextLine, vbTab)
        
        'Percorrer os elementos da matriz strSplitedLine
        For intElementCount = LBound(strSplitedLine) To UBound(strSplitedLine)
                
                'Testar se é diferente da primeira linha
                If lngRowCount  1 Then
                    'Se ocorrer um erro continuar a execução
                    On Error Resume Next
                    'Determinar o que deve ser feito com base no campo importado
                    Select Case intElementCount
                    Case 5, 6
                    varFieldValue = CDbl(strSplitedLine(intElementCount))
                    Case 4, 7
                    varFieldValue = CLng(strSplitedLine(intElementCount))
                    Case Else
                    varFieldValue = strSplitedLine(intElementCount)
                    End Select
                Else
                    'Importação da primeira linha
                    varFieldValue = strSplitedLine(intElementCount)
                End If
            'Transferir o conteúdo do elemento de strSplitedLine para as linhas de wksOutput
            wksOutput.Cells(lngRowCount, 1).Offset(0, intElementCount) = varFieldValue
        Next intElementCount
        
        'Incrementar o contador de linhas
        lngRowCount = lngRowCount + 1
    
    End If
Loop

'Fechar a conexão com o arquivo
Close #intFileNumber

End Sub

Como há infinitas possibilidades de arranjos para os dados é importante entender o que cada etapa do código realiza e adaptar os comandos de acordo com as suas necessidades.

 

 

 

 

 

In Excel We Trust

Marcado com: , , , , ,
Publicado em Excel, Nível: Avançado

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

Visitas dos usuários
  • 1,969,548

Clique para assinar este blog e receber notificações de novos artigos por email.

Junte-se a 1.477 outros seguidores

Aumente sua interação

Siga-nos do twitter (@usuariosdoexcel).

Acesse o nosso fórum e compartilhe as suas dúvidas.

Curta nossa página no Facebook.

Junte-se ao grupo do LinkedIn.

Visite-nos utilizando o seu smartphone ou tablet.

Recomende este Blog
Visualizar notícias
Site monitorado:
Real Time Web Analytics

Clicky

%d blogueiros gostam disto: