sexta-feira, 31 de março de 2017

Funções no VBA

Funções no VBA
Algumas funções presentes no Excel facilitam muito a nossa vida na hora de realizarmos algumas tarefas, como por exemplo as funções de soma, pesquisa entre outras, essas funções estão presentes em quase todas as planilhas que criamos, o que não sabemos e que elas também existem no VBA e que podemos fazer uso delas facilitando algumas funções. Vamos ver abaixo algumas delas:

Função SOMASE no VBA
Use a função SOMASE para somar os valores em um intervalo que atendem ao critério que você especificar. Por exemplo, suponha que em uma coluna que contém números, você deseja somar apenas os valores maiores que 5. É possível usar a seguinte fórmula: =SOMASE(B2:B25;">5")


No VBA nós vamos usa-las da seguinte maneira:


SOMASE = WorksheetFunction.SumIf(Range("A:A"),  "B", Range("C:C"))


 Essa função vai fazer exatamente igual a função SOMASE do Excel, somando de um intervalo de celular apenas aquelas que atendam a um critério pré-determinado.

Função SOMASES no VBA
A função SOMASES, é uma das funções de matemática e trigonometria, nela adiciona-se todos os seus argumentos que atendem a vários critérios e faz a soma desejada. Ela funciona basicamente como a SOMASE, porém nesta é possível adicionar mais de um critério a soma. Por exemplo, você usaria SOMASES para somar o número de revendedores no país que residem em um único CEP e cujos lucros excedem um valor em específico. Por Exemplo: =SOMASES(A2:A9;B2:B9;"25990000";C2:C9;"1000")

No VBA nós vamos usa-las da seguinte maneira:


SOMASES = WorksheetFunction.SumIfs(Range("A:A"), Range("B:B"), "B", Range("C:C"), "X")

Essa função vai fazer exatamente igual a função SOMASES do Excel, somando de um intervalo de celular apenas aquelas que atendam aos critérios pré-determinado.

Função PROCV no VBA
Use a função PROCV, uma das funções de pesquisa e referência, quando precisar localizar algo em linhas de uma tabela ou de um intervalo. Por exemplo, para pesquisar o preço de uma peça automotiva pelo número da peça. A sua estrutura funciona da seguinte maneira:

=PROCV(Valor que você deseja pesquisar, intervalo no qual você deseja pesquisar o valor, o número da coluna no intervalo contendo o valor de retorno, Correspondência Exata ou Correspondência Aproximada – indicado como 0/FALSO ou 1/VERDADEIRO). Por Exemplo: =PROCV(D13;B2:E11;3;FALSO)


No VBA nós vamos usa-las da seguinte maneira:



PROCV =

Application.WorksheetFunction.VLookup(ComboBox2,Sheets("Plan").Range("A:B"), 2, False)

Essa função vai retornar um valor procurado de acordo com determinado critério tornando mais simples executar uma pesquisa no VBA.

Vídeo explicativo: Disponível em breve.

segunda-feira, 27 de março de 2017

Preenchendo uma ListBox via VBA

Preenchendo uma ListBox
Muitas vezes quando trabalhamos com programação se faz necessário criar interfaces mais agradáveis ao usuário final a fim de facilitar a utilização das ferramentas criadas. Com isso muitas vezes é necessário que criar listas de seleção, carregar dados, fazer filtros, entre outros a fim de levar ao usuário uma escolha dentre uma lista de opções.

As ListBox, também conhecidas como caixa de listagem, são itens usados especialmente para essa função, através delas o usuário pode listar itens dentro de um critério determinado por ele. Na Figura 1 temos um exemplo de ListBox.

Figura 1: Exemplo de ListBox

Mas como fazer uso dessas caixas de listagem, bom não é um bicho de sete cabeças e você vai aprender agora como preenche-las.

Nas fases abaixo vamos aprender como preencher essas ListBox para serem usadas de acordo com a sua necessidade. Vamos a ela:

1º Fase:
Abra o Visual Vasic for Applications do seu Excel e crie uma UserForm, em seguida insira uma ListBox, uma ComboBox, um CommandButoon e uma Label conforme figura acima. As dimensões e nomes a serem dados aos botões fica a critério do usuário, no nosso caso não houve nenhuma alteração nestes itens na ListBox informar no campo ColumnCount em propriedades da ListBox que ela deve ter 5 colunas.

2º Fase:
Para aprendermos como preencher essa listagem vamos usar o critério de Uf do cliente em um pequeno banco de dados de clientes. Com isso a primeira coisa a se fazer é determinar onde estará o critério para seleção, que no nosso caso vai se uma Combobox com as Uf dos clientes.
Para isso iremos criar um código na form na ação inicialize da UserForm de acordo com os passos abaixo:

Na ação inicialize da UserForm digitaremos o código da seguinte forma: primeiro digita-se o nome da ComboBox seguido de “.RowSourse =” depois entre aspas digita-se o nome da planilha onde esta as informações que devem estar listadas na ComboBox seguido do código para achar a última linha preenchida da coluna conforme exemplo abaixo.

ComboBox1.RowSource = "Plan2!A1:A" & Sheets("planilha").Range("A1").End(xlDown).Row

Nesse código irá preencher a ComboBox com os dados da planilha até a última linha preenchida da coluna selecionada da planilha informada.

3º Fase:
Chegou a hora de preencher a ListBox, para isso nós vamos usar uma estrutura de repetição, a saber a estrutura Do While... Loop, e uma estrutura de decisão, a saber a estrutura If...Else... End If, afim de preencher a ListBox apenas com os dados requeridos. Vamos a o nosso código:

A primeira coisa a se fazer é criar a estrutura de repetição. Para isso iremos usar a estrutura Do While... Loop para que o nosso código possa percorrer todo nosso banco de dados.
Nesse comando nós estamos informando para estrutura que ela deve repetir o código enquanto a linha verificada da planilha “Bco_Dados” for diferente de vazio.

Sub GerarRelatório()

Dim linha as Integer

linha = 2

Do While Sheets("Bco_Dados").Cells(linha, 1) <> ""

   linha = linha + 1
Loop

End Sub

Note que criamos também uma variável chamada “linha” do tipo inteira para que possa informar a nossa estrutura de repetição qual a linha que ela está verificando, para isso também é necessário que nós incrementemos essa variável, ou seja, somemos mais 1 a cada vez que ela passar pelo Loop, fazendo com que na primeira vez a variável “linha” seja 2, depois 3, depois 4 e assim por diante até que a linha verificada esteja vazia, a fim de não gerar um Loop infinito, pois ele nunca sairia da linha 2, e com isso travar o sistema.

Note que demos um valor inicial de 2 para variável linha, isso foi feito porque nosso banco de dados começa a seu preenchimento a partir da linha 2.

4º Fase
Chegou a hora de adicionarmos nossa estrutura de decisão, a estrutura If...Else...End If, com ela nós vamos verificar se a linha atende nosso critério ou não, onde caso atenda o código exibe as informações na nossa ListBox caso não atenda e não mostra.
Na nossa comparação estamos pesquisando na aba “Bco_Dados” por Uf do cliente onde sé exibirá o cliente que for da Uf selecionada.

Note que ele está fazendo a comparação na célula referente a variável linha da coluna 4 que é a coluna de Uf.

Sub GerarRelatório()

Dim linha as Integer

linha = 2

Do While Sheets("Bco_Dados").Cells(linha, 1) <> ""
If Sheets("Bco_Dados").Cells(linha, 4) = ComboBox1 Then

Else

End if
   linha = linha + 1
Loop

End Sub

5º Fase
Chegou a hora de informar o que fazer caso a linha pesquisada atenda nosso critério do relatório, no nosso caso se atender o critério queremos que as informações sejam exibidas na ListBox.

Vimos que nosso banco de dados é composto de 5 colunas, com isso precisaremos escrever 5 linhas de comando para podermos levar as 5 colunas para nosso ListBox, uma para cada coluna. Para isso iremos usar o seguinte código:

Sub Relatório()

Dim linha as Integer

linha = 2

'Limpar ListBox
ListBox1.Clear

'Preencher ListBox
Do While Sheets("Bco_Dados").Cells(linha, 1) <> ""
If Sheets("Bco_Dados").Cells(linha, 4) = ComboBox1 Then
    With ListBox1
        .AddItem
        .List(linhalistbox, 0) = Sheets("Bco_Dados").Cells(linha, 1)
        .List(linhalistbox, 1) = Sheets("Bco_Dados").Cells(linha, 2)
        .List(linhalistbox, 2) = Sheets("Bco_Dados").Cells(linha, 3)
        .List(linhalistbox, 3) = Sheets("Bco_Dados").Cells(linha, 4)
        .List(linhalistbox, 4) = Sheets("Bco_Dados").Cells(linha, 5)
    End With
    linhalistbox = linhalistbox + 1
End If
linha = linha + 1
Loop

End Sub

No código acima estamos informando que caso atenda nosso critério de seleção nosso código deve exibir na ListBox na linhalistbox coluna 0 os dados que estão na aba “Bco_Dados” célula linha coluna 1 e assim sucessivamente, uma para cada coluna, lembrando de mudar a coluna a cada uma das 5 linha de código digitada.

Nós usamos, também, o comando With com a propriedade AddItem, informando que ele deve escrever na ListBox os dados da linha de comando abaixo atpe o End With.

Note que aqui nós criamos uma outra variável inteira de nome “linhalistbox”, isso foi feito para que nossa ListBox não tenha linhas em branco, por isso criamos outra variável de nome “linhalistbox” para representar as linhas da ListBox, porque nem sempre os dados que queremos vão estar um debaixo do outro, com isso caso usássemos a variável “linha” teriam espações em branco dentro da nosso ListBox, lembrando que essa variável também tem que ser incrementada com 1 a cada vez que nosso critério for atendido afim de que o código não subscreva por cima de um item já levado para a ListBox.

quinta-feira, 23 de março de 2017

Preenchendo uma ComboBox

Preenchendo uma ComboBox
Muitas vezes quando trabalhamos com programação se faz necessário criar interfaces mais agradáveis ao usuário final a fim de facilitar a utilização da ferramenta criada. Com isso muitas vezes é necessário que criemos listas de seleção quando queremos que o usuário faça uma escolha dentre uma lista de opções pré-determinadas.

As ComboBox, também conhecidas como caixa de seleção, são itens usados especialmente para essa função, através delas o usuário pode escolher um item dentro de uma lista pré-determinada ao clicar em uma seta ao lado da caixa de seleção. Na Figura 1 temos um exemplo de ComboBox.

Figura 1: Exemplo de ComboBox

Mas como fazer uso dessas caixas de seleção, bom não é um bicho de sete cabeças e você vai aprender agora como preenche-las.

Vamos mostrar três formas de preencher essas ComboBox que poder ser usadas de acordo com a sua necessidade, vamos a ela:

1º Forma:
A primeira e mais simples forma se se preencher uma ComboBox e utilizando a janela de propriedade da ComboBox no canto inferior esquerdo da tela.

Ao selecionar a ComboBox onde deseja que tenha a lista suspensa vá na janela propriedades da ComboBox, la você irá encontrar uma propriedade chamada RowSource nessa propriedade digite entre aspas o nome da planilha seguido do sinal de “!” e o intervalo onde estão os valores que devem estar na ComboBox conforme abaixo:

"planilha!A2:A10"

O problema dessa forma é que ela mostra onde começa e onde termina o intervalo que deve estar listado na ComboBox.

2º Forma:
A segunda forma é parecida com a primeira, porém, ela será digitada não na janela de propriedade, mas sim como código na form na ação inicialize da UserForm.
Nessa forma podemos verificar também que nós não limitamos o intervalo de uma célula a outra, mas sim até a última célula preenchida. Para isso a ação inicialize da UserForm digitaremos o código da seguinte forma: primeiro digita-se o nome da ComboBox seguido de “.RowSourse =” depois entre aspas digita-se o nome da planilha onde esta as informações que devem estar listadas na ComboBox seguido do código para achar a última linha preenchida da coluna conforme exemplo abaixo.

ComboBox1.RowSource = "Plan2!A1:A" & Sheets("planilha").Range("A1").End(xlDown).Row

Nesse código será preenchido até a última linha preenchida da coluna da planilha informada.

3º Forma:
A terceira forma é a mais complexa e complete forma de se preencher a ComboBox. Nela nós vamos usar uma estrutura de repetição, a saber a estrutura Do While... Loop, afim de preencher a ComboBox.

Para isso usaremos a estrutura Do While... Loop para preencher a nossa ComboBox informando que ele deve adicionar os dados da linha da vez enquanto ela não estiver vazia, ou seja, enquanto a estrutura estiver repetindo ela estará preenchendo a ComboBox conforme código abaixo. Lembrando que nessa estrutura de repetição temos que usar uma variável para representar a linha da tabela a qual estaremos incrementando a cada Loop executado.

lin = 1
Do While Sheets("Plan2").Cells(lin, 1) <> ""
  ComboBox2.AddItem Sheets("Plan2").Cells(lin, 1)
  lin = lin + 1
Loop

Para preencher uma ComboBox as três formas acima funcionaram, cada uma com a sua particularidade, estando com o programador a escolha do que lhe melhor atende naquele momento.

quarta-feira, 22 de março de 2017

Gerar Relatório Via VBA

Gerar Relatório Via VBA
Através da programação em VBA nós podemos deixar nossas rotinas do Excel cada vez mais fáceis. Vamos aprender ao longo desse artigo como gerar um relatório via VBA a partir de um banco de dados do Excel com critérios que podem varia conforme necessitarmos.

Para podermos gerar nosso relatório temos que ter um banco de dados onde estarão nossas informações e este deve estar de forma ordenada para que a consulta possa trazer as informações corretamente. Na tabela 1 você tem um exemplo de nosso banco de dados ordenado.



Tabela1: Banco de dados ordenado
Partindo do princípio que temos um banco de dados ordenado vamos a criação do relatório.
No nosso exemplo iremos criar um relatório que irá consultar um banco de dados de clientes na aba “Bco_Dados” e trazer apenas aqueles que atenderem ao nosso critério de consulta para aba “Relatório” conforme Tabela 2.

Para que isso seja possível nós vamos precisar de usar duas estruturas de programação, a primeira é a estrutura de repetição para que nosso código faça a comparação em todas as linhas da nossa tabela, a segunda estrutura que precisaremos usar é a estrutura de decisão onde nosso código vai verificar se a linha selecionada atende ao nosso critério ou não, onde caso atenda ela irá copiar os dados necessários daquela linha para o nosso relatório.

1º Passo
A primeira coisa a se fazer é limpar a aba onde recebera as informações do nosso relatório, pois ela pode estar com dados de relatórios anteriores. Para isso usaremos o seguinte código:

Sheets("Relatório").Range("A3:E1000").Clear

Nesse código nós estamos selecionando o intervalo de A3 até E1000 da aba “Relatório” e executado o comando Clear que quer dizer limpar.

Em seguida temos que criar nossa estrutura de repetição. Para isso iremos usar a estrutura Do While... Loop para que o nosso código possa percorrer todo nosso banco de dados.

Nesse comando nós estamos informando para estrutura que ela deve repetir o código enquanto a linha verificada da planilha “Bco_Dados” for diferente de vazio.

Sub GerarRelatório()
Dim linha as Integer
linha = 2
Do While Sheets("Bco_Dados").Cells(linha, 1) <> ""
   linha = linha + 1
Loop
End Sub

Note que criamos também uma variável chamada “linha” do tipo inteira para que possa informar a nossa estrutura de repetição qual a linha que ela está verificando, para isso também é necessário que nós incrementemos essa variável, ou seja, somemos mais 1 a cada vez que ela passar pelo Loop, fazendo com que na primeira vez a variável “linha” seja 2, depois 3, depois 4 e assim por diante até que a linha esteja vazia, a fim de não gerar um Loop infinito, pois ele nunca sairia da linha 2, e com isso travar o sistema.

Note que demos um valor inicial de 2 para variável linha, isso foi feito porque nosso banco de dados começa a seu preenchimento na linha 2.

2º Passo
Chegou a hora de adicionarmos nossa estrutura de decisão, a estrutura If...Else...End If, com ela nós vamos verificar se a linha atende nosso critério ou não, onde caso atenda o código copia as informações para a aba “Relatório” caso não atenda e não cópia.

Na nossa comparação estamos pesquisando na aba “Bco_Dados” por clientes que tenho idade de igual a 25 anos

Note que ele está fazendo a comparação na célula referente a variável linha da coluna 3 que é a coluna de idade.

Sub GerarRelatório()
Dim linha as Integer
linha = 2
Do While Sheets("Bco_Dados").Cells(linha, 1) <> ""
If Sheets("Bco_Dados").Cells(linha, 3) = 25 Then

Else

End if
   linha = linha + 1
Loop
End Sub

3º Passo
No terceiro passo chegou a hora de informar o que fazer caso a linha pesquisada atenda nosso critério do relatório, no nosso caso se atender o critério queremos que as informações sejam copiadas para aba “Relatório”.

Vimos que nosso banco de dados é composto de 5 colunas, com isso precisaremos escrever 5 linhas de comando para podermos levar as 5 colunas para nosso relatório, uma para cada coluna. Para isso iremos usar o seguinte código:

Sub Relatório()
Dim linha as Integer
Dim linha2 as Integer

linha = 2
linha2 = 3
'Limpar relatório
Sheets("Relatório").Range("A3:E1000").Clear
'Preencher relatório
Do While Sheets("Bco_Dados").Cells(linha, 1) <> ""
If Sheets("Bco_Dados").Cells(linha, 3) = 25 Then
            Sheets("Relatório").Cells(linha2, 1) = Sheets("Bco_Dados").Cells(linha, 1)
Sheets("Relatório").Cells(linha2, 2) = Sheets("Bco_Dados").Cells(linha, 2)
Sheets("Relatório").Cells(linha2, 3) = Sheets("Bco_Dados").Cells(linha, 3)
Sheets("Relatório").Cells(linha2, 4) = Sheets("Bco_Dados").Cells(linha, 4)
Sheets("Relatório").Cells(linha2, 5) = Sheets("Bco_Dados").Cells(linha, 5)
linha2 = linha2 + 1
End If
linha = linha + 1
Loop
End Sub

No código acima estamos informando que caso atenda nosso critério de seleção nosso código deve copiar para a aba “Relatório” na célula linha2 coluna 1 os dados que estão na aba “Bco_Dados” célula linha coluna 1 e assim sucessivamente, uma para cada coluna, lembrando de mudar a coluna a cada uma das 5 linha de código digitada.

Note que aqui nós criamos uma outra variável inteira de nome “linha2” e iniciando com valor 3, isso foi feito porque nosso relatório vai começar a ser preenchido a partir da terceira linha e o fato de não usarmos a variável “linha” criada no começo é porque nem sempre os dados que queremos vão estar um debaixo do outro, com isso caso usássemos essa variável teriam espações em branco dentro do nosso relatório, lembrando que essa variável também tem que ser incrementada com 1 a cada vez que nosso critério for atendido afim de que o código não subscreva por cima de um item já levado para o banco de dados.



Tabela 2: Relatório Gerado


terça-feira, 21 de março de 2017

Downloads VBA

Declaração de Variáveis: https://1drv.ms/x/s!AkZuOfknZyfRiUFFpTpQTecz28WH

Estruturas de Decisão: https://1drv.ms/x/s!AkZuOfknZyfRiTkhXAQCsKCAAvpS

Estruturas de Repetição: https://1drv.ms/x/s!AkZuOfknZyfRiTgp5p0IlRAPoTYS

Gerar Relatório Via VBA: https://1drv.ms/x/s!AkZuOfknZyfRiUJuQFHYnVZMl_lG

Preenchendo uma ComboBox: https://1drv.ms/x/s!AkZuOfknZyfRiUzSXfWYimfVCJgR

Preenchendo uma ListBox: https://1drv.ms/x/s!AkZuOfknZyfRiU9DoAo0yhxRbUdo

Função OU

Função OU
A função OU é uma função de comparação que retorna verdadeiro ou falso. Seu funcionamento se dá da seguinte maneira: o usuário digita o sinal de “=” seguindo de OU e “(“, nesse momento você deve fazer a primeira comparação usando os operadores relacionais (<, >, =, >=, <=, <>) conforme tabela 1, em seguida digitasse “;”, agora deve ser informado a segunda comparação, esse processo pode ser feito por n vezes até que seja feita toda comparação desejada, por fim digite “)”, essa formula irá trazer verdadeiro caso uma das comparações estejam corretas ou falso caso todas estejam erradas.

Operadores Relacionais
=            Igual a
<>          Diferente
>=          Maior ou igual
>            Maior que
<            Menor que
<=          Maior ou igual
Tabela 1: Operadores Relacionais

Veja um exemplo a seguir:

Ex.: No exemplo abaixo vamos verificar a relação entre números.



No exemplo acima usamos os seguintes códigos para saber a relação entre os dois números:
=OU(1>0;1>2)
=OU(1>2;1<0)

Nos exemplos acima a função está fazendo um comparativo de valores resultou em verdadeiro no primeiro pois um dos dois comparativos foi atendido e no segundo caso como falso pois nenhum dos comparativos estava correto.

Essa função é muito usada em conjunto com a função SE como um complemento nas comparações.

Nos casos onde se é necessário fazer mais de uma comparação para se ter uma resposta se faz necessário a utilização desta função em conjunto a função SE, podendo-se fazer mais de uma comparação. Vejamos o exemplo a seguir:

Ex.: No exemplo abaixo vamos verificar se um aluno será aprovado caso tenha nota maior que 5 ou presença acima de 60%.


No exemplo acima a função está fazendo um comparativo entra as notas, onde caso a nota seja maior que 5 ou a sua presença seja maior que 60% o aluno estará aprovado.

Note que no exemplo acima com a utilização da função E junto com a SE pudemos fazer 2 comparativos, o que não seria possível se tivéssemos usado apenas a função SE.


Vídeo Explicativo: Disponível em breve.

Função E

Função E
A função E é uma função de comparação que retorna verdadeiro ou falso. Seu funcionamento se dá da seguinte maneira: o usuário digita o sinal de “=” seguindo de E e “(“, nesse momento você deve fazer a primeira comparação usando os operadores relacionais (<, >, =, >=, <=, <>) conforme tabela 1, em seguida digitasse “;”, agora deve ser informado a segunda comparação, esse processo pode ser feito por n vezes até que seja feita toda comparação desejada, por fim digite “)”, essa formula irá trazer verdadeiro caso todos as comparações estejam corretas ou falso caso alguma delas não esteja.

Operadores Relacionais
=            Igual a
<>          Diferente
>=          Maior ou igual
>            Maior que
<            Menor que
<=          Maior ou igual
Tabela 1: Operadores Relacionais

Veja um exemplo a seguir:
Ex.: No exemplo abaixo vamos verificar a relação entre números.

No exemplo acima usamos os seguintes códigos para saber a relação entre os dois números:
=E(2<5;6>3)

No exemplo acima a função está fazendo um comparativo de valores resultou em verdadeiro pois o número 2 é menor que o 5 e o número 6 é maior que o 3.

Essa função é muito usada em conjunto com a função SE como um complemento nas comparações.

Nos casos onde se é necessário fazer mais de uma comparação para se ter uma resposta se faz necessário a utilização desta função em conjunto a função SE, podendo-se fazer mais de uma comparação. Vejamos o exemplo a seguir:

Ex.: No exemplo abaixo vamos verificar se um aluno está reprovado, em recuperação ou foi aprovado a partir de sua nota.


No exemplo acima a função está fazendo um comparativo entra as notas onde caso a nota seja menor ou igual a 4 o aluno está reprovado, caso a nota seja maior que 4 e menor que 6 o aluno está em recuperação e caso a nota seja maior que 6 o aluno está aprovado.

Note que no exemplo acima com a utilização da função E junto com a SE pudemos fazer 3 comparativos, o que não seria possível se tivéssemos usado apenas a função SE.

Vídeo Explicativo: Disponível em breve.