domingo, 3 de novembro de 2013

CURSO DE PROGRAMAÇÃO VBA PARA EXCEL


1. INTRODUÇÃO


Com frequência, somos confrontados em nosso dia-a-dia por obstáculos, que nos parecem intransponíveis. Apesar de ser um recurso extremamente útil e versátil, o excel não consegue resolver sozinho todas as tarefas que os ambientes empresariais exigem. Isto porque, mesmo com tantos recursos, tais como fórmulas, calculos automáticos, tabelas dinâmicas, etc, existem tarefas repetitivas que demandam muito tempo e procrastinam a vida de seus executores.

Atualmente, a programação VBA tem se tornado cada vez mais conhecida e aprendida por usuários experientes do excel, que precisam criar soluções inteligentes e rapidas para solucionar problemas rotineiros. No mesmo sentido, muitos Microempresários, estão lançando mão dessa poderosa ferramenta para gerenciar suas atividades com maior eficiência, buscando assim, vantagem competitiva no mercado em que atuam.

Com o objetivo de auxiliar os interessados em compreender essa linguagem de programação, descreveremos os conceitos mais importantes e necessários ao seu aprendizado, desde os conceitos básicos, até aspectos avançados.

2. ALGORÍTIMOS

A palavra "ALGORÍTIMO" costuma amedrontar algumas pessoas. Algumas pessoas tiveram um infeliz contato com o significados desta palavra. Não se preocupe, são apenas temores infundados.

Na realidade, os algorítimos não passam de uma receita(como de bolo). São apenas uma sequencia lógica e detalhada de acões, que sendo executadas corretamente realizarão a tarefa desejada.

Diante do exposta, fica fácil entender que os algorítimos fazem parte de nossa vida cotidiana. Imagine a seguinte situação hipotética:

Você está deitado em sua cama numa tarde de sábado, vendo aquele filminho que locou pela manhã após o futebol cansativo. De repente, lembra-se dos tempos do cineminha com sua ex-namorada que te deu o fora. Apesar da tristeza da perda, você se lembrou daquela deliciosa pipoquinha com sal que sempre acompanhava as sessões(ou seria seções?!), não interessa, sei que entendeu; então resolve fazer a pipoca, porém, para isso, precisa seguir alguns passos. Eis o algoritmo.

2.1. Algorítimo para fazer pipocas.

2.1.1. Chega de preguiça, levante-se da cama(se for preciso, faça um alongamento) e não se esqueça de pausar o filme.
2.1.2. Calçe o chinelo e dirija-se à cozinha.
2.1.3. No armário, pegue a pipoqueira(se não tiver, se vira meu!)
2.1.4. Vá até a dispensa e pegue o milho de pipoca(se não houver, continue a leitura, caso contrário, pule para o item 2.1.5.)
           2.1.4.1. Que displicente(tá me dando trabalho!). Volte ao quarto, pegue as chaves, vá para a garagem e pegue o carro.
            2.1.4.2. Dirija até o supermercado, compre a pipoca e volte.
2.1.5. Agora coloque a pipoca na pipoqueira, um pouco de óleo e sal.
2.1.6. Aguarde até ficar pronto, tire na panela, espere esfriar
2.1.7. E aí é só comer.

Obviamente, todo o processo acima, poderia ser menor, ou até maior dependendo da situação. O importante, é entender que para se alcançar o objetivo, foi preciso seguir uma sequência lógica de ações. Isto é algorítimo.

3. LÓGICA DE PROGRAMAÇÃO EM VBA

Para desenvolver qualquer sistema em VBA ou em qualquer outra linguagem programação, se faz necessário a compreensão do que é a lógica de programação. O conhecimento adquirido sobre algorítimos será extremamente relevante neste momento.

3.1. Fluxograma e seus principais símbolos


Os Fluxogramas são amplamente utilizados nos estudos de algorítmos, assim como a lógica de programação. Basicamente, o fluxograma consiste em analisar o enunciado de um problema qualquer, descrevendo sua possível solução através de símbolos. A razão de sua utilização, se deve à facilidade de compreenção dos simbolos. Veja a descrição dos principais símbolos abaixo:

 












3.2. Operadores Aritméticos e Relacionais

3.2.1. Operadores Aritméticos

Ao desenvolvermos algoritmos, precisamos trabalhar com expressões matemáticas para a resolver problemas. Chamamos de  operadores aritméticos, o conjunto de símbolos que representa as operações básicas da matemática, conforme tabela a seguir:
 







3.2.2. Operadores Relacionais


Os operadores relacionais são tão importantes, quanto os operadores aritméticos. Utilizamos esses operadores quando queremos fazer comparações entre valores. Os operadores relacionais são:









3.2. Declaração de Variáveis e Constantes.

As variáveis e constantes são utilizadas para armazenar os dados que serão processados em um programa. São extremamente importantes e necessárias ao bom funcionamento dos sistemas desenvolvidos em VBA. Agora, você deve estar se perguntando, qual a diferença entre elas? Pois bem, eis a explicação!


 

3.2.1. Variável

As variáveis armazenam dados, que podem ser números e que sofrerão modificações durante a execução do algorítimo. Assim, todo dado que tem a possibilidade de ser alterado, sofrendo variações no decorrer do tempo, deverá ser tratado como uma variável do problema, e portanto deverá ser definido como tal no algoritmo a ser desenvolvido.

EXEMPLO

Para melhorar a compreensão, imagine que queira desenvolver um pequeno sistema que faça a multiplicação entre dois números. Logo precisariamos de 3 variáveis, sendo uma para receber o 1º número, uma para o 2º e finalmente a que receberá o resultado. Assim, sempre que os números das variáveis 1 e 2 mudarem, o resultado da 3º terceira variável será diferente.

VARIÁVEIS                        1    x    2     =      3 (RESULTADO DA MULTIPLICAÇÃO)
NÚM. DIGITADOS             2    x    3     =      6 (O resultado da multiplicação é 6)
NÚM. DIGITADOS               6    x    4     =    24 (O resultado da multiplicação é 24)

Perceba que o valor que será guardado na 3º varíável será diferente em cada situação.

3.2.1.1 . Tipos de variáveis

O tipo de variável, relaciona-se  à informação que se pretende armazenar nela. Abaixo, segue uma lista com as mais utilizadas e sua aplicação.


Integer – 2 bytes - permite armazenar  números inteiros entre -32.768 e 32767 

Double8 bytes – permite armazenar um real desde -1.79769313486232E308 até -4.94065645841247E-324 para valores negativos, e desde 1.79769313486232E308 até 4.94065645841247E-324 para valores positivos.

Boolean – 2 bytes – Permite armazenar valores Boolenaos – True ou False

Variant16 bytes - permite armazenar qualquer tipo de dados
Byte – 1 Byte – permite armazenar números sem sinal entre 0 e 255
Long – 4 bytes – permite armazenar números inteiros entre -2 147 483 648 e 2 147 483 648
Object – 4 bytes – utilizado para fazer referência a um objecto do Excel


3.2.2. Constante
Date – 8 Bytes – permite armazenar datas
Single – 4 bytes – permite armazenar um real desde -3.402823E38 até -1.4011298E-45, para valores negativos e desde 3.402823E38 até 1.4011298E-45, para valores positivos

Currency  - 8 bytes – permite armazenar moeda

String – 1 byte por caractere – permite armazenar conjuntos de caracteres

Como o próprio nome diz, as constantes são valores que não se alteram durante a execução de uma rotina, ou seja, quando um dado não tem nenhuma possibilidade de variar com o decorrer da execução do algorítmo. São declaradas da mesma forma que as variáveis, a única diferença e que a atribuição de valor deve ser feita na mesma instrução da declaração e apenas uma única vez.

EXEMPLO

Imagine que você precisa criar um pequeno sistema para calcular o valor do desconto que será dado a um cliente por um compra à vista em sua pequena loja. Você decidiu que toda a compra à vista terá um desconto de 5%. Logo precisaremos de uma variável, pois o valor da compra pode mudar, dependendo do cliente e de uma constante, pois o valor do desconto será o mesmo. Então vamos a boa e velha matemática.

VARIÁVEL(Valor da compra)       CONSTANTE(Desconto)       RESULTADO(Valor do desconto)
                100                      x                       0,05                     =                            5           
                300                      x                       0,05                     =                          15           
              

4. CONHECENDO O EDITOR DO VBA.

Resolvi abordar este assunto agora, pois venho percebendo que a maioria dos iniciantes em programação VBA, que estudam pela internet, se sentem desanimados já nos primeiros passos por não saberem ao menos onde os códigos devem ser escritos, não podendo assim, ver os códigos em ação. Para resolvermos tal problema, mostrarei como acessar o EDITOR DO VBA, assim como suas funcionalidades básicas. Assim, quando partimos para os exemplos práticos, você terá condições de ver os resultados, eliminando suas frustações. "Viu como sou gente boa!".

Todos os exemplos serão confeccionados no Excel 2003. Neste momento do nosso curso, não aprofundaremos os nossos conhecimentos no editor do VBA. Aprenderemos apenas a acessar o módulo onde serão digitados os códigos para teste, deixando a exploração do ambiente de desenvolvimento do VBA para o futuro, dentro de cada tópico que estudaremos.

4.1. Abrindo o Editor do VBA

Crie uma planilha do Excel e a nomeie como o exemplo abaixo. Utilizaremos essa planilha em nossos exemplos de código VBA.

Para abrir o editor do VBA, siga os seguintes passos: Clique no Menu Ferramentas; Macro; Editor do Visual Basic ou simplismente Alt+F11, como mostra a figura abaixo:

 


Com o editor do Visual Basic aberto, clique no ícone que abrirá o módulo, conforme a figura abaixo.



Agora podemos desenvolver nossos primeiros códigos e testa-los.

4.1. Exemplos

Para melhor compreensão da teoria apresentada até aqui, irei utilizar os conceitos apresentados nos item 3.2.1 e 3.2.2, sobre variáveis e constantes respectivamente, em forma de exemplos.

1º EXEMPLO

Nosso primeiro exemplo, consiste na criação de um algorítimo que resultará na multiplicação de dois números, escrevendo o seu resultado. Para facilitar a compreensão, comentarei o código em seu próprio corpo. Perceba que os escritos em verde, não são lidos pelo editor, sendo considerados apenas comentários. Caso queira fazer seus próprios comentários no código é só escreve-los depois do apóstrofo.

OBS: Além do código feito no próprio editor do VBA, colocarei abaixo o código para que você possa copiar. Que moleza!!!

Neste 1º exemplo, farei também o fluxograma para que você entenda a sua aplicação
FLUXOGRAMA
         














CÓDIGO EM VBA














CÓDIGO PARA COPIAR

Sub Multiplicação()
'Declaro as variáveis que receberão os números a serem multiplicados(N1 e N2)
'e a que receberá o resultado(M).
Dim N1, N2, M As Integer
'Abro uma caixa de entrada para receber o 1º número
N1 = InputBox("Digite o primeiro número", "MULTIPLICAÇÃO")
'Abro uma caixa de entrada para receber o 2º número
N2 = InputBox("Digite o segundo número", "MULTIPLICAÇÃO")
'Uso o operador aritmético(*) para fazer a multiplicação
M = N1 * N2
'Imprimo o resultado na tela através de uma caixa de mensagem(msgbox)
MsgBox "Resultado da multiplicação: " & M
End Sub

2º EXEMPLO

Neste exemplo, criaremos um algorítimo que calcula o desconto de uma compra feita à vista, imprimindo na tela o total dos descontos e o total à pagar.



CÓDIGO PARA COPIAR


Sub Desconto_Vendas()
'Declaro a constante, que caracterizara o desconto, que no caso, será de
'5 por cento.
Const tax_Desc As Double = 0.05
'Declaro a variável que receberá o valor do produto
Dim Valor_Prod As Double
'Declaro a variável que recebera o valor do desconto
Dim Valor_Desc As Double
'Declaro a variável que receberá o total à pagar
Dim Total_Pg As Double
'Para começar, criaremos uma caixa de entrada para receber o valor do produto
Valor_Prod = InputBox("Digite o valor do produto: ", "CALCULA DESCONTO")
'Calculo o valor do desconto(valor do produto x a taxa de desconto)
Valor_Desc = Valor_Prod * tax_Desc
'Finalmente, calculo o total à pagar
Total_Pg = Valor_Prod * (1 - tax_Desc)
'Agora é só imprimir os resultados usando a caixa de mensagem
MsgBox "Valor do produto: " & Valor_Prod & Chr(13) _
& "Valor do desconto: " & Valor_Desc & Chr(13) _
& "Total à pagar: " & Total_Pg
'VOCABULÁRIO
'Ao invés de ficar dando longas explicações sobre caracteres e operadores que
'vão aparecendo no código, procurarei explica-los no próprio código.
'1.Inputbox: É uma caixa de entrada de dados
'2.&: Concatena as informações
'3."": Todo texto(string) no código deve vir entre aspas.
'4.chr(13): É o mesmo que Enter, porém feito via programação
End Sub


5. APRENDENDO A TRABALHAR COM FORMULÁRIOS

Os formulários são muito utilizados na programação VBA. De uma forma simples é possível criar interfaces que facilitem a interação do usuário com as planilhas, reduzindo o tempo requerido para a realização de algumas tarefas. Vejamos como acessar formulários através do editor do VBA.

Vamos aproveitar este capítulo para criarmos uma calculadora em programação VBA e assim, consolidarmos dos conceitos aprendidos



5.1. Criando uma Calculadora no Excel VBA

Precisaremos inicialmente, após abrir uma planilha do Excel, acessar o editor do VBA. Simples, clique em Alt + F11 e Vualá(No português mesmo pra faciliar!kkk).

Após abrir o editor do VBA, faça como a figura abaixo para abrir o formulário. Não se esqueça de abrir a caixa de ferramentas que vamos utilizar para criar nossa calculadora.





5.1.1. Personalizando o formulário

Inicialmente, vamos fazer algumas alterações no formulário para personalizá-lo. Vamos dar um nome a ele e mudar a descrição de sua barra de identificação. Para tanto, utilizaremos a caixa de propriedades para deixar o formulário a nossa cara. (Se depender de mim vai ficar lindo, não sei quanto a você!kkk).

Veja que depois de alterarmos a propriedade name, o nome do formulário vai mudar para Calculadora. Da mesma forma, quando alterarmos a propriedade Caption, a descrição do formulário mudará.

Além disso, como você pode ver na figura, inserimos no formulário uma caixa de texto e um botão.







5.1.2. Montando a Interface

Agora que você já sabe como inserir caixas de texto e botões, vamos criar um formulário como o abaixo. É só inserir o número de botões correspondentes e alterar a propriedade Caption para inserir os números da calculadora. Qualquer dúvida sobre a posição dos botões você pode baixar o modelo, abrir o editor do VBA e verificar.




5.1.3. Programando a Calculadora

Pois bem, chegamos ao momento que todos esperavam. É hora de programar a nossa calculadora. Como já dito no começo do curso, explicarei os códigos no próprio corpo do projeto para facilitar a compreensão. Você se surpreenderá com a simplicidade deste projeto, que lhe dará uma excelente base para iniciar e compreender outros programas.

Para iniciar, dê 2 cliques no corpo do formulário para abrirmos a área onde declararemos as variáveis que iremos utilizar. Na parte de cima, antes de qualquer linha de código digite como abaixo as variáveis valor e operação.

A variável valor irá armazenar o valor que será digitado na caixa de texto e operação determinará qual operação aritmética será realizada(Adição, Subtração, Multiplicação ou Divisão).





Será necessário agora, programar a ação dos botões. Para isto, dê dois cliques no botão que deseja programar. Perceba que trabalharemos no evento clique de cada botão.

Exemplo: Private Sub CommandButton1_Click()

Isto significa que as ações ocorrerão somente quando cada botão for clicado.


Veja dos códigos completos com os devidos comentários.


‘ Declaramos as variáveis
Public valor As Single
Public operaçao As String

‘ Quando a calculadora estiver em funcionamento e clicarmos no botão 1 a Caixa de Texto(TextBox1) receberá o valor 1. Se clicarmos novamente, ficará 11 e assim sucessivamente.

Private Sub CommandButton1_Click()
TextBox1 = TextBox1 + "1"
End Sub

‘O mesmo princípio pode ser aplicado a todos os botões numéricos da calculadora.

Private Sub CommandButton2_Click()
TextBox1 = TextBox1 + "2"
End Sub

Private Sub CommandButton3_Click()
TextBox1 = TextBox1 + "3"
End Sub

Private Sub CommandButton4_Click()
TextBox1 = TextBox1 + "4"
End Sub

Private Sub CommandButton5_Click()
TextBox1 = TextBox1 + "5"
End Sub

Private Sub CommandButton6_Click()
TextBox1 = TextBox1 + "6"
End Sub

Private Sub CommandButton7_Click()
TextBox1 = TextBox1 + "7"
End Sub

Private Sub CommandButton8_Click()
TextBox1 = TextBox1 + "8"
End Sub

Private Sub CommandButton9_Click()
TextBox1 = TextBox1 + "9"
End Sub

Private Sub CommandButton10_Click()
TextBox1 = TextBox1 + "0"
End Sub


‘AGORA, VAMOS COMEÇAR A PROGRAMAR OS BOTÕES QUE REALIZARÃO AS OPERAÇÕES


Private Sub CommandButton11_Click()
‘O 1º fará a soma. Veja que a variável “Valor” armazenará o valor digitado na caixa de texto. Entenda que na caixa de texto podemos digitar qualquer coisa, letras, números e caracteres. Por isto, precisamos pegar o valor que foi digitado e convertemos em número, daí  a expressão Val(TextBox1).
valor = Val(TextBox1)
Percebe que após a variável “valor” receber o número, precisamos limpar a caixa de texto para receber o próximo número que será digitado.
TextBox1 = ""
Como queremos efetuar uma soma, a variável “operação” receberá esta expressão.
operaçao = "soma"
End Sub

OS COMMANDBUTTONS 12, 13 E 14 UTILIZARÃO OS MESMOS PRINCÍPIOS.

Private Sub CommandButton12_Click()
valor = Val(TextBox1)
TextBox1 = ""
operaçao = "subtraçao"
End Sub

Private Sub CommandButton13_Click()
valor = Val(TextBox1)
TextBox1 = ""
operaçao = "divisao"
End Sub

Private Sub CommandButton14_Click()
valor = Val(TextBox1)
TextBox1 = ""
operaçao = "multiplicaçao"
End Sub

‘PARA ESTE PROJETO, O BOTÃO “=” TALVEZ SEJA O MAIS COMPLEXO. PORÉM NÃO CHEGANDO A SER UM DESAFIO PARA VOCÊ QUE ESTÁ ACOMPANHANDO O CURSO DESDE O INÍCIO.

Aqui, vamos utilizar o operador CASE. Em português simples, significa dizer que caso se clique no botão X, faça isto. Caso clique no botão Y faça aquilo.

Private Sub CommandButton15_Click()
‘Quando o botão “=” for clicado, significa que você já clicou em um dos operadores aritméticos antes(+, -, /, x), determinando qual operação será realizada.

‘Usamos Select Case para iniciar o processo
Select Case operaçao
‘Caso a operação seja soma(+)
Case "soma"
‘Vamos pegar o valor que foi armazenado na variável “valor” e soma-lo com o valor que ficou na tela por último.
valor = Val(TextBox1) + valor ‘(entenda que este valor foi armazenado quando você clicou em “+”. Depois disto a tela foi limpada, lembra! Logo você digitou mais um valor que será Val(TextBox1). Agora é só somar estes dois e a variável “valor” será renovada, recebendo o valor da soma. Simples!!!!!Não?


‘OS PROXIMOS SEGUEM O MESMO RACIOCÍNIO
Case "subtraçao"
valor = valor - Val(TextBox1)
Case "divisao"
valor = valor / Val(TextBox1)
Case "multiplicaçao"
valor = valor * Val(TextBox1)

‘Usamos End Select para fechar o processo.
End Select

‘Depois que o operador for identificado e a operação for realizado é só exibir o resultado na tela e sair pra galera!!!!!
TextBox1 = valor

End Sub

Private Sub CommandButton16_Click()
‘Este botão é o “CE”, serve apenas para limpar a tela. Ou seja, queremos que o valor da caixa de texto seja nada(“”)
TextBox1 = ""
End Sub

Private Sub CommandButton17_Click()
‘Este botão apenas fecha a calculadora
Unload Calculadora
End Sub

6. ESTRUTURAS DE DECISÃO.

Não são raras as vezes que precisamos decidir o comportamento de um sistema durante a sua execução. Neste sentido, o algoritmo deve ser desenvolvido de modo a permitir que o usuário tome a decisão quanto ao que fazer.  Para tanto, precisamos usar as estruturas de repetição, que são as ferramentas disponibilizadas pelo VBA para estruturarmos os nossos sistemas.

6.1. Estrutura SE(IF) / ENTÃO(THEN) / SENÃO(ELSE)

Usamos esta estrutura para verificar se uma condição foi satisfeita durante a execução do algoritmo. Desta forma, poderemos definir qual será o comportamento do programa, além de dar ao usuário opções de procedimentos possíveis.

É importante lembrar que esta estrutura tem início e fim. Desta forma, para começarmos a programar esta estrutura digitamos IF e fechamos com END IF.

Para facilitar a sua compreensão, vamos criar um programa que receba digitação de um número e identifique os maiores e menores que 10.


CÓDIGO PARA COPIAR

Sub IdentificaNumero()

'Criamos uma variável inteira para receber o número. OBS: Esta variável recebe apenas
'número inteiros, assim,evite números não inteiros, mais tarde isto ficará mais claro.
Dim Numero As Integer

'Criamos uma caixa de entrada(InputBox) para receber o número. Obeserve, que o número
'digitado na InputBox Ficará armazenada na variável número.
Numero = InputBox("Digite o número", "IDENTIFICA NÚMERO")

'Depois que a variável já recebeu o valor digitado, podemos fazer as verificações. Observe:

'Se o número for menor que 10, então exiba uma mensagem(msgbox)
If Numero < 10 Then
MsgBox "Este número é menor que  10!"
'Do contrário/senão, emita outra mensagem
Else
MsgBox "Este número é maior que  10!"
End If

End Sub


6.1.2. Definição da estrutura a ser utilizada

Não há uma regra específica para se definir qual estrutura deverá ser utilizada na construção de um sistema. A utilização de uma ou outra, está condicionada à necessidade e exigências do programa. Assim, sistemas podem ser construídos usando-se apenas if e end IF.

Agora, suponha que você é um professor(não suponha que seja do ensino médio em escola pública, pois neste momento eles estão de greve. Deve haver uma razão pra isto). Imagine que precise de um pequeno sistema que verifique se a nota do aluno é suficiente para aprovação. Vamos a um exemplo prático.

Para lhe ajudar a consolidar os conhecimentos, vamos criar um formulário. Abra uma planilha e siga os passos.

1º. Abra o editor do VBA(Ctrl + F11)




2º. Abra um formulário




3º Altere as propriedades do formulário




Perceba que a propriedade Caption define o nome que aparecerá na barra de título do formulário.

4º. Insira os objetos necessários no formulário

A alteração das propriedades do objeto segue sempre o mesmo padrão. Assim, é só seguir o exemplo do 3º passo.

Veja que inserimos um rótulo com Caption: Nota. Uma caixa de texto e um botão com caption: Verificação.



6.1.3. Programando o sistema de notas

Vamos verificar se a média das notas dos alunos é maior ou igual a 60. Caso positivo, o aluno será aprovado. Veja o fluxograma e tente compreender como o programa irá funcionar.




Perceba que a nota será inserida pelo o usuário, no nosso caso, o próprio professor lembra?! Aquele que lhe contratou para desenvolver o sistema (não se esqueça de combinar o preço antes!).

Logo após a inserção da nota, verificamos se a mesma é maior/igual a 60. Se for, aprovamos a galera, do contrário damos pau em todo mundo sem dó. Se reclamarem da rigidez, diga que a culpa não é sua, o computador é muito insensível.

Agora podemos começar a programar. Para começar, dê dois cliques no formulário. Você verá que o evento padrão é o CLICK, porém, precisamos programar primeiro o evento Initialize, ou seja, aquele que é disparado quando o formulário é aberto.





Na caixa de combinação da direita escolha initialize. Agora, vamos digitar uma linha de código para colocarmos o foco na caixa de texto assim que o formulário for inicializado.

É só digitar me.TextBox1.SetFocus(A caixa de texto será focada)





Assim, todas as vezes que o formulário for aberto, a caixa de texto receberá o foco sem que seja necessário usar o mouse para isto.

Agora dê dois clicks no botão que você criou e digite o código abaixo. Todas as considerações relevantes sobre o algoritmo estão em seu próprio corpo.





Clique em F5 para dar play no sistema. Se quiser que o formulário apareça assim que a planilha for aberta é só digitar verificanota.show no evento open da pasta de trabalho. Dê dois cliques em EstaPasta_de_trabalho e escolha Workbook. Depois de feito isto, perceba que na caixa de combinação à direita, aparecerá Open, que é o evento padrão do Workbook. Veja como fazer abaixo:



Agora é só digitar o código





CÓDIGO PARA COPIAR

Private Sub CommandButton1_Click()

'Iniciamos o programa com o foco na caixa de texto
Me.TextBox1.SetFocus

'Pense! Se o valor que estiver na nossa caixa de texto for maior que 5, então...
If Me.TextBox1.Value > 60 Then

'Emitiremos a mensagem "Aluno Aprovado"
MsgBox "Aluno Aprovado!"

'Voltamos o foco para para a caixa de texto
Me.TextBox1.SetFocus

'Do contrário
Else

'Emitiremos a mensagem "Aluno Reprovado"
MsgBox "Aluno Reprovado!"

'Voltamos o foco para para a caixa de texto
Me.TextBox1.SetFocus

'Fechamos a estrutura de decisão
End If

End Sub


6.2. Estrutura SE(IF) / ENTÃO(THEN) / SENÃO SE(ELSEIF) /  SENÃO(ELSE) – Ninho de IF.

Você deve ter percebido que no tópico 6.1, fizemos basicamente uma verificação, ou seja, o aluno será aprovado ou reprovado. Porém, como todos sabemos, existe a repescagem, mais conhecida como recuperação (quem nunca pegou que atire a primeira pedra!).

Imagine, o professor quer saber quais alunos foram aprovados, reprovados, ficaram em recuperação e demais opções se for o caso. É possível? Claro meu amigo microsoftmaníaco(acabei de inventar!!!, mas não é um trava língua – estou ligando para a editora do Aurélio para acrescentarem. kkk), vamos usar o comando IF / THEN / ELSEIF /  ELSE, também conhecido como ninho de IF.

Para esclarecer melhor, vamos usar o exemplo do tópico anterior e fazer os incrementos necessários. Os comentários em caixa-alta e em vermelho no CÓDIGO PARA COPIAR farão menção às novas linhas de código, porém não se esqueça, as linhas verdes são apenas comentários.

CÓDIGO PARA COPIAR

Private Sub CommandButton1_Click()
'Iniciamos o programa com o foco na caixa de texto
Me.TextBox1.SetFocus

'Pense! Se o valor que estiver na nossa caixa de texto for maior que 60, então...
If Me.TextBox1.Value >= 60 Then

'Emitiremos a mensagem "Aluno Aprovado"
MsgBox "Aluno Aprovado!"

'DO CONTRÁRIO SE, A NOTA FOR ENTRE 40 E 60, ENTÃO, O ALUNO ESTARÁ DE RECUPERAÇÃO

ElseIf Me.TextBox1.Value >= 40 And Me.TextBox1.Value < 60 Then

'EMITIREMOS A MENSAGEM "ALUNO EM RECUPERAÇÃO"
MsgBox "ALUNO EM RECUPERAÇÃO"

'DO CONTRÁRIO SE, A NOTA FOR ENTRE 10 E 40, ENTÃO, O ALUNO ESTARÁ REPROVADO

ElseIf Me.TextBox1.Value >= 10 And Me.TextBox1.Value < 40 Then

'EMITIREMOS A MENSAGEM "ALUNO REPROVADO"
MsgBox "ALUNO REPROVADO"

'AGORA SE O ALUNO FOR MUITO RUIM, A GENTE PODE DETONAR. VEJA SÓ.
'SE A NOTA FOR MENOR QUE 10.

Else 'PERCEBA QUE NÃO USAMOS MAIS O ELSEIF, JÁ QUE ESTA É A ÚLTIMA OBSERVAÇÃO.

'EMITIREMOS A SEGUINTE MENSAGEM
MsgBox "ALUNO EXPULSO DA ESCOLA" 'SACANAGEM!!!!!!!!!

'VAMOS APROVEITAR E LIMPAR A TELA PARA UMA NOVA DIGITAÇÃO
Me.TextBox1.Value = ""

'Voltamos o foco para para a caixa de texto
Me.TextBox1.SetFocus

'Fechamos a estrutura de decisão
End If

End Sub


Viu como o raciocínio é simples. Este é apenas um exemplo, você pode fazer quantos testes quiser ou quantos o sistema exigir.

No próximo tópico, veremos uma estrutura diferente, porém que tem o mesmo objetivo desta. Algumas pessoas dizem ser mais simples. Vamos ver o que você acha.

6.3. Estrutura SELECT CASE

A estrutura SELECT CASE  pode ser usada para simplificar algoritmos que programam atividades repetitivas. Se achar o ninho de IF cansativo, você poderá utilizar este comando.

Para exemplificar, vamos usar o mesmo raciocínio do item 6.2, aplicando o SELECT CASE. Para tanto, vamos implementar nosso projeto, acrescentando mais um botão. Assim, não perderemos os códigos anteriores. Faça como na figura abaixo:



Agora dê um duplo click no botão que você acabou de criar e vamos programá-lo.




CÓDIGO PARA COPIAR

Private Sub CommandButton2_Click()

'No Caso do SELECT CASE, precisamos criar uma variável para armazenar o valor da nota que será
'digitado na TextBox1

'Declare a variável
Dim Nota As Integer
'Agora definimos o valor que será guardado na variável. Veja que, o número que for digitado na
'textbox1 ficará armazenado na variável. Então Nota será igual ao valor da Textbox1.
Nota = Me.TextBox1.Value
'Vamos iniciar a estrutura
Select Case Nota
'Pense! Se o valor que estiver na nossa caixa de texto for maior que 60, então...
Case Is >= 60
'Emitiremos a mensagem "Aluno Aprovado"
MsgBox "Aluno Aprovado!"
'DO CONTRÁRIO SE, A NOTA FOR ENTRE 40 E 60, ENTÃO, O ALUNO ESTARÁ DE RECUPERAÇÃO
Case Is >= 40
'EMITIREMOS A MENSAGEM "ALUNO EM RECUPERAÇÃO"
MsgBox "ALUNO EM RECUPERAÇÃO"
'DO CONTRÁRIO SE, A NOTA FOR ENTRE 10 E 40, ENTÃO, O ALUNO ESTARÁ REPROVADO
Case Is >= 10
'EMITIREMOS A MENSAGEM "ALUNO REPROVADO"
MsgBox "ALUNO REPROVADO"
'AGORA SE O ALUNO FOR MUITO RUIM, A GENTE PODE DETONAR. VEJA SÓ.
'SE A NOTA FOR MENOR QUE 10.
'CASO CONTRÁRIO
Case Else 'PERCEBA QUE NÃO USAMOS MAIS O ELSEIF, JÁ QUE ESTA É A ÚLTIMA OBSERVAÇÃO.
'EMITIREMOS A SEGUINTE MENSAGEM
MsgBox "ALUNO EXPULSO DA ESCOLA" 'SACANAGEM!!!!!!!!!
'VAMOS APROVEITAR E LIMPAR A TELA PARA UMA NOVA DIGITAÇÃO
Me.TextBox1.Value = ""
'Voltamos o foco para para a caixa de texto
Me.TextBox1.SetFocus
'LÓGICO, FECHAMOS O PROGRAMA
End Select


End Sub


Observe que o código será executado até que a condição seja atendida. Por esta razão, a Textbox1 só será limpa e receberá o foco novamente se você digitar um número menor que 10, pois este é o último teste. Caso queira que se repita em todas as hipóteses, copie os códigos.

Finalmente, terminamos com as estruturas de repetição. Agora, vamos ao assunto mais interessante da programação VBA, que lhe permitirá criar programas extremamente sofisticados e que terão como limite apenas a sua imaginação.



7. ESTRUTURAS DE REPETIÇÃO

Considero as estruturas de repetição, os comandos mais importantes da programação VBA ou de qualquer linguagem, seja JAVA, PHP, C#, C++ dentre outras. Por esta razão, dispensaremos mais tempo ao seu estudo.

Também conhecidos como LOOP’S ou LAÇOS, esses códigos são usados para repetir as ações desejadas até que uma condição X seja satisfeita e tenha se cumprido o propósito definido pelo programador.

É importante salientar, que o programado deve desenvolver o algoritmo com cuidado para não criar um LOOP infinito, ou seja, um código cuja condição nunca poderá ser satisfeita. Durante nosso estudo sobre as estruturas de repetição, veremos a fundo essas inconsistências que podem ocorrer durante a execução de um programa.

Você verá, que os LOOP’S são de longe os comandos mais poderosas da programação VBA, já que podem ser disparados à partir de uma ação do usuário, tornado os programas fáceis de operar e extremamente autônomos.

Em resumo, vamos ver comandos que nos ajudarão a criar rotinas que minimizem ao máximo o tempo gasto com tarefas repetitivas. Entre as estruturas que estudaremos estão a FOR – NEXT, DO WHILE/UNTIL e seus desmembramentos e a poderosa FOR – EACH – NEXT.

Você deve estar se perguntando! Que tipo de repetição está se referindo? Fique tranqüilo, vamos fazer muitos exemplos e a compreensão ficará fácil. Você compreenderá, que programar um LOOP, nada mais é que um exercício de criatividade e profundo conhecimento de lógica algorítmica. Por ora, posso lhe dizer, por exemplo, que é possível numerar uma planilha uma planilha de 1 a 10.000 sem precisar fazer isto:




Em uma situação cotidiana, para numerar uma planilha de 1 a 10.000 no Excel, você precisaria digitar o número 1 na célula A1 e o 2 na célula A2, selecioná-las e sair puxando até , até, até, até e até!!! Ufa! Haja paciência. Quer uma solução para isto. Não se preocupe mais, seus problemas acabaram e a solução não é um produto Tabajara, é só programação VBA.  

Concluindo esta introdução, repiso a importância de se compreender, que os LOOP’S têm como principal objetivo, a repetição de determinado bloco de códigos de forma inteligente e automática.


7.1. Estrutura FOR – NEXT

Este comando é extremamente útil para construirmos algoritmos com um número finito de ações. Ou seja, quando sabemos previamente quantas vezes determinada linha ou bloco de códigos deve ser repetido. É claro  que com um pouco de criatividade, poderemos permitir que o usuário defina o número de vezes que a repetição se processará.

Para definir o número de repetições, precisaremos utilizar uma variável contadora, que armazenará o número de vezes que o código foi repetido. Obviamente, o contador variará de um valor inicial a um valor final. Não esquente sua cuca, mais tarde, os exemplos esclarecerão melhor este conceito.

Agora, veja a sintaxe geral desta estrutura

FOR contador = inicio TO fim INCREMENTO
Comando1
Comando2
...
Comandon
NEXT

O importante é entender que a variável contador, não armazenará o mesmo número o tempo todo. A cada execução do LAÇO, a variável será incrementada pelo valor definido em INCREMENTO. Vamos ao no primeiro exemplo.

1º EXEMPLO

Imagine que você queira criar um programa que faça uma soma, um determinado número de vezes. Os comentários estão no código.



CÓDIGO PARA COPIAR

Sub SomaNumero()

‘Como aprendemos no tópico 3.2, vamos declarar a variável que receberá um número que não se alterará durante a execução do LAÇO.
Dim Total as Integer
‘Agora, declaramos a variável Soma, que receberá o resultado do cálculo que proveniente da execução do LAÇO.
Dim Soma as Interger
‘A última variável que criaremos, receberá o números que se estenderão do valor inicial ao final.
Dim Numero as Interger

‘Neste momento, vamos atribuir um valor específico à variável Total. Repiso, este número será sempre 10
Total=10
‘Vamos inicializar a variável soma com o valor 0. E por que? Se queremos que ela absorva o valor o do calculo que faremos, ela não poderá ser inicializada com valor maior que 0, pois o mesmo seria somado, assim, nossa variável será incrementada à partir do primeiro LOOP. (Perceba que às vezes digo LAÇO e outras LOOP. Na Como já disse, é mesma coisa.)
Soma=0
‘Agora, faremos a soma dos 10 primeiros números. Entenda o código:
‘Para o número de 1 a 10, ou seja, quando o primeiro LOOP for excecutado, a variável Numero terá dentro de sí o valor 1. O cálculo será feito e comando Next dirá, vamos para a próxima fase. Quando o segundo LOOP rodar, a variável Numero terá dentro de si o valor 2 e assim sucessivamente até o número 10. Como determinamos que o LAÇO será executado 10 vezes(For Numero=1 to Total “Entender isto é extremamente importante.), o comando Next finalizará o LAÇO, já que o próximo seria 11, porém, determinamos previamente que nosso LOOP sofreria apenas 10 execuções. Simples não?

‘ Então, Para(FOR) um número que será executado até 10....
For Numero=1 to Total
‘Efetuaremos o cálculo abaixo. No primeiro LOOP teremos: Soma = 0 + 1, então a variável Soma será igual a 1. Concorda? No segundo LOOP, a variável Soma já valerá 1, teremos: Soma(que é 1) = 1( que é o valor de Soma) +1. Se o LAÇO fosse finalizado neste momento, a variável Soma, terminaria com o valor 2. Entendeu o processo? Ou foi muito bruto? Se o processo foi bruto, sugiro que você retome o raciocínio do começo. Tenho certeza que na segunda ou terceira revisão, os conceitos ficarão claros.  
Soma = Soma + Numero
‘Próximo número
Next
‘Exibimos a mensagem com o valor total da soma. E por que o “& Soma”? Quando o LOOP for finalizado a variável Soma estará com o resultado final dos cálculos, então é só fazer uma chamada a ela. Moleza meu Brother!!!
MsgBox “Valor da Soma = “ & Soma
‘Finalizamos o procedimento
End Sub


É isto ai! Click em F5 e execute o programa. O resultado será este:


Por que??? Vamos tirar a prova?

Veja bem, a primeira vez que o LOOP rodar, a variável NUMERO valerá 1 e a SOMA valerá 0, conformo declaramos no início do código. No final do primeiro LOOP, a variável SOMA valerá 1 e a NUMERO valerá 2 e assim por diante. Quando o LAÇO for executado pela décima vez, a variável NUMERO será 10 e valor inicial da SOMA será 45. Somando-se, teremos 55. Molezinha!!! Observe a tabela abaixo e veja como é simples.







2º EXEMPLO

Como lhe disse no começo deste capítulo, há uma maneira mais fácil de inserir números em uma planilha, que não selecionar os dois primeiros e puxar com mouse. Então vamos lá.

No módulo crie esta sub-rotina




CÓDIGO PARA COPIAR

Sub NumeraPlanilha()

'Primeiro, declaramos a variável Planilha. E por que? Porque sim!!! Brincadeira, só pra descontrair. Na realidade,
'se vamos inserir números em uma planilha, precisamos especificar qual vai ser. Neste caso escolhi a Plan2.
Dim Planilha As Worksheet
'Para inserir os números um abaixo do outro, precisamos identificar as linhas. Assim, quando o LOOP rodar, o FOR-NEXT,
'saberá qual e em qual linha o número deverá ser inserido
Dim Linha As Integer

'Determinamos aqui, qual planilha receberá a numeração automática.
Set Planilha = Worksheets("plan2")

'O bloco WITH-END WITH é um facilitador para o nosso código. Quando colocamos With Planilha, estamos querendo dizer,
'que tudo o que está dentro do código, relaciona-se à plan2, que no nosso exemplo, demos o nome de Planilha
'(Dim Planilha As Worksheet) lembra?
With Planilha
'Para a variável linha, que receberá os números de 1 a 15(em momentos distintos é claro), vamos de um a um (Step 1), inserir
'os números.
For Linha = 1 To 15 Step 1
'Quando você digitar o ponto, automáticamente, os objetos, propriedades da Planilha(Plan2) serão acessados. E por que?
'porque você está digitando dentro do bloco WITH-END WITH que criamos para a Planilha. Como você está vendo, acessamos
'Cells(celulas) que obviamente tem linhas e colunas. No nosso exemplo, a linha será a que o FOR-NEXT determinar no
'momento do LOOP e a coluna será sempre 1. Quando o LAÇO rodar a primeira vez, a variável linha será 1. Então teremos:

'      linha, coluna            1
'Cells(  1   ,  1   ).Value = Linha. Interpretando: Na celula 1 da coluna 1, o  valor será igual ao da variável linha,
'que neste caso sera 1.

'Quando o LOOP rodar pela segunda vez, você já sabe o que vai acontecer.
.Cells(Linha, 1).Value = Linha
'Fechamos nosso LOOP
Next
'Fechamos nosso bloco WITH-END WITH.
End With
'Agora é só colocar pra rodar.
End Sub


7.1.1. Discernindo o tal STEP.

Talvez você não tenha entendido muito bem o significado deste negócio no código(Step). É simples, ele determina qual será o andamento do LAÇO, ou seja, de um em um, dois em dois e assim por diante. Para exemplificar, vá no código que acabamos de criar e mude Step1 para Step 2 e execute. Acontecerá isto:




A imagem mostra tudo. O LAÇO continuará numerando de 1 a 15, porém, saltando uma linha. Simples!!!

Te vejo no próximo LOOP.

7.2. Estrutura DO WHILE/UNTIL - LOOP e seus desmembramentos

Esta estrutura, ao contrário do FOR-NEXT é dinâmica. Neste caso, temos a possibilidade de executar o LAÇO quantas vezes for necessário.

Nesta nova estrutura que estudaremos, a repetição acontecerá até que a condição exigida seja atendida. Este tipo de LOOP é simplesmente fantástico, já que automaticamente, ele fará o que for preciso para cumprir seu objetivo de forma inteligente e autônoma. Por outro lado, precisamos ter alguns cuidados ao criá-la, pois, caso a condição não seja satisfeita durante a execução, teremos o famoso LOOP INFINITO.

Não se preocupe com os desmembramentos! A decisão de qual formatação usar é algo que só poderá ser definida quando você estiver desenvolvendo seus aplicativos. Garanto que será intuitivo.


7.2.1. DO WHILE – LOOP

Suponha que você queira criar um pequeno sistema que seja executado até que um comando específico possa finalizá-lo.

Vamos criar um algoritmo super simples. Seu objetivo será apenas finalizar o LAÇO para que o sistema não trave. O código verificará o que será digitado na InputBox. Enquanto você digitar algo diferente (< >) de FIM(com letra maiúscula) o LOOP continuará a ser executado. Neste código, estamos dando uma solução ao problema, ou seja, digite FIM e o LAÇO será quebrado.






CÓDIGO PARA COPIAR

Sub FinalizaDoWhile()

'Vamos declarar a variável que receberá a palavra. Se você quiser armazenar uma palavra em uma variável, ela deve ser
'declarada como String, do contrário o sistema acusará erro.
Dim Finaliza As String

'Inicializamos a variável com qualquer palavra para forçar o loop. Não entendeu? É simples, como disse, o LOOP será executado
'enquanto a palavra FIM não for digitada. Então, se colocamos inicialmente a palavra INÍCIO dentro da variável
'o DO WHILE vai dizer "Não é a mamããããe!!!!" e não será desativado.
Finaliza = "inicio"

'Quando o código começar a ser executado a variável finaliza terá dentro de sí a palavra INÍCIO(entenda! Quando você clica em
'F5 para ativar o código, ele será executado da esquerda para a direita, de cima para baixo). Então, quando chegarmos no LOOP
'(DO WHILE) ele dirá, INICIO é diferente de FIM. Vou rodar novamente!
'Acredite! este LOOP é teimoso feito mula. Enquanto não digitar FIM(em letra maiúscula) ele não irá parar.

Do While Finaliza <> "FIM"
Finaliza = InputBox("Digite a palavra FIM para finalizar o LOOP", "EXEMPLO DO WHILE - LOOP")
'Esta mensagem será sempre que você digitar na InputBox, exatamente por que está abaixo. Logo mesmo que você digite FIM,
'ele será executado mais uma vez. Podemos resolver isto, porém, precisariamos mesclar LOOPS com Estruturas de Repetição.
'Não se preocupe com isto agora, vamos deixar isto para os capitulos que virão. Por ora, entenda este raciocício.
MsgBox "Você não digitou a palavra FIM! Prestenção sô!!!"
Loop


End Sub


7.2.2. DO – LOOP WHILE

Você perceberá que o raciocino de aplicação desta estrutura é o mesmo do item 7.2.1. Mudamos apenas a ordem, reposicionando os comandos.

Chamo esta formatação de CAPITÃO NASCIMENTO, pois bate primeiro pra depois fazer perguntas. Vamos usar o exemplo anterior para ilustrar.




CÓDIGO PARA COPIAR

Sub FinalizaDoLoopWhile()

Dim Finaliza As String

'Finaliza = "inicio"

'O que mudou no código com esta formatação? Simples meu caro! Agora, executamos primeiro e fazemos o teste depois.
'Com isto, não precisamos mais forçar a entrada no LOOP. Por esta razão a variável Finaliza, não precisará mais ser
'preenchida com a palavra início.
Do

Finaliza = InputBox("Digite a palavra FIM para finalizar o LOOP", "EXEMPLO DO WHILE - LOOP")

MsgBox "Você não digitou a palavra FIM! Prestenção sô!!!"
Loop While Finaliza < > "FIM"

End Sub

Mamão com açúcar!!!

7.2.3. DO UNTIL – LOOP

Com esta formatação, faremos a verificação até que a condição seja preenchida. A mudança será apenas entre os operadores relacionais, ou seja, onde era diferente, agora será igual. O exemplo vai mostrar.




Mudamos algumas posições, trocamos o operador relacional e vualá!? Ou seria Voilá? Ah, sei lá,  você entendeu!!! Mais fácil que correr de Saci Perere.


7.2.4. DO - LOOP UNTIL

Chegamos à última formatação desta estrutura.





Como você viu, não há mistérios. Quando estiver desenvolvendo seus sistemas, não terá dificuldades para definir qual será a melhor formatação. O importante é compreender como os LAÇOS são executados

CÓDIGO PARA COPIAR

Sub DoLoopUntil()

Dim Finaliza As String


'Finaliza = "inicio"

'Simples! Algumas movimentações e pronto!!!
Do
Finaliza = InputBox("Digite a palavra FIM para finalizar o LOOP", "EXEMPLO DO WHILE - LOOP")

MsgBox "Você não digitou a palavra FIM! Prestenção sô!!!"

Loop Until Finaliza = "FIM"

End Sub
7.3. Estrutura FOR – EACH – NEXT

Esta estrutura é extremamente poderosa. Com ela é possível, por exemplo, aplicar formatações (negrito, cor, itálico) em células que possuem um determinado algarismo ou palavra, mesmo que sejam milhares. E melhor, tudo ao mesmo tempo! Show

Com o FOR – EACH – NEXT podemos manipular todos os objetos de uma coleção. Coleção? Credo em cruz!!!!!!

Calma meu amigo microsoftmaníaco, não há motivos para desespero. Uma coleção nada mais é que um conjunto de objetos que pertencem a um mesmo grupo. Por exemplo, uma planilha que chamamos em inglês de Worksheet, pertence à coleção Worksheets, ou seja, se tivermos três planilhas(Plan1, Plan2 e Plan3) em uma pasta de trabalho(Workbook), estas pertencem a coleção Worksheets, logo, poderemos manipulá-las de uma só vez com as estrutura FOR-EACH-NEXT. Para ilustrar o que digo, vamos a um exemplo.

1º EXEMPLO

Suponha que você queira exibir o nome das planilhas em uma MSGBOX. Veja.



CÓDIGO PARA COPIAR

Sub ForEachNext1()

'Primeiro, declaramos as variáveis


Dim Planilha As Worksheet 'Refere-se a cada planilha em específico.


    'Digitamos o código para que o nome de cada planilha em worksheets seja exibida nas msgboxs

    'No objeto Application, estão todos os objetos do EXCEL, como menus, barras de comando, planilhas, barras de rolagem,
    'celulas e tudo mais. Ou seja, Application é o próprio aplicativo. Então, vamos buscar o objeto application dentro
    'do próprio Excel. Depois, buscamos a planilha ativa(ActiveWorkbook) com o conjunto de todas as planilhas que estão
    'nela(worksheets)
    For Each Planilha In Excel.Application.ActiveWorkbook.Worksheets
                                                                'O Chr(13) para pular linhas (como um enter)
        MsgBox "OS NOMES DAS PLANILHAS SÃO: " & Planilha.Name & Chr(13)
    Next


End Sub


É simples! Todas as vezes que o LOOP rodar, ele vai capturar o nome de uma planilha e exibir na caixa de mensagem.

2º EXEMPLO

Agora, vamos pensar um pouquinho. Se tivermos três planilhas, como você viu, todas serão exibidas em MSGBOX’S diferentes. Se tivéssemos quinze planilhas, teríamos que clicar em OK o mesmo número de vezes para ver o nome de cada planilha. Assim, daria mais trabalho criar o LOOP do que ver os nomes na própria planilha. Porém, com criatividade e lógica algorítmica podemos resolver este problema.

Será melhor obviamente, exibir os nomes das planilhas em uma única MSGBOX. Para isto, vamos criar uma variável para receber a mensagem, para fazermos uma chamada a ela dentro do FOR-EACH-NEXT. Depois é só exibir a mensagem quando o LAÇO for desfeito.




Mais fácil que tirar doce dos Smurfs.


CÓDIGO PARA COPIAR

Sub ForEachNext2()

'Primeiro, declaramos as variáveis


Dim Planilha As Worksheet 'Refere-se a cada planilha em específico.
Dim Mensagem As String 'Vamos criar uma variável que receberá a mensagem

'Vamos armazenar o texto na variável mensagem.
Mensagem = "OS NOMES DAS PLANILHAS SÃO: " & Chr(13)

    'Neste caso, vamos exibir todos os nomes em uma só MSGBOX
   
    'No objeto Application, estão todos os objetos do EXCEL, como menus, barras de comando, planilhas, barras de rolagem,
    'celulas e tudo mais. Ou seja, Application é o próprio aplicativo. Então, vamos buscar o objeto application dentro
    'do próprio Excel. Depois, buscamos a planilha ativa(ActiveWorkbook) com o conjunto de todas as planilhas que estão
    'nela(worksheets)
    For Each Planilha In Excel.Application.ActiveWorkbook.Worksheets
                                             'O Chr(13) para pular linhas (como um enter)
        'Agora, vamos capturar o nome de cada planilha. Para tanto, usaremos a variável mensagem para armazenar o nome
        'das planilhas a cada execução do LAÇO. Desta forma, quando o LOOP for rodado pela 1ª vez a Plan1 ficará armazenada
        'na variável mensagem. Quando rodar pela 2ª vez, a variável que já possuem plan1, receberá também Plan2 e assim por
        'diante
        Mensagem = Mensagem & Planilha.Name & Chr(13)
    Next
'Quando o FOR-EACH-NEXT capturar a última planilha o LAÇO será desfeito, então poderemos exibir a mensagem com todas
'as planilhas. Faça o teste.
MsgBox Mensagem

End Sub


3º EXEMPLO

Vamos utilizar esta estrutura para aplicar formatações e até inserir dados em nossas planilhas. Para exemplificar, vamos usar a plan3 e as células de A1 à C10.



CÓDIGO PARA COPIAR

Sub ForEachNext3()

'Declaramos a variável que receberá a planilha
Dim Planilha As Worksheet
'Declaramos a variável que receberá as celulas que vamos formatar
Dim Celula As Range

'Dizemos que a planilha que usaremos é a Plan3, que está na coleção de planilhas da pasta de trabalho.
Set Planilha = Worksheets("Plan3")

'Agora abrimos um bloco para a planilha. À partir daqui, tudo que você digitar dentro do bloco, será referente
'A Plan3.
With Planilha

    'Agora faremos a verificação. Para cada Celula que estiver entre A1:C10, ordenaremos que o valor seja 2,
    'seja negritada, tenha o formato italic e a cor seja vermelha.
                        'RANGE pode ser uma célula ou um conjunto de celuas que podem ser definidas abrindo-se
                        'um parentese
    For Each Celula In .Range("A1:C10")
       
        'Abrimos um bloco para a variável Celula. Agora, tudo que estiver neste bloco dirá respeito à variável
        'Celula.
        With Celula
        .Value = 2
        'Já este bloco, definirá a Fonte da variável
        With .Font             'Negrito = Verdadeiro
        'Vamos colocar negrito (Blod = True)
        .Bold = True
        'O mesmo raciocínio se aplica a Italic
        .Italic = True
        'Para cor, usamos o sistema RGB(RED, GREEN, BLUE), ou seja, VERMELHO, VERDE, AZUL. As cores são definidas
        'em uma escala de 0 a 255. Depois você pode brincar, mudando as númerações e veja o que aconteçe.
        .Color = RGB(255, 0, 0)
        End With
       
        End With
    Next

End With

End Sub


4º EXEMPLO

Vamos um pouquinho mais longe agora. Criaremos um algoritmo capaz de mudar o nome das planilhas usando o FOR-EACH-NEXT para localizar cada planilha na coleção WORKSHEETS. Depois de mudar os nomes, vamos exibi-los em uma MSGBOX.

Quando o FOR-EACH-NEXT seleciona um objeto, no caso deste exemplo uma planilha, podemos acessar as propriedades deste objeto e alterá-las. Neste código, vamos alterar a propriedade NAME das planilhas.

O bacana do nosso código será a possibilidade de inserirmos os nomes através de uma INPUTBOX, concedendo este direito ao usuário do sistema. Este conceito é extremamente importante e necessário ao programador VBA. Muitas vezes, você irá desenvolver pequenos aplicativos para seus colegas de trabalho, amigos e usuários pouco avançados em Excel e programação VBA. Desta forma é necessário entender a importância da interação com o usuário e a confecção de sistemas que possam ser utilizados por terceiras sem a necessidade de constantes intervenções do programador.

Vamos ao que interessa.




CÓDIGO PARA COPIAR

Sub ForEachNext4()

'Declaramos a variável que receberá a planilha.
Dim Planilha As Worksheet

    'Para cada planilha no no livro de trabalho aberto ou ativado, acessaremos a coleção planilhas
    For Each Planilha In ActiveWorkbook.Worksheets
    'Vamos selecionar planilha por planilha. Quando o LOOP rodar pela 1ª vez, ele selecionará a 1ª planilha,
    'no caso, Plan1.
    Planilha.Select
    'Após selecionar-mos a planilha, vamos dar um nome a ela. Para tanto, vamos usar uma INPUTBOX. É importante
    'lembrar, que estamos trabalhando ao nível do aplicativo, assim, o nome que você der a planilha, este será
    'o nome que ela terá à partir deste momento.
    Planilha.Name = InputBox("Introduza o nome que você quer dar a planilha", "INSERINDO PLANILHAS")
    Next
   
    'Agora é simples, criamos uma estrutura apenas para exibir o nome das planilhas.
    For Each Planilha In ActiveWorkbook.Worksheets
    Planilha.Select
    MsgBox "Nome da planilha: " & Planilha.Name
    Next

End Sub


Agora click em F5 para executar o código. A INPUTBOX será aberta.



Quando você clicar no botão OK o nome da planilha Plan1 passará a ser Daniel. O mesmo processo se repetirá por 3 vezes para que você digite o nome que quer dar às planilhas subseqüentes. Logo após serão exibidas 3 caixas de mensagens, cada uma apresentando o novo nome da planilha.

Perceba que a cada execução do LOOP, a planilha que terá o nome alterado será ativada, sendo possível visualizar o conteúdo da mesma.


OBS: Depois que fizer os testes do código, será necessário digitar os nomes antigos das  planilhas, sob pena dos códigos dos exemplos anteriores deste curso não funcionarem corretamente corretamente.

5º EXEMPLO

No 1º EXEMPLO, assim como no 4º, exibimos os nomes das planilhas em MSGBOX’S separadas. Isto atrasa a execução e deixa o código chato e cansativo.

Para resolvermos tal problema, usaremos o mesmo critério adotado no 2º EXEMPLO. Mudaremos a estrutura do código para que o nome das planilhas sejam exibidos em uma única MSGBOX’S.



                                     

CÓDIGO PARA COPIAR

Sub ForEachNext5()

'Declaramos a variável que receberá a planilha.
Dim Planilha As Worksheet
'Declaramos a variável que portará a mensagem que será exibida
Dim Mensagem As String

Mensagem = "OS NOMES DAS PLANILHAS SÃO: " & Chr(13) & Chr(13)
    'Para cada planilha  no livro de trabalho aberto ou ativado, acessaremos a coleção planilhas
    For Each Planilha In ActiveWorkbook.Worksheets
    'Vamos selecionar planilha por planilha. Quando o LOOP rodar pela 1ª vez, ele selecionará a 1ª planilha,
    'no caso, Plan1.
    Planilha.Select
    'Após selecionar-mos a planilha, vamos dar um nome a ela. Para tanto, vamos usar uma INPUTBOX. É importante
    'lembrar, que estamos trabalhando ao nível do aplicativo, assim, o nome que você der a planilha, este será
    'o nome que ela terá à partir deste momento.
    Planilha.Name = InputBox("Introduza o nome que você quer dar a planilha", "INSERINDO PLANILHAS")
    Next
   
    'A diferença principal deste código para o do 4º EXEMPLO está aqui. Usaremos a variável mensagem para armazenar
    'os nomes das planilhas enquanto o LOOP é executado.
    For Each Planilha In ActiveWorkbook.Worksheets
    'Selecionamos a planilha
   
    'Na primeira execução, teremos o texto da mensagem mais o nome da 1ª planilha. Na segunda execução, já teremos na
    'variável mensagem o texto e o nome da primeira planilha. Como a variável mensagem será ela mesma + a proxima planilha,
    'ela ficará agora com o nome de mais uma planilha e assim sucessivamente. Moleza!!!
    Mensagem = Mensagem & Planilha.Name & Chr(13)
    Next

    MsgBox Mensagem
End Sub


Como você percebeu, fiz todas as considerações importantes estão no próprio código. O resultado será este:





OBS: Não se esqueça! Depois que fizer os testes do código, será necessário digitar os nomes antigos das  planilhas, sob pena dos códigos dos exemplos anteriores deste curso não funcionarem corretamente corretamente.

Com este 5º EXEMPLO, finalizamos o estudo básico da estrutura FOR-EACH-NEXT e dos LOOP’S.

Talvez você não tenha encontrado até o momento, aplicabilidade para as estruturas de decisão e repetição que estudamos. E isto é perfeitamente compreensível meus caros ladies e gentleman. A construção de um sistema perfeitamente funcional exige a aplicação de todos os conceitos que aprendemos até o momento, assim como a aplicação simultânea das estruturas de decisão e repetição.

Logo, aprenderemos como mesclar essas estruturas para elaborar nossos sistemas e você verá o poder do Visual Basic for Application(VBA). EM BREVE!!! NESTE BLOG!!!

HASTA LA VISTA AMIGOS!!!!


8. INSERINDO DADOS NA PLANILHA ATRAVÉS DE FORMULÁRIOS

Antes de começarmos a mesclar os LOOPS, precisamos estudar algo extremamente importante na programação VBA e que usaremos com muita freqüência, deste momento em diante.  O Excel não é exatamente um banco de dados, apesar de possuir linhas e colunas, semelhantes às tuplas e entidades dos bancos de dados. Porém, as planilhas podem ser usadas como base de dados em muitos dos aplicativos que desenvolvemos no dia-a-dia. Para tanto, precisamos aprender a salvar os dados que digitamos em um formulário, direto nas planilhas.

Vamos à prática:

Abra o editor do VBA(Alt+F11), insira um formulário. Mude as propriedades NAME: Inserindo_Dados e CAPTION: INSERINDO DADOS ATRÁVES DO FORMULÁRIO. Veja a figura abaixo:




Depois, insira um rótulo(LABEL), uma caixa de texto(TEXTBOX) e um botão de comando(COMMANDBUTTON). Agora, com o conhecimento que você já possui, mude as propriedades do formulário para ficar com esta carinha:








8.1. Código para inserir dados por formulários

Há duas formas de inserirmos dados em uma planilha através de um formulário.

A primeira delas é fazendo uma referência direta a uma célula usando o objeto RANGE.

1º EXEMPLO

Dê um duplo click no botão SALVAR que você inseriu no formulário. Agora digite o código abaixo:




O resultado será este:




Faça o teste! Digite o que quiser na TEXTBOX1, que o dado será salvo na planilha. Bacana!!! Opa, espera aí! Vai ser sempre assim? Que sentido há em salvar os dados sempre na mesma célula? Como vou montar minha base de dados?

Take it easy my friend! Este foi só um pequeno exemplo para abrirmos o assunto. Vamos melhorar este negócio no próximo exemplo, OK?

2º EXEMPLO

Vamos melhorar o código que criamos no exemplo anterior. Precisamos encontrar uma forma de salvar os dados em linhas diferentes. Isto porque não podemos mudar a referência da célula no código, todas as vezes que precisarmos salvar um novo dado. Explico melhor - No código criado no 1º EXEMPLO, programamos salvar os dados sempre na RANGE(“A1”). Caso quiséssemos salvar mais um registro, precisaríamos, no próprio código, mudar esta referência, para RANGE(“A2”) por exemplo.

Nem pensar, cê tá doido sô!!!. O VBA tem o objetivo de facilitar e agilizar processos, e é isto que vamos fazer. Veja as alterações propostas no código do 1º EXEMPLO.




Antes de fazer o teste do formulário, vá à plan4 e coloque qualquer palavra na célula A1 para que o VBA possa identificar qual é a última linha utilizada.

Agora digite estes nomes na TextBox e salve(Ermenegilda, Jocrecino, Manelão, Marisdelvinalinda e otorrinolaringologista). O resultado será este:






O nome será apagado da TextBox1, o foco retornado e o mais importante, os dados serão salvos em  uma linha após a outra.

Agora, você pode salvar dados até a planilha acabar. Muito bom!!!

Em breve, aprenderemos a excluir dados das planilhas com apenas um click. Por ora, precisamos aprender a trabalhar com as estruturas de repetição e decisão atuando juntas, pois este conhecimento será necessário para aprendermos a excluir os registros que desejamos nas nossas planilhas.


9. COMBINANDO LOOPS

A mistureba vai começar! A partir deste momento, vamos construir algoritmos mesclando tudo o que aprendemos até agora.

Vamos fazer o máximo de exemplos possível para compreendermos melhor as aplicações em VBA e percebermos como a programação está presente em nossa vida cotidiana. Para começar, vamos tentar entender como os caixas eletrônicos que utilizamos todos os dias funcionam.

9.1. Lógica algorítmica do caixa eletrônico.

Com o passar dos anos, os bancos investiram maciçamente em TI para automatizar as suas ações. Por esta razão, bancário virou cabeça de bacalhau. Não vejo um desde essa informatização toda.

Como fomos expulsos das agências, precisamos aprender a interagir com os caixas eletrônicos. O problema é que o grande vazio existencial do homem consiste em operar parafernálias eletrônicas que não entende o funcionamento. Não sou psicólogo mais vou te ajuda nessa OK?

Vamos criar um pequeno formulário para facilitar a compreensão.

Abra o editor do VBA(Alt + F11) e siga o exemplo abaixo. Obs: você já deve ter percebido que estou usando sempre a mesma planilha, estando esta postada no blog para que você possa baixar e usá-la como ferramenta de estudo.




Veja que este formulário não se parece nada com a tela do programa de um caixa eletrônico. É óbvio, que o nosso objetivo é apenas compreender o raciocínio lógico que permeia um sistema desta natureza. Então let’s GO!!!





9.1.1. Programando o Botão Depositar



Nada de diferente do que já vimos até agora. Simplesmente salvamos o dado digitado na TextBox1 direto na Range(“A1”) da Plan4, usando uma InputBox.

O botão sacar é que exigirá mais de nós.

9.1.2. Programando o Botão Sacar

Uma das funções mais importantes do programador é se antever à possíveis erros praticados pelos usuários. Para tanto, precisam ser criadas consistências que minimizem estas possibilidades.

Como estamos simulando o raciocínio algorítmico de um caixa eletrônico, imagine a seguinte situação hipotética:

Você foi contratado pelo banco JJ para elaborar um sistema para um caixa eletrônico. O programa deverá registrar os depósitos dos clientes. Até aqui tudo bem.

O negócio ficará estreito, quando os clientes quiserem sacar seus depósitos. Por que? Imagine que uma pessoa que tem R$ 100,00 digite sem querer R$ 1000,00 e consiga sacar tal valor.

Minha pergunta: Cê tá no sal ou não ta?

Pois é meu caro amigo! Precisamos resolver este troço. Nosso sistema precisar ser inteligente a ponto de não permitir que tais situações ocorram. Então sigam meus bons!





CÓDIGO PARA COPIAR

Private Sub CB_Sacar_Click()
'Declare a variável que receberá a planilha
Dim Planilha As Worksheet
'A variável que receberá o valor do saque
Dim Sacar As Currency
'Associamos a variável Planilha com a Plan5
Set Planilha = Worksheets("Plan5")
'Criamos uma InputBox para receber o valor do saque.
Sacar = InputBox("Digite o valor que deseja sacar", "CAIXA ELETRÔNICO")
'Criamos um bloco para fazer referência à plan5. Tudo que for digitado entre WITH PLANILHA E END,
'dirá respeito a plan5
With Planilha
'Testamos. Enquanto o valor do saque for maior que o valor que o saldo em conta, emitiremos uma mensagem
'Informando qual é o saldo e solicitaremos novamente que um novo valor seja digitado. o Laço não será
'desfeito enquanto um valor menor ou igual ao saldo for digitado.
Do While Sacar > .Range("A1").Value
                                     'Para exibirmos o valor como moeda, usamos(FormatCurrency) para fazer
                                     'a conversão.
MsgBox "Seu saldo em conta é de: " & FormatCurrency(.Range("A1").Value)
'Precisamos pedir a digitação novamente, pois uma vez no LOOP, não será possivel voltar ao início do código
'para solicita a digitação da INPUTBOX que criamos lá em cima. Por isto repetimos ele aqui.
Sacar = InputBox("Digite o valor que deseja sacar", "CAIXA ELETRÔNICO")
'Fechamos o Loop
Loop
'Agora, famos fazer uma MSGBOX melhor elaborada. Ela fará parte do nosso testo, pois a ação da funcão condicional
'IF - END IF, dependerá da resposta que o usuário der. Perceba que o texto sempre fica entre aspas duplas.
'Variáveis são conectadas pelo &. Nesta caixa de mensagem, usamos o comando vbYesNo, que criará uma MSGBOX com as
'opções sim ou não. Podemos ainda, usar o vbQuestion para que uma interrogação apareça quando da execução.
'Finalmente, se o usuário clicar em NÃO, ENTÃO(THEN), vamos sair da rotina(Exit Sub), significando dizer, que o
'código vai simplesmente parar e nada será executado a partir dali.
If MsgBox("Deseja sacar " & FormatCurrency(Sacar) & " reais de sua conta corrente?", vbYesNo + vbQuestion, _
"CAIXA ELETRÔNICO") = vbNo Then
Exit Sub
'Do contrário, ou seja, se o usuário clicar SIM, continuaremos execução
Else
'E executaremos isto. Pegaremos o valor que está em A1 e subtrairemos o valor que está em SACAR.
'calculo simples.
'                     ao valor que já
'A1 será igual        já possue       menos SACAR
.Range("A1").Value = .Range("A1").Value - Sacar
End If
End With
End Sub


É hora dos testes. Click em F5 ou aperte Play como na figura abaixo





Click em Depositar, Caixa de Entrada (InputBox) será aberta. Digite 2000 e click em OK. Veja que o valor do depósito aparecerá na célula A1.





Agora, click no botão Sacar. Na InputBox digite 300 e click em OK. A MSGBOX vai fazer o seu papel. Se clicar em NÃO, sairemos da rotina e o código deixará de ser executado.


Se clicar em SIM, o saque será realizado e o saldo em conta será atualizado em A1 para R$ 1700,00.



Começamos bem. Creio que você entendeu como precisamos estar atentos à necessidade de elaboração de testes capazes de garantir o perfeito funcionamento do programa. Seguindo este raciocínio, vamos aprofundar o assunto nos próximos exemplos.

9.2. Formatando células com FOR-EACH-NEXT

No tópico 7.3, 1º EXEMPLO, aprendemos a usar a estrutura FOR-EACH-NEXT para exibir o nome das planilhas de uma pasta de trabalho. No 3º EXEMPLO, vimos como inserir valores e formatá-los em um intervalo de células. Vamos agora, criar um código capaz de identificar determinado número em uma planilha, formatando-o de acordo com nossas preferências. Vamos lá.

Na planilha de exemplos, crie a Plan6 e digite os números abaixo:




Criaremos um código que identifique todo o número 5 nesta planilha, aplicando a formatação desejada. Veja como vai funcionar.





CÓDIGO PARA COPIAR

Sub FormatandoForEachNext92()

'A variável que receberá a planilha
Dim Planilha As Worksheet
'Esta variável receberá um intervalo de células
Dim Celula As Range
'Associamos a variável planilha a Plan6
Set Planilha = Worksheets("Plan6")

'Criamos um bloco. Tudo que for digitado em WITH e END WITH, dirá respeito a Plan6
With Planilha
'Para cada Celula entre A1:F20
For Each Celula In Range("A1:F20")
    'Se o valor de uma destas céluas for 5, vamos aplicar as formatações abaixo.
    If Celula.Value = 5 Then
    'Criamos um bloco só para as células que vamos formatar
    With Celula
    'Mudaremos o tamanho da fonte
    .Font.Size = 22
    'Negritamos o valor
    .Font.Bold = True
    'Formatamos italic
    .Font.Italic = True
    'Definimos a cor azul
    .Font.Color = RGB(0, 0, 255)
    'O interior da celula será amarelo
    .Interior.ColorIndex = 6
    End With
   
    End If
   
Next

End With

End Sub


Veja o resultado:




Perceba que somente as células com o número 5 sofreram modificações, conforme o código elaborado.

9.3. Identificando números pares e ímpares

Vamos criar um código para identificar os números pares e ímpares inseridos em uma INPUTBOX. Neste exemplo, vamos usar um operador matemático que não conhecemos ainda, o MOD, que tem a função de identificar o resto de uma divisão.

Para identificarmos os números pares, precisamos verificar se os mesmos, divididos por 2, apresentam resto igual a 0. Caso positivo, teremos um número par. Se o resto for 1, teremos um número ímpar.




CÓDIGO PARA COPIAR

Sub IdentificaParImpar93()

'Variável que receberá os números digitados na INPUTBOX.
Dim Numero As Integer
'Este fará a contagem do número de vezes que o FOR - NEXT irá ser excecutado
Dim Contador As Integer
'Esta variável, receberá a mensagem que será exibida no final do código.
Dim Mensagem As String

'Preenche a variável mensagem com o texto que será mostrado no final.
Mensagem = "NÚMEROS DIGITADOS: " & Chr(13) & Chr(13)
'Para o contador que rodará de 1 a 5 de um em um.
For Contador = 1 To 5 Step 1
'Permitiremos a digitação de um número por fez na INPUTBOX.
Numero = InputBox("Digite um número: ", "IDENTIFICA PAR/IMPAR")
'Verificamos se este número que foi digitado é par. Para isto, usamos MOD que é uma função
'do VBA
    'MOD tem a função de verificar se o resto da divisão de um número por 2 será 0 ou 1.
    'Caso 0, o número será par, do contrário será ímpar
    If (Numero Mod 2 = 0) Then
    'Caso seja par, pegaremos a mensagem que está na variável de mesmo nome e exibiremos no final
    'do código.
    Mensagem = Mensagem & Numero & "  Par" & Chr(13)
    'Do contráio, se for ímpar
    Else
    'Emitiremos uma mensagem semelhante a anterior, porém, para os números impares.
    Mensagem = Mensagem & Numero & "  Impar" & Chr(13)
    End If
'Fechamos o LOOP
Next
'Agora emitimos a mensagem no final do código, identificando os números pares e impares.
MsgBox Mensagem
End Sub


Clique em F5. O formulário será aberto. Digite os números 7, 9, 2, 5, 6 e clique em OK.




O resultado será este:



O operador MOD cumpriu o seu papel, todos os números foram identificados corretamente.

9.4. Reajuste salarial

Neste próximo código, veremos na prática a diferença de formatação dos LOOPS da estrutura DO WHILE/UNTIL – LOOP. Vamos usar duas formatações diferentes para tornar clara a compreensão.





CÓDIGO PARA COPIAR

Sub ReajusteSalarial() 'EXCELECIA.BLOG@GMAIL.COM
Dim Salario As Double
Dim Reajuste As Double
'Esta formatação, não exige que a variável SALARIO possua algum valor. Isto, por que
'ela ordena que o código seja executado primeiro(LEMBRA DO CAPITAL NASCIMENTO!), sendo a verificação realizada depois,
'ou seja, faça tudo quantas vezes for preciso, até que o salário digitado seja maior que 0(Zero)
Do
    'Nesta caixa de entrada vamos digitar o salário
    Salario = InputBox("Digite o valor do salário: ", "REAJUSTE SALARIAL")
    If Salario < 0 Then
    MsgBox "Não é permitido digitar um salário menor que 0(Zero)"
    End If
Loop Until Salario > 0
Reajuste = -1
'Esta estrutura, exige que a variável reajuste possua algum valor, pois do contrário o LOOP
'não se iniciará. Ela diz: Faça enquanto Reajuste for menor que 0(Zero), porém, como você
'já percebeu, a INPUTBOX ainda não foi aberta para digitarmos o valor do reajuste e é por isto
'que forçamos a variável como Reajuste = -1 para entrarmos no LOOP. Aqui fica claro a diferença
'entre as duas formatações de LOOP utilizadas.
Do While Reajuste < 0
'Nesta caixa, digitaremos o reajuste
Reajuste = InputBox("Digite o valor do reajuste: ", "REAJUSTE SALARIAL")
    If Reajuste < 0 Then
    MsgBox "Não é permitido reajuste menor que 0 (Zero)"
    End If
Loop
'Agora vamos fazer os cálculos. Como você sabe, para encontrarmos um número que será ajustado em
'X por cento, precisamos primeiro transformar este percentual em número índice. Por que? Por que números
'percentuais são apenas representativos, por exemplo: 10% de 100 = 10, porém, 10% de 1000 = 100, ou seja
'queremos apenas, a 10ª parte de um número qualquer. Então para reajustarmos nosso salário, precisamos
'dividir o reajuste por 100(daí percentual) e somar 1. Por que? Imagine, se dividirmos 10/100, teriamos
'0,10. Quando multiplicarmos o valor do salário por este índice, teremos a 10ª parte dele, porém, se
'somarmos ao índice 1, teremos 1,10, assim qualquer número multiplicado a este índice terá o proprio
'valor(por causa do 1) e mais a 10ª parte(0,10).
Reajuste = Reajuste / 100 + 1
'Finalmente, é só pegar o valor do salário que foi digitado na INPUTBOX e multiplica-lo pelo índice
'de reajuste.
Salario = (Salario * Reajuste)
'Exibimos o resultado.
MsgBox Salario
End Sub


Aperte F5. Agora digite o salário de R$ 310,00 para ser reajustado, teclando ENTER para continuar.




Vamos reajustá-lo em 30%.





O cálculo será realizado e o valor imprimido em uma MSGBOX. Moleza!!!



9.5. Reajuste por faixa salarial

Já criamos um sistema para reajustar salários. Porém, no dia-a-dia, você pode ser obrigado a criar um sistema que reajuste os salários, considerando determinadas faixas salariais.

O LOOP que criaremos agora é daqueles perigosos, que se infinitos, podem travar o sistema. Para impedirmos que isto aconteça, precisaremos criar um FLAG, qualquer palavra ou número, que sendo digitada, finalize o sistema.

Vamos criar o sistema observando os seguintes critérios:

SALÁRIO                                                                                       REAJUSTE

MENOR/IGUAL A R$ 545,00                                                               30%
ENTRE R$ 545,00 E R$ 1.000,00                                                          20%
ENTRE R$ 1.000,00 E R$ 2.000,00                                                         5%
ACIMA DE R$ 2.000,00                                                                        Sem aumento.

Então, se o salário do funcionário for menor/igual a R $545,00, vamos reajustá-lo em 30%. Caso o salário seja maior que R$ 545,00 e menor/igual a R$ 1.000,00, aumentaremos em 20%. Para salários maiores que R$ 1.000,00 e menores/igual a R$ 2.000,00, o reajuste será de 5%. Finalmente, se o salário for maior que R$ 2.000,00, não haverá reajuste. O cara vai reclamar, mas fazer o que? Foi o chefe quem mandou.

Para terminar a execução do nosso sistema, vamos definir a palavra “FIM” em letras maiúsculas.

Uma consideração importante neste exemplo é sobre a declaração da variável. Perceba que o salário é numérico, porém, a palavra FIM não. Por isto, declaramos a variável Sal como Variant, que pode receber os dois tipos.

Mãos à obra.




CÓDIGO PARA COPIAR


Sub ReajusteFaixaSalarial()

'Declaramos a variável que receberá o valor do salário. Ela será do tipo Variant, pois
'receberá tanto valores numéricos como letras.
Dim Sal As Variant

'Começamos um LOOP que só será finalizado, quando digitarmos a palavra FIM.
Do
'Abrimos uma CAIXA DE ENTRADA para receber o valor que será armazenado na variável.
Sal = InputBox("Digite o salário!", "REAJUSTE POR FAIXA SALARIAL")
    'Começamos um LOOP que impedirá a entrada de valores menores que zero.
    Do While Sal <= 0
    MsgBox "Digite um valor maior que 0(Zero)!!!"
    Sal = InputBox("Digite o salário!", "REAJUSTE POR FAIXA SALARIAL")
    Loop

'Agora é só fazer as verificações e pronto.
If Sal <= 545 Then
MsgBox "Salario reajustado:  " & FormatCurrency(Sal * 1.3)
ElseIf Sal > 545 And Sal <= 1000 Then
MsgBox "Salario reajustado:  " & FormatCurrency(Sal * 1.2)
ElseIf Sal > 1000 And Sal <= 2000 Then
MsgBox "Salario reajustado:  " & FormatCurrency(Sal * 1.05)
ElseIf Sal > 2000 Then
MsgBox "Não há reajuste para este salário!"
End If
Loop Until Sal = "FIM"

End Sub


Agora é fazer os testes. Deixo com você!


9.6. Soma Números

Vamos criar um código capaz de somar todos os números inseridos em uma INPOUTBOX. Para tanto, usaremos um LOOP. Porém, precisamos criar uma consistência, para impedir que o usuário insira um número negativo, e para isto, usaremos a estrutura condicional.




CÓDIGO PARA COPIAR

Sub SomaNumeros() 'EXCELECIA.BLOG@GMAIL.COM
'Variável que receberá o número que será digitado na INPUTBOX.
Dim Numero As Variant
'Esta variável acumulará a soma dos números digitados.
Dim Soma As Variant

'Mandamos os códigos serem executados sem fazer nenhum teste por enquanto. Simplesmente, Faça.
Do
'Recebe a digitação
Numero = InputBox("Insira um número: ", "SOMA NÚMEROS")
'Se o número digitado for menor do que 0, começamos de novo até que o usuário digite um número
'válido.
If Numero < 0 Then

MsgBox "Digite um número maior que 0(Zero)!"
'se o número digitado for negativo, então zeramos a variável número para receber outro valor
Numero = 0
End If
'Agora é só efetuar a soma.
Soma = Val(Soma) + Val(Numero)
'Usamos um FLAG para finalizar
Loop While Numero <> "FIM"
'Exibimos o resultado da soma
MsgBox "O Resultado da soma: " & Soma

End Sub

Faça o teste. Tecle Alt + F5 para iniciar o sistema. Na INPUTBOX, digite 1, click em enter. Digite 2, click em enter. Digite 27 e click em enter. Para finalizar, digite FIM. O resultado será este.







9.7. Excluindo dados da planilha

Algo muito importante que devemos aprender a fazer é excluir automaticamente as linhas da planilha quando for necessário.

Faça uma planilha como esta. Use números que quiser.



Suponha que você deseja criar um LOOP que percorra a planilha excluindo as linhas cujo número seja menor que 10.

Antes de continuarmos, click com o botão direito na barra superior do Excel e ative a CAIXA DE FERRAMENTAS DE CONTROLE.




Feito isto, vamos inserir um botão na planilha.



Dê dois clicks no botão que acabamos de criar para acessar o seu evento click e digite o código abaixo




Vamos voltar à planilha. Na CAIXA DE FERRAMENTAS DE CONTROLE, click no botão MODO DE DESIGN para sairmos do ambiente de desenvolvimento e podermos acionar a ação do botão quando for clicado.




Agora é só clicar no botão. Verá que todas as linhas que possuírem números menores que 10 serão excluídas.

É isso pessoal! Fizemos muitos exemplos utilizando os diversos tipos de LOOPS. Acredito que você conseguiu compreender a utilização dos códigos e sua aplicação nas mais diversas situações do dia-a-dia. Vamos agora, aprender um pouco sobre a construção de funções no Excel, com o uso do VBA. Até logo!!!


10. CRIANDO FUNÇÕES PERSONALIZADAS COM VBA

Qualquer usuário do Excel sabe o que é uma função. Em todos os cursos básicos oferecidos, aprendemos as funções SOMA(), SOMASE(), CONT.SE() e por ai em diante.

Estas funções são fornecidas prontas pelo aplicativo e só precisamos digitar o operador “=” antes de qualquer uma delas para que elas cumpram o seu papel.

Neste ponto do nosso curso, você já deve ter percebido o poder da programação VBA para criar e desenvolver recursos que vão além dos que o Excel nos oferece. Podemos criar, desde uma função simples que calcule o valor do ICMS a pagar, considerando-se uma determinada , até uma função complexa de verificação do DV de um CPF.

A dinâmica de desenvolvimento das funções é a mesma dos Sub-procedimentos que criamos até aqui. A única diferença, é que nas funções, começamos com Public Function e Finalizamos com End Function.

Não vamos perder muito tempo com as funções, pois o raciocínio de desenvolvimento é o mesmo dos Sub-procedimentos. Iremos criar algumas para exemplificar.


10.1. Criando uma função para calcular ICMS.

Suponha que você tenha um pequena empresa, uma negoção que comercialize bala de goma, pipoca e balão. Até rimou! KKK.

Você registrou suas vendas em uma planilha é quer saber qual seria o valor do ICMS de cada venda. Então vamos lá! Eis a planilha de vendas.





Agora veja como é simples criar a função. Abra o editor do VBA(Alt + F11). No módulo, digite o código abaixo. Se tiver dúvidas sobre Modulo veja o item 4.1. Abrindo o Editor do VBA.



Veja como o código é simples. Agora vamos fazer os testes na planilha. Deixe a célula D2 selecionada e click em inserir função.



Click em FUNÇÕES DEFINIDAS PELO USUÁRIO e depois em ICMS.






O formulário argumentos da função será aberto. Em valor, digite B2 e em Taxa, C2. Finalmente, click em OK.






Perceba que o valor do ICMS será calculado pela função que acabados de criar. Pronto, agora é só copiar a formula para as demais células.






Bem simples! Vamos criar outras funções para você entenda melhor. Até lá!

10.2. Criando uma função para descobrir o valor que originou o ICMS

Algumas pessoas me perguntaram como descobrir o valor principal que originou o ICMS nas notas fiscais. Simples, porém, não se engane. Se multiplicarmos o valor total por 0,18 encontraremos apenas 18% do mesmo. Então, o que fazer? Por exemplo! Se o valor da venda for R$ 300,00 sem ICMS, para acrescentarmos o mesmo, precisamos fazer 300 x 1,18, sendo o valor total de R$ 354,00. Então, se quisermos saber o valor original, é só fazer o processo inverso, ou seja, 354/1,18, retornando o valor de R$ 300,00.

Moral da história! Uma nota com valor final de R$ 354,00, tem o valor do ICMS de R$ 54,00, que é 18% de R$ 300,00 e não R$ 63,72, que é 18% de R$ 354,00. Sabendo isto, você não corre o risco de pagar ou fazer retenções indevidas.

Vamos criar uma função que faça este cálculo automaticamente. Você pode usar a mesma planilha do exemplo anterior, é só mudar o título da célula D1 para VALOR ORIGINAL. Lembre-se, usaremos os mesmos números, porém, estamos falando de uma coisa completamente diferente, estaremos supondo que os valores da coluna 2 já estão cheios e calcularemos o valor inicial na coluna 4. Então vamos lá.


Veja o código. Muito simples! Não há muito que dizer.



Agora é só fazer o teste como no exemplo anterior.

10.3. Verificando a autenticidade do CPF

Vamos criar uma função capaz de verificar se um dado número de CPF é valido ou não. Para tanto, precisamos entender a lógica do cálculo. É importante saber, que o raciocínio de calculo do DV(Digito Verificador) do CPF é de domínio público e todos os programadores, de qualquer linguagem o utilizam para validar CPF em seus sistemas.

Entenda a lógica da coisa! Imagine que lhe foi dado número do CPF, 590.465.719-90. Como saber se este número é valido ou não?

Para se calcular o DV, precisamos considerar que o cálculo é feito inicialmente, com os 9 primeiros números do CPF. Para facilitar, veja a tabela abaixo.




Colocamos os números do CPF e identificamos suas posições. Vamos fazer os primeiros cálculos.

Iremos multiplicar os valores de cada dígito do CPF, da esquerda para direita, começando com 10 e progredindo de forma decrescente. Finalmente, achamos o resultado que usaremos para verificar a validade do CPF.



Somamos os valores encontrados e teremos 269.

O CPF é composto por 11 números(9 + 2(DV)). Então, vamos pegar o valor que encontramos e dividir por 11, sendo 269/11 = 24,45, resto 5.

O raciocínio do cálculo é simples. Seguiremos a seguinte regra: se o resto for 0 ou 1, então o DV será igual a 0. Caso contrário, o número do DV será 11 menos o resto encontrado.

No nosso caso, o primeiro número do DV será 11 – 5 = 6.

Vamos agora, encontrar o segundo DV. Para isto, vamos reformular a tabela anterior, acrescentando o número que encontramos.



Perceba, já que encontramos o primeiro dígito, que multiplicamos o 1º número por 11 progredindo decrescentemente como na tabela anterior. Veja que na 10ª posição, colocamos o número que encontramos para o primeiro DV.

Fazendo a soma, teremos 327/11 = 29,72, resto 8. Da mesma forma, 11-8 = 3.

Pronto, o DV deste CPF deveria ser 63 e não 90. O correto é 590.465.719-63

Veja como ficou o código:



Vamos fazer os testes. Digite a fórmula do CPF na célula B1 como mostra a figura. Na célula A1, digite o CPF incorreto, que a função retornará INVALIDO. Nas células de baixo digite o número correto e veja o resultado.




Depois de ver o funcionamento básico das funções, vamos aprender uma pouco mais sobre os objetos do Excel.

11. TRABALHANDO COM OBJETOS

Vamos começar aprender a trabalhar com os objetos do Excel e usar os conhecimentos que adquirimos até o momento para manipulá-los.

Estes conhecimentos são muito importantes, pois o tempo todo trabalharemos com as COMBOBOX, LISTBOX, CHECBOX, OPTIONBUTTON, COMMANDBUTTON entre outros.

11.1. Criando um LOOP para preencher uma COMBOBOX


As COMBOBOXS são muito utilizadas nos sistemas criados em programação VBA. Precisamos aprender a utilizar bem esta ferramenta, se quisermos criar bons programas.

Muitas vezes, precisamos preencher uma COMBOBOX com dados que estão em uma planilha. Veja o exemplo abaixo.




Crie um formulário com esta carinha.




Dê dois clicks nele, perceba que o evento padrão do formulário será o click, porém, vamos construir nosso algoritmo dentro do INITIALIZE, que é o evento que é ativado assim que o formulário é aberto.



Agora click em F5. Veja que a COMBOBOX foi preenchida com os dados que estão na planilha.

Nenhum comentário:

Postar um comentário

Visualizações do blog

Seguidores

About

Ads 468x60px

Blogger templates