quinta-feira, 29 de setembro de 2011

PLANILHA DE EXEMPLOS ATUALIZADA.

     
Pessoal!!! A planilha de exemplos foi atualizada. Para baixar clique aqui!

  

8.1. Código para inserir dados por formulários(2º EXEMPLO)


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.



CÓDIGO PARA COPIAR

Private Sub CommandButton1_Click()
'Declaramos a variável que receberá a planilha
Dim Planilha As Worksheet
'Declaramos uma variável que registrará o número da linha que o dado digitado no formulário será salvo.
'Ela servirá ainda como um contador que será incrementado todas as vezes que clicarmos no botão.
Dim Linha As Integer
'Informamos ao VBA, qual será a planilha que usaremos.
Set Planilha = Worksheets("plan4")

'Criamos um bloco para trabalharmos com a planilha selecionada. Tudo que estiver dentro deste bloco estará
'relacionado à Plan4.
With Planilha
'Agora, algo muito importante. Nossa variável Linha terá a função de identificar qual é a última linha
'utilizada na planilha. A propriedade UsedRange identifica a ultima celula que está sendo utilizada, fazendo
'uma contagem das linhas Rows.Count. Como queremos a linha subsequente para salvarmos os dados, diremos
'que será a última linha + 1.
Linha = .UsedRange.Rows.Count + 1
'Fazemos uma referência a 1ª linha e 1ª coluna da plan4, dizendo que o nome ou valor que será salvo nesta célula,
'será o mesmo digitado na caixa de texto que criamos
.Cells(Linha, 1).Value = Me.TextBox1.Value
End With
'Limpamos a textbox1 para que possamos começar nova digitação
Me.TextBox1.Value = ""
'Voltamos o foco automaticamente para a textbox1
Me.TextBox1.SetFocus
End Sub

 
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.

Para acessar o curso completo Clique aqui

terça-feira, 27 de setembro de 2011

8.1. Código para inserir dados por formulários(1º EXEMPLO)

Atualizado!!!

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?

Para acessar o curso completo Clique aqui

segunda-feira, 26 de setembro de 2011

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

Mais uma atualização do curso! Vamo que Vamo!!!

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:





Para acessar o curso completo Clique aqui

quarta-feira, 21 de setembro de 2011

7.3. Estrutura FOR – EACH – NEXT (5º EXEMPLO)

Achei que hoje não conseguiria atualizar o curso! Ufa!!!


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!!!!


Para acessar o curso completo Clique aqui

terça-feira, 20 de setembro de 2011

7.3. Estrutura FOR – EACH – NEXT(4º EXEMPLO)

Mais uma atualização do curso VBA Excel


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.


Para acessar o curso completo Clique aqui

segunda-feira, 19 de setembro de 2011

7.3. Estrutura FOR – EACH – NEXT(3º EXEMPLO)

Ai Galera! Segue o 3º exemplo da estrutura FOR-EACH-NEXT. Let's Go!!!


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


Para acessar o curso completo Clique aqui

domingo, 18 de setembro de 2011

7.3. Estrutura FOR – EACH – NEXT (2º EXEMPLO)

7.3. Estrutura FOR – EACH – NEXT


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

Para acessar o curso completo Clique aqui

quinta-feira, 15 de setembro de 2011

7.3. Estrutura FOR – EACH – NEXT (CONTINUAÇÃO DO CAPÍTULO 7)

Segue mais uma atualização do capítulo 7. Iniciamos uma nova estrutura! Devagazim a gente chega lá!!!!

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.


Para acessar o curso completo Clique aqui

quarta-feira, 14 de setembro de 2011

7.2.4. DO - LOOP UNTIL (CONTINUAÇÃO DO CAPÍTULO 7)


Pessoal!!! Mais uma atualização do nosso curso. Até a próxima!

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


Para acessar o curso completo Clique aqui

terça-feira, 13 de setembro de 2011

7.2.3. DO UNTIL – LOOP(CONTINUAÇÃO DO CAPÍTULO 7)


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.


Para acessar o curso completo Clique aqui

domingo, 11 de setembro de 2011

7.2.2. DO – LOOP WHILE (CONTINUAÇÃO DO CAPÍTULO 7)

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!!!

Para acessar o curso completo Clique aqui

quinta-feira, 8 de setembro de 2011

EXEMPLOS DO CURSO DE PROGRAMAÇÃO VBA

Pessoal! Segue a planilha de exemplos do curso de programação VBA. Clique aqui!

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

Pessoal! Segue mais uma atualização do nosso curso.

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


Para acessar o curso completo Clique aqui

domingo, 4 de setembro de 2011

7. ESTRUTURAS DE REPETIÇÃO


É isto aí pessoal! Mais uma parte do nosso curso. Vem muito mais pela frente. Logo, logo estarei compilando uma apostila com um conteúdo muito mais aprofundado.

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.



Para acessar o curso completo Clique aqui