Tag Archives: FileSystemObject

VBA – Lendo um arquivo texto linha a linha (sem FileSystemObject)


Bom, como falei sobre o mesmo problema outro dia em C#, nada mais justo do que publicar em VBA também, até porque a dúvida surgiu no fórum também.

A rotina abaixo faz o trabalho de abrir e ler uma arquivo no formato texto linha a linha. A idéia é permitir alterar o código de tal forma que se for preciso fazer uma análise do conteúdo da linha, fica fácil de fazer:

Option Explicit
 
Public Sub LeArquivoTexto()
    Dim Arquivo As Integer
    Dim CaminhoArquivo As String
    Dim TextoArquivo As String
    Dim TextoProximaLinha As String
    Dim ContadorLinha As Long
 
    'Configura a leitura do arquivo
    Arquivo = FreeFile
    CaminhoArquivo = "C:\temp\arquivo.txt"
 
    'Abre o arquivo para leitura
    Open CaminhoArquivo For Input As Arquivo
    ContadorLinha = 1
    'Lê o conteúdo do arquivo linha a linha
    Do While Not EOF(Arquivo)
        Line Input #Arquivo, TextoProximaLinha
        TextoProximaLinha = TextoProximaLinha & vbCrLf
        TextoArquivo = TextoArquivo & TextoProximaLinha
    Loop
 
    'Coloca na janela de verificação imediata
    Debug.Print TextoArquivo
 
    'Fecha o arquivo
    Close Arquivo
 
End Sub

Como destacado no título do arquivo, a vantagem deste método, apesar de menos legível, é não precisar carregar a dependência da biblioteca do FileSystemObject, usando somente os recursos padrão do Visual Basic.

Bom proveito!

Verificando a existência de um arquivo no VBA

Mais uma função muito difundida na maior parte das linguagens de programação, mas carece de uma representante no VBA.

Existem duas alternaticas possíveis para efetuar a tarefa:

Usando as funções padrão do VBA como no exemplo abaixo onde existe a tentativa de abrir um arquivo com a funçao Open, causando um erro caso o arquivo não existir

1
2
3
4
5
6
7
8
9
Function TestaExistenciaArquivo(filename)
    Dim f
    'captura qualquer erro que ocorrer
    On Error Resume Next
    f = FreeFile
    Open filename For Input As #f
    Close #f
    TestaExistenciaArquivo = Not (Err <> 0)
End Function

Confesso que não sou muito adepto deste tipo de abordagem. Apesar da exisitência de um mecanismo de controle de erros, forçar sua utilização geralmente implica na criação de um contexto não muito adequado para programar, além dos desvios necessários para esse tipo tratamento.

A segunda alternativa é usar a biblioteca Microsoft Scripting Runtime e o objeto FileSystemObject e suas funções. O mesmo já possui uma função chamada FileExists (nada mais claro não?) que retorna True se o arquivo existir e False do contrário:

1
2
3
4
5
6
Function TestaExistenciaArquivo(ByVal caminhoArquivo As String)
    Dim retorno As Boolean
    Set FSO = New FileSystemObject
    retorno = FSO.FileExists(caminhoArquivo)
    TestaExistenciaArquivo = retorno
End Function

O código é bem explicativo, até porque o nome das funções refletem exatamente sua ação.

Para testar as duas funções, basta criar uma macros que as chamem ou colocar a função em uma célula, por exemplo:

=TestaExistenciaArquivo(“C:\temp\arquivo.txt”)

Bom proveito!

Abraços

Tomás Vásquez
www.tomasvasquez.com.br

Mais sobre FileSystemObject

Outro dia publiquei uma dica sobre como obter informações de um Drive com a bilbioteca FileSystemObject com o VBA.

Porém, gostaria de reforçar que a bilbioteca vai muito além disso, passando por tratamento de arquivos, pastas e suas propriedades.

Um artigo completo sobre o assunto pode ser visto neste link:

http://www.macoratti.net/filesyst.htm

Mais uma obra do mestre Macoratti.

Abraços

Tomás Vásquez
http://www.tomasvasquez.com.br

Obtendo informações de um drive no VBA

Colaboração do camarada Robert Martin (http://br.msofficegurus.com/), postou uma dica muito bacana sobre como obter informações de um drive usando o VBA. A função abaixo por exemplo retorna o número de série de um drive baseado em sua letra de referência:

Function SerialPD(ByVal DriveLetter As String) As String
    Dim oFso As New FileSystemObject
    Dim oDrive As Drive
 
    If oFso.DriveExists(DriveLetter) Then
        Set oDrive = oFso.GetDrive(DriveLetter)
        SerialPD = Left(Hex(oDrive.SerialNumber), 4) & "-" & Right(oDrive.SerialNumber, 4)
    Else
        SerialPD = "Drive especificado nao existe."
    End If
 
    Set oDrive = Nothing
    Set oFso = Nothing
 
End Function

É necessária a referência à biblioteca Microsoft Scripting Runtime. No código, o objeto oDrive representa o Drive, que além da propriedade SerialNumber utilizada no código, possui outras como espaço livre, capacidade e sistema de arquivos. Uma documentação completa da biblioteca pode ser vista no site MSDN:

http://msdn.microsoft.com/en-us/library/bkx696eh%28VS.85%29.aspx

Bom proveito e valeu Robert!

Tomás Vásquez
http://www.tomasvasquez.com.br