4/28/2008

Lendo arquivos de texto com VBA

Vou escrever uma função em VBA, bem "bobinha".

Sem problema, sem programa.


Primeiro, vamos "criar" um problema para resolver. Vamos supor que temos que ler um arquivo de texto e exibir cada linha lida, abaixo:

0200804131200
10011122233311
11044455566622
10077788899933
2200800039999


Note que a primeira linha e a última são diferentes das demais, elas se chamam HEADER e TRAILER respectivamente, elas identificam o início e op fim de um arquivo a ser lido (geralmente são opcionais). A primeira coluna identifica o tipo de dado do registro, neste caso 0 é o header, 1 são os dados e 2 o trailer. O header informa ainda a data e o horário do arquivo.
O objetivo desse código é apenas ler o arquivo, o header e o trailler serão usados em outro programa, mas isso fica para outro post.

Mãos a obra


Primeiro criamos uma sub LerArquivo:

Sub LerArquivo()

End Sub


Só para constar a diferença entre uma SUB e FUNCTION, é que a sub não nunca retorna valor, já uma fuction pode ou não retornar algum valor.

Vamos precisar de uma variável do tipo string para guardarmos as linhas coforma forem lidas.

Dim lin As String

Antes de ler de fato um arquivo é necessário abrir o arquivo, em VBA a função que faz isso é a Open, mas este comando não "anda" sozinho, é necessário informar o que será feito com esse arquivo, no nosso caso iremos apenas ler, portanto o devemos completar o comando com For Input As #N, onde N é um número que identifica os arquivos abertos.

Open "D:\Temp\Arquivo.txt" For Input As #1

Agora a leitura do arquivo propriamente dito, devemos usar um loop para fazer a leitura e exibir cada linha, enquanto o arquivo não chega ao fim.

Do While Not EOF(1)
Line Input #1, lin
Debug.Print lin
Loop


Não esqueça que depois de abrir e usar um arquivo é necessário fechá-lo:

Close #1

Veja o código completo como deve ficar:

Código completoSub LerArquivo()
Dim lin As String
Open "D:\Temp\Arquivo.txt" For Input As #1
Do While Not EOF(1)
Line Input #1, lin
Debug.Print lin
Loop
Close #1
Debug.Print "Fim =D"
End Sub


Até a próxima... se a terra não tremer de novo!

NMHO.

4/22/2008

Variáveis tipificadas dinamicamente em VBA

"Tipificar ou Não tipificar? Eis a questão!" -- Ok! Eu sei que essa paródia não tem graça, mas eu não resisti.


Apesar da piada, a dúvida é honesta. Das linguagens que eu conheço as duas que permitem são Visual Basic, Python e linguagens de script, e das as que não permitem, C# e Java. Depois de uma análise criteriosa, levando em consideração os paradigmas envolvidos chequei a conclusão que ... tanto faz (olha a piada boba ai de novo).

Na prática, não acho que esse seja um debate muito relevante (apesar de comum), porque no final, com variavel tipificada ou não, o programador sempre vai esquecer daquela vírgula, daquele ponto e algum lugar do código. Acho que o importante é conhecer e praticar sempre a sua linguagem preferida ou a que garante o leitinho das crianças. E por falar em leitinho das crianças, vou mostrar dar um exemplo em VBA.

Mãos a obra


Primeiro exemploSub StringNaoTipada_Soma_Integer()
Dim nt
Dim i As Integer
nt = "2"
i = 3
Debug.Print nt + i
End Sub


Neste primeiro exemplo a variável nt não teve o tipo de dados declarado (Variant/Empty), ao receber o número 2 entre aspas, o interpretador assume que a variável é uma Variant/String, quer ver? Na IDE do VBA, abra a janela "Variáveis locais" que está no menu Exibir e execute o código novamente, mas use o F8 para executar passo-à-passo, e observe a coluna "Tipo" dessa janela.

Segundo exemploSub IntegerNaoTipada_Soma_String()
Dim nt
Dim s As String
nt = 2
s = 3
Debug.Print nt + s
End Sub


Mais um exemplo mas com os tipos trocados dessa vez, o resultado é o mesmo.

Terceiro exemploSub StringNaoTipada_Soma_String()
Dim nt
Dim s As String
nt = "2"
s = 3
Debug.Print nt + s
End Sub



Enfim, é isso ai, pe-pes-soal.

4/16/2008

Diferença entre Option Compare Database e Option Explicit no VBA

Quando criamos um módulo e deixarmos o padrão Option Compare Database, o interpretador do VBA não vai exigir que as variáveis sejam declaradas e vai executar o códico do jeito que estiver, por exemplo:

código 1Option Compare Database
Sub contar()
i = 2
j = 3
Debug.Print i + j
End Sub


Como você pode ver, funciona, mas em um código muito grande pode ser difícil depurar os erros. Agora se declaramos que ele será Option Explicit, o interpretador só vai executar o código se todas as variáveis já estiverem explicitamente declaradas, por exemplo:

código 2Option Explicit
Sub contar()
Dim i
Dim j
i = 2
j = 3
Debug.Print i + j
End Sub


Até a próxima!

Atualização: "Dam You Copy and Cut!" Desculpe pessoal a primeira linha do segundo bloco de código estava errada.

NMHO.

4/14/2008

Suporte para notebook por 30 reais

Ainda não publiquei um review sobre a minha nova aquisição, um Dell Vostro 1000, contudo antes do notebook ser entregue eu resolvi improvisar um suporte, afinal, não tenho filhos ainda e não quero ter os meus "ovos" cozidos.

Material e Ferramentas


Primeiro eu aproveitei as grades de prateleiras (aquelas usadas em balcões de lojas), é o mesmo tipo de grade que usei para organizar os cabos na parte de trás da minha mesa.


Compre também um metro de mangueira. Eu preferi uma mangueira de gás, porque esse tipo de mangueira é mais espessa e mais firme.


Lacres pequenos (também conhecidos como "enforca gato"), vamos usá-los para montar o suporte. Quem quiser reproduzir essa "maluquice", pode usar arames também, mas eu achei os lacres mais práticos.


As ferramentas foram: estilete, serra de metal, lima e fita isolante.



Mãos à obra


Serre uma das grades e de forma a ficar apenas uma coluna de "quadradinhos". Use a lima para deixar corrigir as pontas serradas.


Se achar necessário use a fita isolante para proteger os cantos. No meu caso, as grades não tinha os cantos soldados, por isso usei a fita para melhorar a estrutura.


Use os lacres para unir as grades. Procura cruzar o lacre para que ele não fique deslizando na grade.


O objetivo é montar um triângulo, como na próxima foto.


Depois corte a mangueira em 3 partes da largura da grade.


Depois faça um corte nos pedaços da mangueira seguindo este esquema, um corte transversal e pequenas elipses onde ficam os arames da grade. Eu montei um esquema (fora de escala) de como devem ser os cortes.


IMPORTANTE: Essa parte é sem sombra de dúvidas a mais demorada, a mais chata e a mais perigosa do "projeto".
Coloque as mangueiras em cada ângulo do triângulo. Elas vão servir para não machucar quem usar se resolver colocar o suporte no colo e também como anti-derrapantes se for usar o notebook em uma mesa.



Bom, este é o resultado final. Não fica uma maravilha, mas ficou bem menos feio do que eu esperava. Quando uso o notebook sentado na cama, eu até sinto a temperatura aumentar, mas não tem comparação quando faço isso sem o suporte. Realmente quebra um galho até eu poder comprar um suporte descente.


Atualização: Eu não me lembrava de onde tinha tirado essa idéia, eu até procurei no LifeHacker e mas não encontrei. Mas é claro que eu não iria achar! Eu tinha visto isso no Efetividade.net, não no LifeHacker.

Até a próxima...

Interessado em aprender mais sobre o Ubuntu em português?