Blog

Postado em em 29 de outubro de 2021

Sistema de Controle para Empresas em Excel VBA

Hoje eu quero mostrar para vocês um Sistema de Controle para Empresas e nas próximas aulas vou te ensinar a construir ele do zero!

Esta é uma aula de introdução, vou te apresentar aqui todo o projeto. A partir da próxima aula vamos começar a construir o Sistema de Controle começando do ZERO!

Aula disponíveis

Introdução – Sistema de Controle para Empresas em Excel VBA

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo!

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Fala, galera da Hashtag! Hoje nós vamos dar início a uma nova série de VBA: a Série Controle para Empresas.

Na aula de hoje vamos te apresentar o sistema de controle para empresas Excel, onde vamos utilizar um formulário no Excel, para te mostrar como fazer controle de empresas.

Nesse sistema de controle no Excel você vai poder acessar o menu de compras, vendas, estoque, caixa e até DRE.

E aí, está preparado para aprender como fazer automação no Excel com VBA para ter o seu controle de empresas no Excel?

Então vamos pra aula que você vai poder construir o seu próprio sistema e fazer todas as modificações que precisar para atender suas necessidades de controle!

Menu

Abaixo temos o nosso menu de botões, que vai acessar as “páginas” que preparamos, com funções específicas: Compras, Vendas, Estoque, Caixa e DRE. Veja abaixo:

Sistema de Controle para Empresas

Cada uma possui uma especificidade e função que vai te ajudar a controlar as atividades da sua empresa!

Compras

A página de compras vai nos proporcionar cadastrar e ter uma lista de produtos que pretendemos comprar ou de fato compramos de diversos fornecedores.

Nela teremos ID do produto, Data de Pagamento, Data de Competência, Fornecedor (nome), Produto (nome) e Quantidade.

Controlando as compras, saberemos as quantidades que já temos compradas, histórico, fornecedores mais frequentes, por exemplo. Veja abaixo:

Sistema de Controle para Empresas

Vendas

A página de vendas vai nos proporcionar cadastrar e ter uma lista de produtos que vendemos para diversos clientes.

Nela teremos ID do produto, Data de Pagamento, Data de Competência, Cliente (nome), Produto (nome) e Quantidade.

Controlando as vendas, saberemos as quantidades que já temos vendidas, histórico dessas operações, clientes mais frequentes, por exemplo. Observe:

Sistema de Controle para Empresas

Estoque

A página de estoque vai nos proporcionar o resumo entre as operações de compra e venda das páginas anteriores, onde cadastramos essas compras e vendas, respectivamente.

Nela teremos o resumo de cada produto individualmente: quantidade comprada, vendida, e o que ficou em estoque daquele produto específico após essas operações.

Importantíssimo controle da empresa, para poder fazer futuras vendas, futuras compras e controlar o estoque perante os fornecedores e clientes. Suporta a decisão de quando comprar, se pode vender e a quantidade que pode vender.

4 1

Caixa

A página do caixa vai conter todas as movimentações feitas na nossa planilha/sistema. Todo registro de vendas e compras, além de algumas despesas do dia a dia da sua empresa.

Assim, tem em um local, tudo que aconteceu na sua empresa.

5 1

DRE

A página da DRE (Demonstração do Resultado de Exercício) vai conter um resumo-resultado contendo o que sua empresa gastou e recebeu proveniente das atividades da empresa.

Assim, representa um resultado final das operações da sua empresa.

Te dará, ao final do processo, o lucro/prejuízo líquido das atividades. Observe como é composto:

6 1

Hoje eu vou dar início ao Controle para Empresas Aula1 e nessa aula eu já vou te ensinar a construir a estrutura da planilha que vamos usar!

Voltar para o índice

Aula 1 – Controle para Empresas – Construindo a Estrutura da Planilha

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo!

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Esse é o Controle para Empresas Aula1 da nossa Série e nessa aula nós vamos te mostrar como construir a estrutura da planilha inicial.

Então vou te ensinar como formatar tabela no Excel e como usar fórmulas básicas no Excel já para fazer alguns cálculos que vamos precisar.

Dessa forma você vai aprender como criar planilhas no Excel com todas as informações que precisa, podendo alterar para a sua empresa.

Assim vai conseguir criar controles para empresas no Excel e fazer suas alterações para deixar um sistema mais personalizado para sua própria empresa!

E aí, animado para começar essa nova série e construir mais um projeto irado em VBA? Então vamos pra aula que essa série vai juntar conhecimentos de outras séries que temos aqui no canal!

Criando as abas

  • Inicialmente vamos criar as abas, clicando no ícone “+” na barra inferior do Excel.
  • Daremos duplo clique para modificar o nome dessas abas novas criadas
  • As abas terão os nomes: Compras, Vendas, Estoque, Caixa, DRE
Abas

Aba Compras

Nela teremos ID do produto, Data de Pagamento, Data de Competência, Fornecedor (nome), Produto (nome), Quantidade e Custo Total.

Essas informações irão servir de base para a página do formulário que montaremos na série, mais pra frente.

Observe um exemplo feito abaixo na aula:

Compras

Aba Vendas

Nela teremos ID do produto, Data de Pagamento, Data de Competência, Cliente (nome), Produto (nome), Quantidade, Valor da Venda, Custo Unitário e Custo da Venda.

Essas informações irão servir de base para a página do formulário que montaremos na série, mais pra frente.

Observe um exemplo feito abaixo na aula:

Vendas

Aba Estoque

Nela teremos o resumo de cada produto individualmente: quantidade comprada, vendida, e o que ficou em estoque daquele produto específico após essas operações.

Essas informações irão servir de base para a página do formulário que montaremos na série, mais pra frente.

Observe um exemplo feito abaixo na aula:

Estoque

Aba Caixa

A página do caixa vai conter todas as movimentações feitas na nossa planilha/sistema. Todo registro de vendas e compras, além de algumas despesas do dia a dia da sua empresa.

Ela terá as informações de ID, Data do Pagamento, Data de Competência, Descrição, Tipo Conta, Valor e Status.

Essas informações irão servir de base para a página do formulário que montaremos na série, mais pra frente.

Observe um exemplo feito abaixo na aula:

Controle para Empresas Aula1

Aba DRE

Essas informações irão servir de base para a página do formulário que montaremos na série, mais pra frente.

Nele teremos a Receita Bruta, Deduções da Receita, Receita Líquida, CMV (Custo de Mercadorias Vendidas), Resultado Bruto, Despesas Operacionais, Resultado antes do Imposto de Renda (I.R.), I.R. e Resultado Líquido.

Observe um exemplo feito abaixo na aula:

Controle para Empresas Aula1

Abaixo mostramos as fórmulas que compõem a estrutura do nossos DRE.

As células que estão como valor seguem como valor, e as células que começam com um “=” estão com uma fórmula em seu interior. Acompanhe:

Controle para Empresas Aula1

OBS: Formatações diversas

Em todas as abas usamos a formatação da cor de fundo da célula (popularmente conhecido como “baldinho”) e colocamos a fonte na cor branca, e com tipo negrito ativado. Observe:
Format

Formatamos também o tipo de dado na célula de acordo com o tipo desejado, como Data, Moeda, Número inteiro, Número com casas decimais, e deixamos algumas como Geral.

Lembrando que para alterar o tipo de dado de uma célula utilizamos o atalho Ctrl+1.

Voltar para o índice

Aula 2 – Controle para Empresas – Construindo a Base do Formulário

Hoje no Controle para Empresas Aula2 eu vou te mostrar como construir a base do seu formulário para dar forma ao nosso sistema!

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo!

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Essa é a segunda aula da nossa série, nela iremos construir a base do nosso formulário apresentado nas aulas anteriores (e que será incrementado nas próximas aulas).

Nessa parte você vai aprender como inserir objetos no formulário. Dentre esses objetos temos:

  • caixa de texto
  • caixa de listagem
  • seleção
  • botão de seleção
  • rótulo
  • caixa de combinação
  • entre outros objetos

Outro ponto muito importante que eu vou te mostrar é como salvar arquivo com macro no Excel, pois toda vez que você utilizar o VBA tem que mudar o tipo do arquivo.

Vai mudar para Pasta de Trabalho Habilitada para Macro do Excel, dessa forma vai conseguir salvar e utilizar seu arquivo normalmente.

Vamos então para o conteúdo do post de hoje!

Criando o UserForm

Para criar o UserForm, precisamos:

  • primeiramente abrir o ambiente VBA, a partir do atalho do teclado Alt(+Fn)+F11
  • iremos criar um novo formulário indo no menu superior em Inserir > UserForm.

Nesse momento se abrirá a tela dentro do ambiente do VBA o nosso UserForm, na forma de uma minicaixa vazia (cinza) que tem escrito UserForm1 em seu cabeçalho (por padrão).

Essa visualização é, de fato, o nosso formulário na forma embrionária. Observe abaixo:

UserForm no VBA
UserForm no VBA


OBS:
Repare que, toda vez que tocamos no formulário, a Caixa de ferramentas aparece como um pop-up (janela flutuante no canto inferior esquerdo, na imagem acima) para nos auxiliar. Ela que nos permitirá criar os objetos que iremos inserir no formulário.

Caso você clique no formulário e a caixa de ferramentas não esteja “aberta”, basta ir em Exibir > Caixa de ferramentas.

Customização do nosso formulário

Para customizar o nosso formulário conforme queremos, iremos utilizar a caixa de ferramentas várias vezes, além do menu de Propriedades do UserForm, localizado no canto inferior esquerdo do ambiente do VBA.

0) Tamanho do formulário

No seu canto inferior direito, no “quadrado” branco, vamos clicar e arrastar para dimensionarmos o userfom do tamanho que queremos que ele fique, ao final.

1) Mudar o seu nome (nome do objeto)

O primeiro passo é sempre mudar o nome do nosso UserForm. Por padrão ele virá com “UserForm1”. É importante mudar o nome para um nome intuitivo, porque, ao criar os códigos em VBA que vão utilizar o formulário, precisaremos escrever seu nome dentro do código.

Para fazer isso, iremos no menu de propriedades procurar por (Name), dar duplo clique na segunda coluna e colocar o nome como “ControleDaEmpresa”. Repare que o nome não pode ter caractere espaço (pode ser uma alternativa utilizar o “_”).

2) Título do formulário

Primeiramente iremos mudar o título/cabeçalho do nosso formulário, que por padrão vem como “UserForm1”. Iremos clicar no formulário, procurar no menu de propriedades pela propriedade Caption.

Em seguida, dar duplo clique no que estiver na coluna da direita (das duas possíveis do menu de propriedades), apagar o que estiver escrito (normalmente UserForm1) e escrever o que queremos. No caso, usaremos como Caption “Controles da Empresa”. Repare que aqui podemos escrever qualquer coisa, inclusive o caractere espaço.

3)  Objeto multi-página

Para criar objetos, usaremos a caixa de ferramentas. Vamos criar um objeto multi-página para o nosso formulário ao escolher “Multi-página” na caixa de ferramentas.

Iremos clicar dentro do nosso UserForm com o botão esquerdo do mouse, e redimensionar (arrastando o mouse e soltando) a multi-página de acordo com o tamanho que queremos.

Após isso, com ela selecionada, podemos mudar:

  • o que está na propriedade Height para 426
  • o que está na propriedade Width para 486
  • o que está na propriedade Left para 0
  • o que está na propriedade Top para 0
  • o que está na propriedade (Name) para BlocoDeAbas

Observe o formulário após aplicar mudanças nas etapas anteriores:

Formulário VBA
Formulário VBA


4) Modificar as páginas

Agora precisamos modificar cada página do nosso objeto multi-página criado. Para isso, iremos:

  • Clicar em cada cabeçalho de cada página
  • Mudar a propriedade (Name) para cada página: AbaMenu, AbaCompras, AbaVendas, AbaEstoque, AbaDRE
  • Mudar a propriedade Caption para: Menu, Compras, Vendas, Estoque, DRE
  • Para criar uma nova página (que não existe), clique com botão direito no cabeçalho de cada página e escolha Nova página

Como faço para ver meu formulário?

Para ver como nosso formulário “está” no ambiente do Excel, é só apertar nele (ou dar duplo clique nele no menu de hierarquia do VBA, no canto superior esquerdo, dentro da pasta “Formulários”) e ir ao ícone de play (>) na parte superior do VBA ou pelo atalho do teclado F5.

Dê uma olhada como fica no nosso exemplo, após de todas as mudanças da aula:

Como criar formulário no VBA
Como criar formulário no VBA

Salvar arquivo habilitado para macro

Para salvar a planilha com o formato .xlsm, você deve:

  • Ir em Arquivo > Salvar como > Modificar o formato do arquivo para Pasta de Trabalho Habilitada para Macro do Excel (*.xlsm).

Voltar para o índice

Aula 3 – Controle para Empresas – Parte Visual do Formulário

Hoje no Controle para Empresas Aula3 nós vamos iniciar a parte visual do formulário para inserir todos os elementos necessários!

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo!

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Fala, pessoal! Estamos na terceira aula da nossa série, nessa aula nós vamos nos propor a construir a parte visual da aba de compras do formulário.

Como ainda estamos na parte de como criar formulário no VBA, precisamos montar toda a estrutura visual que será utilizada e apresentada na hora de fazer os controles mais na frente da série.

Vamos te mostrar como inserir rótulo no formulário, que nada mais é do que um “título” ou texto que será mostrado ao usuário que é fixo. Vamos utilizá-lo justamente para identificar as informações do formulário.

Em seguida vamos aprender como inserir caixa de texto no VBA, que é onde o próprio usuário vai poder ver ou escrever as informações de fato.

E, por fim, como inserir caixa de listagem no VBA. Essa ferramenta vai permitir o usuário visualizar e selecionar as informações disponíveis.

E aí, vamos seguir com a construção do nosso formulário?

Acessando o UserForm

Para acessar o UserForm, precisamos:

  • abrir o ambiente VBA, a partir do atalho do teclado Alt(+Fn)+F11
  • clicar, no menu à esquerda, no formulário de nome “ControleDaEmpresa”

Customização do nosso formulário

Para customizar o nosso formulário conforme queremos, iremos utilizar a caixa de ferramentas várias vezes, além do menu de Propriedades do UserForm, localizado no canto inferior esquerdo do ambiente do VBA.

OBS: Repare que, toda vez que tocamos no formulário, a Caixa de ferramentas aparece como um pop-up (janela flutuante no canto inferior esquerdo, na imagem acima) para nos auxiliar. Ela que nos permitirá criar os objetos que iremos inserir no formulário.

Caso você clique no formulário e a caixa de ferramentas não esteja “aberta”, basta ir em Exibir > Caixa de ferramentas.

A descrição de ações a seguir dizem respeito à criação dos primeiros objetos criados e formatados dentro do formulário.

A partir da criação de um primeiro objeto de um tipo (rótulo, caixa de texto, botão de comando e caixa de listagem), copiaremos esse objeto (dando Ctrl+C no objeto selecionado e Ctrl+V dentro do formulário) inteiro e apenas modificaremos pouca coisa, preservando já o trabalho feito e a forma criada.

Rótulo

Precisaremos inserir rótulos, que serão os “títulos” dos nossos dados que aparecem no formulário, de fato.

Para isso, temos que, com a caixa de ferramenta aberta:

  • Clicar no 2º ícone que aparece (letra “A”)
  • Clicar dentro do formulário com o botão esquerdo
  • Arrastar para dimensionar do tamanho que queremos e soltar o mouse
Rotulo

Personalizando o rótulo:

  • Mudaremos sua propriedade Caption para “ID:” (e para os outros, respectivamente: “Data P.:”, “Data C.:”, “Fornecedor:”, “Produto:”, “Quantidade:”, “Custo Total:”, “Conta:” e “Status:”)
  • Mudaremos sua propriedade Font de forma a colocar a letra em Negrito e tamanho 15. Como faremos para o primeiro e replicaremos para o outro, só faremos no primeiro essa modificação

Caixa de texto

Precisaremos inserir algumas caixas de texto, que serão os “espaços” específicos em que estarão escritos os nossos dados.

Para isso, temos que, com a caixa de ferramenta aberta:

  • Clicar no 3º ícone que aparece (letra “A”)
  • Clicar dentro do formulário com o botão esquerdo
  • Arrastar para dimensionar do tamanho que queremos e soltar o mouse
  • Quando replicarmos as caixas de texto, vamos redimensionar do tamanho desejado para cada “tipo” de dado esperado nas caixinhas (de ID será menor por esperar um número menor, a de Fornecedor e Produto será maior, por exemplo por esperarem um nome maior)

Botão de comando

Precisaremos inserir alguns botões de comando, que nas próximas aulas vão acionar os nossos códigos e interagir com as caixas de texto e a caixa de listagem criadas.

Para isso, temos que, com a caixa de ferramenta aberta:

  • Clicar no 2º ícone que aparece na 2ª linha da caixa de ferramentas (caixinha escrito “ab”)
  • Clicar dentro do formulário com o botão esquerdo
  • Arrastar para dimensionar do tamanho que queremos e soltar o mouse
Controle para Empresas Aula3

Personalizando o botão de comando (CommandButton):

  • Mudaremos sua propriedade Font de forma a colocar a letra de tamanho 12. Como faremos para o primeiro e replicaremos para o outro, só faremos no primeiro essa modificação
  • Mudaremos sua propriedade Caption do primeiro botão para “Menu” (e dos outros para “Adicionar”, “Excluir”, “Alterar” e “Limpar”)
  • Mudaremos sua propriedade BackColor para uma cor escura (especificamente: &H00404040&), para representar a cor de fundo do botão se destacar perante ao formulário
  • Também mudaremos a sua propriedade ForeColor para uma cor clara (especificamente: &H00FFFFFF&), para representar a cor de “frente” do botão se destacar perante ao fundo escuro aplicado

Caixa de listagem

Precisaremos inserir alguns botões de comando, que nas próximas aulas vão acionar os nossos códigos e interagir com as caixas de texto e a caixa de listagem criadas.

Para isso, temos que, com a caixa de ferramenta aberta:

  • Clicar no 5º ícone da caixa de ferramentas (miniatura que contém duas setas azuis – uma para cima e outra para baixo)
  • Clicar dentro do formulário com o botão esquerdo
  • Arrastar para dimensionar do tamanho que queremos e soltar o mouse
Controle para Empresas Aula3

Ao final da criação dos objetos, nosso formulário ficará da seguinte maneira:

Controle para Empresas Aula3
Formulário VBA

Voltar para o índice

Aula 4 – Controle para Empresas – Parte Visual da Aba de Vendas

Hoje no Controle para Empresas Aula4 nós vamos criar a parte visual da aba de vendas do formulário para termos tudo organizado!

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo!

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Essa é a quarta aula (Controle para Empresas Aula4) da nossa série, nessa aula nós vamos construir a parte visual da aba de vendas do formulário.

Essa parte é um pouco mais fácil porque nas aulas anteriores você já viu como inserir rótulo no formulário, como inserir caixa de texto, como inserir caixa de listagem…

Dessa vez nós vamos apenas copiar o que já fizemos, colar na aba de vendas e fazer as alterações necessárias, até porque as abas possuem informações bem parecidas.

Dessa forma você pode evitar ter que fazer todo o trabalho de novo, e vai precisar apenas modificar alguns dos rótulos para ajustar ao conteúdo dessa aba.

Por questão de didática vamos tornar a explicar como inserir os objetos também, caso seja de sua vontade aprender ou relembrar os passos.

Acompanhe com a gente!

Acessando o UserForm

Para acessar o UserForm, precisamos:

  • abrir o ambiente VBA, a partir do atalho do teclado Alt(+Fn)+F11
  • clicar, no menu à esquerda, no formulário de nome “ControleDaEmpresa”

Customização do nosso Formulário VBA

Para customizar o nosso formulário conforme queremos, iremos utilizar a caixa de ferramentas várias vezes, além do menu de Propriedades do UserForm, localizado no canto inferior esquerdo do ambiente do VBA.

OBS: Repare que, toda vez que tocamos no formulário, a Caixa de ferramentas aparece como um pop-up para nos auxiliar. Ela que nos permitirá criar os objetos que iremos inserir no formulário.

Caso você clique no formulário e a caixa de ferramentas não esteja “aberta”, basta ir em Exibir > Caixa de ferramentas.

As descrições de ações a seguir dizem respeito à criação dos objetos criados e formatados dentro do formulário, que é um espelho (já criado na aula 3).

Página de Vendas

A partir da criação de um primeiro objeto de um tipo da página de Compras apresentado na aula anterior (rótulo, caixa de texto, botão de comando e caixa de listagem), copiaremos esses objetos (dando Ctrl+C no objeto selecionado e Ctrl+V dentro do formulário) inteiros.

Vamos apenas modificar poucas coisas, preservando já o trabalho feito e a forma criada.

Caso você não se lembre como fazer para criar os objetos do zero, vamos te ensinar a seguir.

Como inserir rótulo no formulário

Precisaremos inserir rótulos, que serão os “títulos” dos nossos dados que aparecem no formulário, de fato.

Para isso, temos que, com a caixa de ferramenta aberta:

  • Clicar no 2º ícone que aparece (letra “A”)
    Rotulo 1
  • Clicar dentro do formulário com o botão esquerdo
  • Arrastar para dimensionar do tamanho que queremos e soltar o mouse

Personalizando o rótulo:

  • Mudaremos sua propriedade Caption para “ID:” (e para os outros, respectivamente: “Data P.:”, “Data C.:”, “Cliente:”, “Produto:”, “Quantidade:”, “Valor da Venda:”, “Conta:”, “Status:”, “Custo U.” e “Custo V.”)
  • Mudaremos sua propriedade Font de forma a colocar a letra em Negrito e tamanho 15. Como faremos para o primeiro e replicaremos para o outro, só faremos no primeiro essa modificação
  • Posicionaremos os rótulos mais ou menos como na página de Compras, e na melhor distribuição que julgarmos

Como inserir caixa de texto no VBA

Precisaremos inserir algumas caixas de texto, que serão os “espaços” específicos em que estarão escritos os nossos dados.

Para isso, temos que, com a caixa de ferramenta aberta:

  • Clicar no 3º ícone que aparece
    cxtxt 1
  • Clicar dentro do formulário com o botão esquerdo
  • Arrastar para dimensionar do tamanho que queremos e soltar o mouse
  • Quando replicarmos as caixas de texto, vamos redimensionar do tamanho desejado para cada “tipo” de dado esperado nas caixinhas (de ID será menor por esperar um número menor, a de Fornecedor e Produto será maior, por exemplo por esperarem um nome maior)

Botão de comando

Precisaremos inserir alguns botões de comando, que nas próximas aulas vão acionar os nossos códigos e interagir com as caixas de texto e a caixa de listagem criadas.

Para isso, temos que, com a caixa de ferramenta aberta:

  • Clicar no 2º ícone que aparece na 2ª linha da caixa de ferramentas (caixinha escrito “ab”)
    btcmd 1
  • Clicar dentro do formulário com o botão esquerdo
  • Arrastar para dimensionar do tamanho que queremos e soltar o mouse

Personalizando o botão de comando (CommandButton):

  • Mudaremos sua propriedade Font de forma a colocar a letra de tamanho 12. Como faremos para o primeiro e replicaremos para o outro, só faremos no primeiro essa modificação
  • Mudaremos sua propriedade Caption do primeiro botão para “Menu” (e dos outros para “Adicionar”, “Excluir”, “Alterar” e “Limpar”)
  • Mudaremos sua propriedade BackColor para uma cor escura (especificamente: &H00404040&), para representar a cor de fundo do botão se destacar perante ao formulário
  • Também mudaremos a sua propriedade ForeColor para uma cor clara (especificamente: &H00FFFFFF&), para representar a cor de “frente” do botão se destacar perante ao fundo escuro aplicado

Como inserir caixa de listagem no VBA

Precisaremos inserir alguns botões de comando, que nas próximas aulas vão acionar os nossos códigos e interagir com as caixas de texto e a caixa de listagem criadas.

Para isso, temos que, com a caixa de ferramenta aberta:

  • Clicar no 5º ícone da caixa de ferramentas (miniatura que contém duas setas azuis – uma para cima e outra para baixo)
    cxlist 1
  • Clicar dentro do formulário com o botão esquerdo
  • Arrastar para dimensionar do tamanho que queremos e soltar o mouse

Ao final dos procedimentos citados ficaremos com a seguinte formatação:

Controle para Empresas Aula4
Como criar formulário no VBA

Além desses procedimentos de criação de objetos, precisaremos dar nomes aos nossos objetos para preparar o formulário futuramente para os códigos.

É extremamente importante identificar/nomear cada objeto de forma correta, porque futuramente eles serão referenciados ou citados no código, e eles serão atores fundamentais nos códigos executados.

Portanto, para nomear cada objeto, vamos seguir a seguinte lógica:

  • Objetos de caixa de texto começarão com o prefixo “Cx”
  • Objetos de caixa de listagem começarão com CxListagem
  • Objetos botão de comando começarão com “Bt”
  • No meio: cada função/nome identificador
  • Ao final referenciaremos cada página ao final (Compras, Vendas, por exemplo)

Observe os objetos e seus respectivos nomes:

Controle para Empresas Aula4
1) CxIDVendas
2) CxDataPVendas
3) CxDataCVendas
4) CxClienteVendas
5) CxProdutoVendas
6) CxQuantidadeVendas
7) CxValorVendaVendas
8) CxContaVendas
9) CxStatusVendas
10) CxCustoUVendas
11) CxCustoVVendas
12) CxListagemVendas

Para os botões, teremos: BtMenuVendas, BtAdicionarVendas, BtExcluirVendas, BtAlterarVendas e BtLimparVendas.

OBS: Vamos fazer essa mesma nomeação da mesma forma e lógica que fizemos acima (respeitando o tipo do objeto, a função e o nome da página) para a aba de Compras.

Voltar para o índice

Aula 5 – Controle para Empresas – Finalizando a Parte Visual do Formulário

Hoje no Controle para Empresas Aula5 nós vamos finalizar a parte visual do formulário para depois configurar cada um dos elementos!

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo!

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Essa é a quinta aula (Controle para Empresas Aula5) da série, nessa aula nós vamos finalizar a parte visual do formulário no VBA.

Como já fizemos nas outras aulas esse processo fica muito mais fácil agora que já conhece todas as ferramentas.

Como as estruturas são bem parecidas nós vamos copiar caixa de listagem, rótulos, caixas de texto para que possamos finalizar as abas que ficaram faltando.

Com isso vamos terminar a parte visual e agora você já deve estar sabendo das ferramentas básicas utilizadas para a construção de um formulário, não é mesmo?

Essa parte é muito importante, pois é a parte visual que é onde o usuário vai interagir com esse controle, então precisamos que todas as informações estejam corretas!

Claro que você sempre vai poder fazer alterações no formulário caso precise!

Acompanhe com a gente!

Acessando o UserForm

Para acessar o UserForm, precisamos:

  • abrir o ambiente VBA, a partir do atalho do teclado Alt(+Fn)+F11
  • clicar, no menu à esquerda, no formulário de nome “ControleDaEmpresa”

Customização do nosso Formulário VBA

Para customizar o nosso formulário conforme queremos, iremos utilizar a caixa de ferramentas várias vezes, além do menu de Propriedades do UserForm, localizado no canto inferior esquerdo do ambiente do VBA.

OBS: Repare que, toda vez que tocamos no formulário, a Caixa de ferramentas aparece como um pop-up para nos auxiliar. Ela que nos permitirá criar os objetos que iremos inserir no formulário.

Caso você clique no formulário e a caixa de ferramentas não esteja “aberta”, basta ir em Exibir > Caixa de ferramentas.

As descrições de ações a seguir dizem respeito à criação dos objetos criados e formatados dentro do formulário, que é um espelho (criado na aula 3 e também na Aula 4 da Série).

Página de Caixa

A partir da criação de um primeiro objeto de um tipo da página de Compras e Vendas apresentados nas aulas anteriores (rótulo, caixa de texto, botão de comando e caixa de listagem), copiaremos esses objetos (dando Ctrl+C no objeto selecionado e Ctrl+V dentro do formulário) inteiros.

Vamos apenas modificar poucas coisas, preservando já o trabalho feito e a forma criada.

Mas, para você que não sabe ou quer relembrar, vamos aos passos necessários para criar as formas/objetos.

Como inserir rótulo no formulário

Precisaremos inserir rótulos, que serão os “títulos” dos nossos dados que aparecem no formulário, de fato.

Para isso, temos que, com a caixa de ferramenta aberta:

  • Clicar no 2º ícone que aparece (letra “A”)
    Rotulo 1
  • Clicar dentro do formulário com o botão esquerdo
  • Arrastar para dimensionar do tamanho que queremos e soltar o mouse

Personalizando o rótulo:

  • Mudaremos sua propriedade Caption para “ID:” (e para os outros, respectivamente: “Data P.:”, “Data C.:”, “Descrição:”, “Tipo:”, “Conta:”, “Status:” e “Valor”)
  • Mudaremos sua propriedade Font de forma a colocar a letra em Negrito e tamanho 15. Como faremos para o primeiro e replicaremos para o outro, só faremos no primeiro essa modificação
  • Posicionaremos os rótulos mais ou menos como na página de Compras, e na melhor distribuição que julgarmos

Como inserir caixa de texto no VBA

Precisaremos inserir algumas caixas de texto, que serão os “espaços” específicos em que estarão escritos os nossos dados.

Para isso, temos que, com a caixa de ferramenta aberta:

  • Clicar no 3º ícone que aparece
    cxtxt 1
  • Clicar dentro do formulário com o botão esquerdo
  • Arrastar para dimensionar do tamanho que queremos e soltar o mouse
  • Quando replicarmos as caixas de texto, vamos redimensionar do tamanho desejado para cada “tipo” de dado esperado nas caixinhas (de ID será menor por esperar um número menor, a de Fornecedor e Produto será maior, por exemplo por esperarem um nome maior)

Botão de comando

Precisaremos inserir alguns botões de comando, que nas próximas aulas vão acionar os nossos códigos e interagir com as caixas de texto e a caixa de listagem criadas.

Para isso, temos que, com a caixa de ferramenta aberta:

  • Clicar no 2º ícone que aparece na 2ª linha da caixa de ferramentas (caixinha escrito “ab”)
    btcmd 1
  • Clicar dentro do formulário com o botão esquerdo
  • Arrastar para dimensionar do tamanho que queremos e soltar o mouse

Personalizando o botão de comando (CommandButton):

  • Mudaremos sua propriedade Font de forma a colocar a letra de tamanho 12. Como faremos para o primeiro e replicaremos para o outro, só faremos no primeiro essa modificação
  • Mudaremos sua propriedade Caption do primeiro botão para “Menu” (e dos outros para “Adicionar”, “Excluir”, “Alterar” e “Limpar”)
  • Mudaremos sua propriedade BackColor para uma cor escura (especificamente: &H00404040&), para representar a cor de fundo do botão se destacar perante ao formulário
  • Também mudaremos a sua propriedade ForeColor para uma cor clara (especificamente: &H00FFFFFF&), para representar a cor de “frente” do botão se destacar perante ao fundo escuro aplicado

Como inserir caixa de listagem no VBA

Precisaremos inserir alguns botões de comando, que nas próximas aulas vão acionar os nossos códigos e interagir com as caixas de texto e a caixa de listagem criadas.

Para isso, temos que, com a caixa de ferramenta aberta:

  • Clicar no 5º ícone da caixa de ferramentas (miniatura que contém duas setas azuis – uma para cima e outra para baixo)
    cxlist 1
  • Clicar dentro do formulário com o botão esquerdo
  • Arrastar para dimensionar do tamanho que queremos e soltar o mouse

Ao final dos procedimentos citados ficaremos com a seguinte formatação:

Além desses procedimentos de criação de objetos, precisaremos dar nomes aos nossos objetos para preparar o formulário futuramente para os códigos.

É extremamente importante identificar/nomear cada objeto de forma correta, porque futuramente eles serão referenciados ou citados no código, e eles serão atores fundamentais nos códigos executados.

Portanto, para nomear cada objeto, vamos seguir a seguinte lógica:

  • Objetos de caixa de texto começarão com o prefixo “Cx”
  • Objetos de caixa de listagem começarão com CxListagem
  • Objetos botão de comando começarão com “Bt”
  • No meio: cada função/nome identificador
  • Ao final referenciaremos cada página ao final (Compras, Vendas, por exemplo)

Página de Estoque

A página de estoque é bem simples: vamos copiar o botão de “Menu” de outra página (Compra, Vendas ou Caixa), e colaremos nessa aba.

Também aproveitaremos a forma pronta de caixa de listagem de outra página (Compra, Vendas ou Caixa), colaremos aqui na aba de Estoque e aumentaremos seu tamanho.

OBS: Da mesma forma e lógica que nomeamos os objetos nas outras páginas, faremos para essa página.

Observe nossa página de Estoque:

Controle para Empresas Aula5

Página de DRE

A página de DRE é bem simples também: vamos copiar o botão de “Menu” de outra página (Compra, Vendas ou Caixa), e colaremos nessa página duas vezes. Um vai fazer a mesma função, de ir para o Menu, e o outro para “Carregar o DRE”.

Também aproveitaremos as formas prontas de rótulo e de caixa de texto (Compra, Vendas ou Caixa), colaremos aqui na aba de Estoque e posicionaremos da melhor forma.

Por final, precisaremos criar uma nova forma: a caixa de imagem.

Objeto Imagem

Precisaremos inserir um objeto-imagem, que representará o resultado do nosso DRE no formulário, de fato.

Para isso, temos que, com a caixa de ferramenta aberta:

  • Clicar no 7º ícone que aparece na 2ª linha de objetos (miniatura de imagem)
    Imagem
  • Clicar dentro do formulário com o botão esquerdo
  • Arrastar para dimensionar do tamanho que queremos e soltar o mouse

Observe nossa página de DRE:

Controle para Empresas Aula5

OBS: Da mesma forma e lógica que nomeamos os objetos nas outras abas, faremos para essa aba.

Página de Menu

A página de DRE é bem simples também: vamos copiar o botão de “Menu” de outra aba (Compra, Vendas ou Caixa), e colaremos nessa página cinco vezes. Cada botão vai representar uma página do nosso formulário (com exceção do Menu, onde estamos).

Os botões terão os nomes de: Vendas, Compras, Estoque, Caixa e DRE.

Faremos uma única modificação em relação ao botão normal:

  • Redimensionaremos de um tamanho bem maior
  • Aumentaremos a propriedade Font para 28 e Negrito

Observe nossa página de Menu:

Controle para Empresas Aula5

OBS: Da mesma forma e lógica que nomeamos os objetos nas outras páginas, faremos para essa página.

Voltar para o índice

Aula 6 – Controle para Empresas – Iniciando a Inteligência do Formulário

Hoje no Controle para Empresas Aula6 eu vou iniciar a inteligência do formulário para que você consiga interagir com o que já criamos!

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo!

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Essa é a sexta aula da série, nela vamos começar a lidar com a inteligência do formulário no VBA.

Essa inteligência inicialmente vai ser como alterar as abas com VBA. Ou seja, como alterar as abas do formulário com o VBA para que o nosso menu seja interativo e facilite a seleção pelo usuário.

Para que a gente possa criar essa macro para o clique de um botão (executar macro ao clicar em um botão) nós vamos sempre pensar na lógica de programação no VBA.

Essa é uma parte mais inicial, e nós vamos utilizar bastante o que vamos fazer nessa aula, que é atribuir ações aos botões no VBA.

Então vamos dizer para o VBA o que vai acontecer quando a gente clicar em um botão específico, que vai consequentemente disparar uma ação.

Até o momento na série nós ajustamos a parte visual do formulário. Agora vamos ajustar a parte prática e de inteligência de códigos para deixar tudo funcionando conforme a série for avançando.

Acessando o código do formulário

Para fazer alterações no nosso formulário já criado, precisamos primeiramente abrir o ambiente de VBA, a partir do atalho do teclado Alt(+Fn)+F11. Assim poderemos continuar o nosso formulário de controle da empresa.

Mais uma vez lembrando que, para abrir o código do nosso formulário de interesse, devemos ir com o botão direito no formulário ControleDaEmpresa > exibir código.

Controle para Empresas Aula6
Como alterar as abas do formulário com VBA

Hoje vamos fazer ver os eventos que vão atuar nos cliques dos diversos botões que temos no nosso Formulário ControleDaEmpresa.

Acompanhe os eventos representados nos códigos abaixo:

Private Sub BtMenuCaixa_Click()
BlocoDeAbas.Value = 0
End Sub

 
Private Sub BtMenuCompras_Click()
BlocoDeAbas.Value = 0
End Sub

Private Sub BtMenuDRE_Click()
BlocoDeAbas.Value = 0
End Sub

Private Sub BtMenuEstoque_Click()
BlocoDeAbas.Value = 0
End Sub

Private Sub BtMenuVendas_Click()
BlocoDeAbas.Value = 0
End Sub

Private Sub BtComprasMenu_Click()
BlocoDeAbas.Value = 1
End Sub

 
Private Sub BtVendasMenu_Click()
BlocoDeAbas.Value = 2
End Sub

Private Sub BtEstoqueMenu_Click()
BlocoDeAbas.Value = 3
End Sub

Private Sub BtCaixaMenu_Click()
BlocoDeAbas.Value = 4
End Sub

Private Sub BtDREMenu_Click()
BlocoDeAbas.Value = 5
End Sub

Explicação dos códigos acima:

  • Ao clicar nos botões de Menu para as páginas Caixa, Compras, DRE, Estoque e Vendas, vamos fazer com que o nosso BlocoDeAbas (objeto multipágina do formulário) mude para a 1ª página, que possui o valor 0 como referência (repare que são 5 códigos com essa similaridade)
  • Ao clicar nos botões de Compras na página Menu, vamos fazer com que o nosso BlocoDeAbas (objeto multipágina do formulário) mude para a 2ª página, que possui o valor 1 como referência
  • Ao clicar nos botões de Vendas na página Menu, vamos fazer com que o nosso BlocoDeAbas (objeto multipágina do formulário) mude para a 3ª página, que possui o valor 2 como referência
  • Ao clicar nos botões de Estoque na página Menu, vamos fazer com que o nosso BlocoDeAbas (objeto multipágina do formulário) mude para a 4ª página, que possui o valor 3 como referência
  • Ao clicar nos botões de Caixa na página Menu, vamos fazer com que o nosso BlocoDeAbas (objeto multipágina do formulário) mude para a 5ª página, que possui o valor 4 como referência
  • Ao clicar nos botões de DRE na página Menu, vamos fazer com que o nosso BlocoDeAbas (objeto multipágina do formulário) mude para a 6ª página, que possui o valor 5 como referência

OBS: Você tem a opção de “abrir”/criar cada Private Sub quando você clicar, em duplo clique, nos botões (objetos) diretamente no formulário.

Voltar para o índice

Aula 7 – Controle para Empresas – Macro para Limpar os Campos

Hoje no Controle para Empresas Aula7 vamos criar uma macro para poder limpar os campos do formulário e facilitar para o usuário final!

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo!

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Essa é a sétima aula da série, nela vamos criar a macro para limpar as informações do formulário.

Isso é muito útil, pois não é interessante que o usuário tenha que ficar apagando as informações de uma por uma, então eu vou te ensinar como limpar campos do formulário no VBA com uma macro.

Para essa macro nós vamos utilizar conhecimentos das aulas anteriores, mas vou te mostrar a estrutura de repetição for each no VBA e como fazer comparações no VBA.

Essa comparação será feita com o IF para que você consiga verificar se uma determinada comparação é verdadeira ou falsa e para cada resultado você pode escrever um código.

Então se estiver de acordo com a sua comparação vamos apagar a caixa de texto, caso contrário podemos apenas passar para a próxima verificação!

Inserindo um módulo

Para criar um código dentro de um módulo, precisamos primeiramente abrir o ambiente de VBA, a partir do atalho do teclado Alt(+Fn)+F11. Assim poderemos de fato criar o nosso código a ser utilizado.

Como não temos nenhum módulo criado antes nessa planilha, vamos na guia Inserir > Módulo, e uma caixa branca se abrirá.

Controle para Empresas Aula6
Como criar botão para limpar no VBA

Colocaremos a seguinte sub (código), que será o objeto de estudo da aula de hoje:

Sub limparCamposDoFormulario()

Dim forma As Object

For Each forma In ControleDaEmpresa.BlocoDeAbas.Pages(ControleDaEmpresa.BlocoDeAbas.Value).Controls

    If TypeName(forma) = "TextBox" Then
        forma.Value = ""
    End If

Next

End Sub

Comentários a respeito da sub limparCamposDoformulario():

  • Vamos dimensionar a variável “forma” como um objeto. Ela vai representar cada possível objeto de cada aba/página do nosso formulário
  • Vamos utilizar de uma estrutura de repetição no VBA For Each, que vai fazer ações repetidas em uma unidade de um todo, que é formado por essas unidades.
    • No caso vamos considerar um único objeto que será representado pela variável “forma” no conjunto de objetos/controles da aba atual (onde o botão clicado de “Limpar” estará), do nosso bloco de abas (objeto multipágina) do formulário ControleDeEmpresa (leia da direita para a esquerda)
    • Vamos utiliza de uma estrutura If que vai permitir a gente ver se o tipo do nome do nosso objeto analisado é igual a “TextBox”, a cada objeto da página em questão.
    • Caso seja uma TextBox, essa comparação vai ser verdadeira, e vamos simplesmente fazer com que o valor desse objeto seja vazio, ou seja, nulo
    • E seguiremos para o próximo objeto a ser testado
    • Não havendo mais controles/objetos a analisar naquela aba/página, seguiremos o código
  • Se encerra o código

O código acima vai ser utilizado por vários botões “Limpar” do nosso formulário. Por isso criamos apenas um código dentro de um módulo específico e separado.

Vamos “chamar” esse mesmo código universal por todos os botões “Limpar”. Independentemente da página e dos nomes das caixas de textos dela, ele irá interpretar as comparações e fará a limpeza das caixas necessárias.

OBS1: Caso queira aprender mais sobre estrutura de repetição For Each, indicamos esse outro post aqui que te ensina com detalhes.

OBS2: Além disso, explicamos a estrutura If em outro post do nosso blog também de forma detalhada, caso queira conferir.

Acessando o código do formulário

Para fazer alterações no nosso formulário já criado, precisamos primeiramente abrir o ambiente de VBA, a partir do atalho do teclado Alt(+Fn)+F11. Assim poderemos continuar o nosso formulário de controle da empresa.

Mais uma vez lembrando que, para abrir o código do nosso formulário de interesse, devemos ir com o botão direito no formulário ControleDaEmpresa > exibir código.

Como alterar as abas do formulário com VBA
Como alterar as abas do formulário com VBA

Inserindo os códigos abaixo dentro dos códigos já existentes no formulário:

Private Sub BtLimparCaixa_Click()
Call limparCamposDoFormulario
End Sub

Private Sub BtLimparCompras_Click()
Call limparCamposDoFormulario
End Sub

Private Sub BtLimparVendas_Click()
Call limparCamposDoFormulario
End Sub

Explicação dos códigos acima:

  • Os três códigos (private subs separadas) acima vão simplesmente chamar (comando Call) a nossa sub criada no começo da aula de hoje, a limparCamposDoFormulario.
  • Resumidamente: os botões “Limpar”, das páginas de Caixa, Compras e Vendas vão fazer essa limpeza das caixas de texto das respectivas abas/páginas
  • Se encerram os códigos

OBS: Você tem a opção de “abrir”/criar cada Private Sub quando você clicar, em duplo clique, nos botões (objetos) diretamente no formulário.

Voltar para o índice

Aula 8 – Controle para Empresas – Atualizando a Caixa de Listagem

Hoje no Controle para Empresas Aula8 nós vamos estar atualizando a caixa de listagem da aba de compras para deixar automático!

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo!

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Essa é a oitava aula da série, nessa aula vamos atualizar caixa de listagem no formulário VBA.

Dessa forma vamos poder obter os dados de forma automática na aba de compras, e mostrar todas essas informações dentro do nosso formulário.

A ideia é te mostrar como atualizar caixa de listagem no VBA, para que esse procedimento fique automático, e o usuário já consiga visualizar tudo o que tem na aba de compras diretamente no formulário.

Vamos criar macros para formulário e nela vamos aprender como pegar última linha no VBA (última linha preenchida da tabela), como selecionar uma aba específica e algumas configurações da caixa de listagem.

Com isso vamos poder atualizar e configurar a visualização dos nossos dados dentro da caixa de listagem como se fosse uma tabela mesmo, só que dentro do formulário ao invés de visualizar dentro do Excel.

Inserindo um módulo

Para criar um código dentro de um módulo, precisamos primeiramente abrir o ambiente de VBA, a partir do atalho do teclado Alt(+Fn)+F11. Assim poderemos de fato criar o nosso código a ser utilizado na aula.

Para isso, vamos na guia Inserir > Módulo, e uma caixa branca se abrirá.

InserirModulo

Sub atualizaCaixaDeListagemCompras()

Dim abaCompras As Object
Dim ultLin As Long
 
Set abaCompras = Sheets("Compras")

ultLin = abaCompras.Range("A1000000").End(xlUp).Row

ControleDaEmpresa.CxListagemCompras.ColumnCount = 7

ControleDaEmpresa.CxListagemCompras.ColumnHeads = True

ControleDaEmpresa.CxListagemCompras.ColumnWidths = "50;120;140;90;74;74;100"

ControleDaEmpresa.CxListagemCompras.RowSource = "Compras!A2:G" & ultLin

End Sub

Explicação do código acima:

  • No começo vamos dimensionar a variável “abaCompras” como um objeto, que vai representar de fato a aba “Compras” do nosso arquivo em Excel
  • Também vamos dimensionar a variável “ultLin” como um número do tipo Long, que vai representar um número natural maior que zero que pode vir a ser grande
  • Vamos “setar”/configurar/dizer que abaCompras é o objeto que vai representar a aba “Compras” da nossa planilha. Isso se dá através do comando Set no VBA
  • Vamos descobrir a última linha preenchida da coluna A, da abaCompras, e iremos armazenar essa informação na variável “ultLin”
  • Vamos configurar a caixa de listagem contendo as informações de compras (CxListagemCompras), que vai ter 7 colunas. Repare que essa caixa de listagem está no ControleDaEmpresa, por isso o comando começa com o nome do formulário.
  • A próxima instrução irá dizer que a nossa caixa de listagem tem cabeçalho (Heads = True).
  • Em seguida iremos passar para o código a largura de cada coluna. Das 7 existentes, separadas por ponto e vírgula (;). Lembrando que isso é ajuste fino e cada usuário pode personalizar a largura como deseja.
  • A última linha do nosso código diz respeito ao carregamento de informações que a nossa caixa de listagem vai ter. A fonte de dados (RowSource) da nossa caixa de listagem será preenchida com as informações da aba “Compras”, da 2ª linha da coluna A até a última linha da coluna G, dada pela variável “ultLin” descoberta no começo do nosso código.
  • E encerra-se a nossa (primeira) sub.

Até aqui construímos o código que representa a configuração da nossa caixa de listagem da página de compras do nosso formulário.

O que queremos aqui é chamar aquela função por uma ação, que vai chamar esse código de configuração cada vez que a página de “Compras” for acionada no formulário ControleDaEmpresa.

Então iremos colocar essa função para disparar quando o nosso formulário ControleDaEmpresa for inicializado (UserForm Initialize).

Teremos uma sub privada, ou seja, que só vai funcionar dentro do código do nosso formulário, que irá chamar a sub atualizaCaixaDeListagemCompras (criada acima), e assim mostrar as informações na caixa de listagem (CxListagemCompras), quando o nosso formulário for aberto.

Acessando o código do formulário

Para fazer alterações no nosso formulário já criado, precisamos primeiramente abrir o ambiente de VBA, a partir do atalho do teclado Alt(+Fn)+F11.

Mais uma vez lembrando que, para abrir o código do nosso formulário de interesse, devemos ir com o botão direito no formulário ControleDaEmpresa > exibir código.


Inserindo os códigos abaixo dentro dos códigos já existentes no formulário

Private Sub UserForm_Initialize()
Call atualizaCaixaDeListagemCompras
End Sub

Explicação do código acima:

  • Vamos configurar uma sub privada (somente do formulário) que vai ser executada automaticamente quando o formulário for iniciado (Initialize)
  • Chamaremos a macro criada anteriormente (atualizaCaixaDeListagemCompras), que vai configurar/atualizar as informações da nossa aba “Compras” na caixa de listagem presente na página de compras do formulário, exibida em branco na imagem acima
  • Se encerra o nosso código

Após esse código ser executado, o nosso formulário vai ter a seguinte cara (quando for iniciado):

Como atualizar caixa de listagem no VBA
Como atualizar caixa de listagem no VBA

Voltar para o índice

Aula 9 – Controle para Empresas – Atualizando a Caixa de Listagem

Hoje no Controle para Empresas Aula9 vamos atualizar a caixa de listagem da aba vendas e caixa igual fizemos na aula anterior!

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo!

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Essa é a nona aula (Controle para Empresas Aula9) da série, nessa aula vamos continuar com a atualização da caixa de listagem, mas agora para outras páginas do nosso formulário.

Como na última aula nós já fizemos essa atualização, você já deve saber como atualizar caixa de listagem no VBA, não é mesmo?

Mas é sempre bom relembrar, porque a repetição acaba sendo muito boa para o aprendizado. Então vamos repetir alguns comandos da macro para essa atualização.

Além da atualização nós vamos fazer também a configuração da caixa de listagem no VBA para que as informações apareçam da forma correta e formatada.

Isso vai permitir com que o usuário consiga visualizar os dados do VBA Forms de forma eficiente sem ter que acessar os dados dentro do Excel para isso!

E aí, vamos a construção dessa macro para caixa de listagem? Lembrando que você vai poder já copiar parte do código que já fizemos e só fazer algumas alterações!

Acessando o VBA

Para modificar/criar códigos, precisamos primeiramente abrir o ambiente de VBA. A partir do atalho do teclado Alt(+Fn)+F11 conseguimos fazer isso.

Vamos em seguida acessar o módulo já criado na aula anterior chamado “modAtualizarCaixaListagem”. Com um duplo clique entramos no módulo:

Acessando

Lá vamos colocar dois novos códigos para atualizar/configurar a caixa de listagem das páginas de Vendas e Caixa do nosso formulário. Acompanhe a seguir os códigos:

Sub atualizaCaixaDeListagemVendas()

Dim abaVendas As Object
Dim ultLin As Long
 
Set abaVendas = Sheets("Vendas")

ultLin = abaVendas.Range("A1000000").End(xlUp).Row

ControleDaEmpresa.CxListagemVendas.ColumnCount = 9
ControleDaEmpresa.CxListagemVendas.ColumnHeads = True
ControleDaEmpresa.CxListagemVendas.ColumnWidths = "50;120;140;90;74;74;100;100;100"
ControleDaEmpresa.CxListagemVendas.RowSource = "Vendas!A2:I" & ultLin

End Sub

Explicação do código acima:

  • No começo vamos dimensionar a variável “abaVendas” como um objeto, que vai representar de fato a aba “Vendas” do nosso arquivo em Excel
  • Também vamos dimensionar a variável “ultLin” como um número do tipo Long, que vai representar um número natural maior que zero que pode vir a ser grande
  • Vamos “setar”/configurar/dizer que abaVendas é o objeto que vai representar a aba “Vendas” da nossa planilha. Isso se dá através do comando Set no VBA
  • Vamos descobrir a última linha preenchida da coluna A, da abaVendas, e iremos armazenar essa informação na variável “ultLin”
  • Vamos configurar a caixa de listagem contendo as informações de Vendas (CxListagemVendas), que vai ter 9 colunas. Repare que essa caixa de listagem está no ControleDaEmpresa, por isso o comando começa com o nome do formulário.
  • A próxima instrução irá dizer que a nossa caixa de listagem tem cabeçalho (Heads = True).
  • Em seguida iremos passar para o código a largura de cada coluna. Das 9 existentes, separadas por ponto e vírgula (;). Lembrando que isso é ajuste fino e cada usuário pode personalizar a largura como deseja.
  • A última linha do nosso código diz respeito ao carregamento de informações que a nossa caixa de listagem vai ter. A fonte de dados (RowSource) da nossa caixa de listagem será preenchida com as informações da aba “Vendas”, da 2ª linha da coluna A até a última linha da coluna I, dada pela variável “ultLin” descoberta no começo do nosso código.
  • E encerra-se a nossa (primeira) sub.

Sub atualizaCaixaDeListagemCaixa()

Dim abaCaixa As Object
Dim ultLin As Long

Set abaCaixa = Sheets("Caixa")

ultLin = abaCaixa.Range("A1000000").End(xlUp).Row

ControleDaEmpresa.CxListagemCaixa.ColumnCount = 8
ControleDaEmpresa.CxListagemCaixa.ColumnHeads = True
ControleDaEmpresa.CxListagemCaixa.ColumnWidths = "50;120;140;90;74;74;100;100"
ControleDaEmpresa.CxListagemCaixa.RowSource = "Caixa!A2:H" & ultLin
 
End Sub

Explicação do código acima:

  • No começo vamos dimensionar a variável “abaCaixa” como um objeto, que vai representar de fato a aba “Caixa” do nosso arquivo em Excel
  • Também vamos dimensionar a variável “ultLin” como um número do tipo Long, que vai representar um número natural maior que zero que pode vir a ser grande
  • Vamos “setar”/configurar/dizer que abaCaixa é o objeto que vai representar a aba “Caixa” da nossa planilha. Isso se dá através do comando Set no VBA
  • Vamos descobrir a última linha preenchida da coluna A, da abaCaixa, e iremos armazenar essa informação na variável “ultLin”
  • Vamos configurar a caixa de listagem contendo as informações de Caixa (CxListagemCaixa), que vai ter 8 colunas. Repare que essa caixa de listagem está no ControleDaEmpresa, por isso o comando começa com o nome do formulário.
  • A próxima instrução irá dizer que a nossa caixa de listagem tem cabeçalho (Heads = True).
  • Em seguida iremos passar para o código a largura de cada coluna. Das 8 existentes, separadas por ponto e vírgula (;). Lembrando que isso é ajuste fino e cada usuário pode personalizar a largura como deseja.
  • A última linha do nosso código diz respeito ao carregamento de informações que a nossa caixa de listagem vai ter. A fonte de dados (RowSource) da nossa caixa de listagem será preenchida com as informações da aba “Caixa”, da 2ª linha da coluna A até a última linha da coluna H, dada pela variável “ultLin” descoberta no começo do nosso código.
  • E encerra-se a nossa (primeira) sub.

Até aqui construímos o código que representa a configuração das nossas caixas de listagem das páginas de Vendas e Caixa do nosso formulário.

O que queremos aqui é chamar aquela função por uma ação, que vai chamar esse código de configuração cada vez o formulário ControleDaEmpresa for aberto.

Então iremos colocar essa função para disparar quando o nosso formulário ControleDaEmpresa for inicializado (UserForm Initialize).

Teremos uma sub privada, ou seja, que só vai funcionar dentro do código do nosso formulário, que irá chamar a sub atualizaCaixaDeListagemVendas e atualizaCaixaDeListagemCaixa (criada acima), e assim mostrar as informações nas caixas de listagem (CxListagemVendas e CxListagemCaixa), quando o nosso formulário for aberto.

Acessando o código do formulário

Para fazer alterações no nosso formulário já criado, precisamos primeiramente abrir o ambiente de VBA, a partir do atalho do teclado Alt(+Fn)+F11.

Mais uma vez lembrando que, para abrir o código do nosso formulário de interesse, devemos ir com o botão direito no formulário ControleDaEmpresa > exibir código.

Inserindo os códigos abaixo dentro dos códigos já existentes no formulário

Private Sub UserForm_Initialize()

Call atualizaCaixaDeListagemCompras
Call atualizaCaixaDeListagemVendas
Call atualizaCaixaDeListagemCaixa

End Sub

Explicação do código acima:

  • Vamos configurar uma sub privada (somente do formulário) que vai ser executada automaticamente quando o formulário for iniciado (Initialize)
  • Chamaremos as macro criadas anteriormente (atualizaCaixaDeListagemVendas, tualizaCaixaDeListagemCaixa) e a criada na aula anterior (tualizaCaixaDeListagemCompras), que vão configurar/atualizar as informações das caixas de listagem das nossas páginas “Vendas”, “Caixa” e “Compras”
  • Se encerra o nosso código

Após esse código ser executado, o nosso formulário vai ter a seguinte cara (quando for iniciado) para as abas de Vendas e Caixa:

Macro para abrir o formulário

Para criar um código dentro de um módulo, precisamos primeiramente abrir o ambiente de VBA, a partir do atalho do teclado Alt(+Fn)+F11.

Para isso, vamos na guia Inserir > Módulo, e uma caixa branca se abrirá.

Vamos dedicar um módulo apenas para essa macro que tem a simples função de abrir o formulário, que será a seguir:

Sub abrirFormulario()

ControleDaEmpresa.Show

End Sub

Atribuindo macro a um botão (abrir o formulário com um botão)

Para atrelar o código aos nossos botões criados em cada aba, no Excel, temos que:

  • Clicar com o botão direito do mouse em cada botão criado, iremos em atribuir macro… e procuraremos pela nossa macro (abrirFormulario).
  • Em seguida, clicaremos nela e em OK.
  • Agora basta clicar com o botão esquerdo do mouse no botão, que o código irá rodar.

Voltar para o índice

Aula 10 – Controle para Empresas – Construção da Aba de Estoque

Hoje no Controle para Empresas Aula10 nós vamos iniciar a construção da nossa aba de estoque para poder mostrar os nossos itens!

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo!

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Essa é a décima aula (Controle para Empresas Aula10) da série, nessa aula nós vamos iniciar a construção da aba de estoque no formulário VBA!

Para fazer isso nós vamos utilizar o que já temos para atualizar caixa de listagem no VBA, então vamos poder copiar o código da outra aba e apenas fazer alguns ajustes.

Isso é muito útil, pois não precisa reescrever todo o código, então vamos fazer esses pequenos ajustes para não ter todo o trabalho novamente.

Outros dois pontos que vamos abordar e que já até colocamos links dos vídeos na aula é sobre a função SOMASE no Excel e sobre o Worksheetfunction no VBA que te permite utilizar uma função do Excel dentro do VBA.

Outra parte importante que temos no código e a parte de registrar informações do formulário no Excel, dessa forma você consegue atualizar os dados do Excel.

E depois vamos conseguir puxar esses dados para atualizar a caixa de listagem com macros VBA para deixar tudo automático!

Acessando o VBA

Para modificar/criar códigos, precisamos primeiramente abrir o ambiente de VBA. A partir do atalho do teclado Alt(+Fn)+F11 conseguimos fazer isso.

Vamos em seguida acessar o módulo já criado na aula anterior chamado “modAtualizarCaixaListagem”. Com um duplo clique entramos no módulo:

InserirModulo

Lá vamos colocar um novo código para atualizar/configurar a caixa de listagem da página de Estoque do nosso formulário. Acompanhe a seguir o código:

Sub atualizaCaixaDeListagemEstoque() 

Dim abaEstoque As Object, abaCompras As Object, abaVendas As Object

Dim ultLin As Long


Set abaEstoque = Sheets("Estoque")

Set abaCompras = Sheets("Compras")

Set abaVendas = Sheets("Vendas")

 

ultLin = abaEstoque.Range("A1000000").End(xlUp).Row

 

abaEstoque.Cells(2, 2).Value = WorksheetFunction.SumIf(abaCompras.Range("E:E"), abaEstoque.Cells(2, 1).Value, abaCompras.Range("F:F"))

abaEstoque.Cells(2, 3).Value = WorksheetFunction.SumIf(abaVendas.Range("E:E"), abaEstoque.Cells(2, 1).Value, abaVendas.Range("F:F"))

abaEstoque.Cells(2, 4).Value = abaEstoque.Cells(2, 2).Value - abaEstoque.Cells(2, 3).Value

 

ControleDaEmpresa.CxListagemEstoque.ColumnCount = 4

ControleDaEmpresa.CxListagemEstoque.ColumnHeads = True

ControleDaEmpresa.CxListagemEstoque.ColumnWidths = "125;125;125;125"

ControleDaEmpresa.CxListagemEstoque.RowSource = "Estoque!A2:D" & ultLin

 

End Sub

Explicação do código acima (atualizaCaixaDeListagemEstoque):

  • No começo vamos dimensionar a variável “abaEstoque” como um objeto, que vai representar de fato a aba “Estoque” do nosso arquivo em Excel
  • Vamos também dimensionar a variável “abaCompras” como um objeto, que vai representar de fato a aba “Compras” do nosso arquivo em Excel
  • Após, vamos dimensionar a variável “abaVendas” como um objeto, que vai representar de fato a aba “Vendas” do nosso arquivo em Excel
  • Também vamos dimensionar a variável “ultLin” como um número do tipo Long, que vai representar um número natural maior que zero que pode vir a ser grande
  • Vamos “setar”/configurar/dizer que abaEstoque é o objeto que vai representar a aba “Estoque” da nossa planilha. Isso se dá através do comando Set no VBA
  • Vamos “setar”/configurar/dizer que abaCompras é o objeto que vai representar a aba “Compras” da nossa planilha. Isso se dá através do comando Set no VBA
  • Vamos “setar”/configurar/dizer que abaVendas é o objeto que vai representar a aba “Vendas” da nossa planilha. Isso se dá através do comando Set no VBA
  • Após essas configurações, vamos descobrir a última linha preenchida da coluna A, da abaEstoque, e iremos armazenar essa informação na variável “ultLin”
  • Na célula localizada na 2ª linha e na 2ª coluna da abaEstoque, vamos inserir o resultado da Função SOMASE no Excel, fazendo a soma do que estiver na coluna F da abaCompras, considerando o que na coluna E da abaCompras, o que for igual ao que tiver na célula localizada na 2ª linha e 1ª coluna da abaEstoque. Com isso conseguimos a quantidade de produtos comprados
  • Na célula localizada na 2ª linha e na 3ª coluna da abaEstoque, vamos inserir o resultado da Função SOMASE no Excel, fazendo a soma do que estiver na coluna F da abaVendas, considerando o que na coluna E da abaVendas, o que for igual ao que tiver na célula localizada na 2ª linha e 1ª coluna da abaEstoque. Com isso conseguimos a quantidade de produtos vendidos
  • Na célula localizada na 2ª linha e na 4ª coluna da abaEstoque nós vamos fazer a diferença do resultado da célula localizada na 2ª linha e na 2ª coluna da abaEstoque (quantidade de produto comprada) e da célula localizada na 2ª linha e na 3ª coluna da abaEstoque (quantidade de produto vendida). Com isso conseguimos a quantidade de produtos em estoque
  • Vamos configurar a caixa de listagem contendo as informações de Estoque (CxListagemEstoque), que vai ter 4 colunas. Repare que essa caixa de listagem está no ControleDaEmpresa, por isso o comando começa com o nome do formulário.
  • A próxima instrução irá dizer que a nossa caixa de listagem tem cabeçalho (Heads = True).
  • Em seguida iremos passar para o código a largura de cada coluna. Das 9 existentes, separadas por ponto e vírgula (;). Lembrando que isso é ajuste fino e cada usuário pode personalizar a largura como deseja.
  • A última linha do nosso código diz respeito ao carregamento de informações que a nossa caixa de listagem vai ter. A fonte de dados (RowSource) da nossa caixa de listagem será preenchida com as informações da aba “Estoque”, da 2ª linha da coluna A até a última linha da coluna D, dada pela variável “ultLin” descoberta no começo do nosso código.
  • E encerra-se a nossa (primeira) sub.

Até aqui construímos o código que representa a configuração da nossa caixa de listagem da página de Estoque do nosso formulário.

O que queremos aqui é chamar aquela função por uma ação, que vai chamar esse código de configuração cada vez o formulário ControleDaEmpresa for aberto.

Então iremos colocar essa função para disparar quando o nosso formulário ControleDaEmpresa for inicializado (UserForm Initialize).

Teremos uma sub privada, ou seja, que só vai funcionar dentro do código do nosso formulário, que irá chamar a sub atualizaCaixaDeListagemEstoque (criada acima), e assim mostrar as informações nas caixas de listagem (CxListagemEstoque), quando o nosso formulário for aberto.

Acessando o código do formulário

Para fazer alterações no nosso formulário já criado, precisamos primeiramente abrir o ambiente de VBA, a partir do atalho do teclado Alt(+Fn)+F11.

Mais uma vez lembrando que, para abrir o código do nosso formulário de interesse, devemos ir com o botão direito no formulário ControleDaEmpresa > exibir código.

Colocaremos a linha destacada em negrito abaixo na Private Sub:

 UserForm_Initialize:

Private Sub UserForm_Initialize()

Call atualizaCaixaDeListagemCompras

Call atualizaCaixaDeListagemVendas

Call atualizaCaixaDeListagemCaixa

Call atualizaCaixaDeListagemEstoque

End Sub

Explicação do código acima:

  • Vamos configurar uma sub privada (somente do formulário) que vai ser executada automaticamente quando o formulário for iniciado (Initialize)
  • Chamaremos a macro criada anteriormente (atualizaCaixaDeListagemEstoque) e as criadas nas aulas anteriores (atualizaCaixaDeListagemCompras, atualizaCaixaDeListagemVendas e atualizaCaixaDeListagemCaixa), que vão configurar/atualizar as informações das caixas de listagem das nossas páginas “Estoque”, “Compras”, “Vendas” e “Caixa”, respectivamente.
  • Se encerra o nosso código

Após esse código ser executado, o nosso formulário vai ter a seguinte cara (quando for iniciado) para a aba de Estoque:

Aba de estoque
Aba de estoque

Voltar para o índice

Aula11 – Controle para Empresas – Movimentações da aba de Compras – Parte 1

Hoje em Controle para Empresas Aula11 nós vamos dar início ao cadastro da movimentação da aba de compras para poder registrar as compras!

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo!

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Essa é a décima primeira aula da série, nessa aula vamos cadastrar as movimentações no VBA na aba de compras!

Para essa aula com formulário no VBA vamos utilizar um código que já criamos anteriormente, então facilita o trabalho!

No VBA isso é muito útil, pois as vezes queremos fazer a mesma ação ou algo parecido, então basta copiar o código e fazer alguns ajustes.

Hoje vamos utilizar a estrutura de repetição no VBA (estrutura de repetição for each), que é um pouco diferente do “for” sozinho, pois essa pega cada elemento de um todo.

Vamos utilizar também a estrutura condicional (estrutura if no VBA) que você já sabe como usar e o msgbox (caixa de mensagens) para mostrar uma mensagem ao usuário.

Tudo isso nós já vimos em aulas anteriores, mas agora vamos adaptar para as movimentações na aba de compras.

E aí, vamos pra aula aprender a modificar mais um código e continuar com a construção do nosso formulário?

Inserindo um módulo

Para criar um código dentro de um módulo, precisamos primeiramente abrir o ambiente de VBA, a partir do atalho do teclado Alt(+Fn)+F11. Assim poderemos de fato criar o nosso código a ser utilizado.

Como não temos nenhum módulo criado antes nessa planilha, vamos na guia Inserir > Módulo, e uma caixa branca se abrirá.
InserirModulo

Colocaremos a seguinte function dentro dele, que será o objeto de estudo da aula de hoje:

Function checarCamposVazios() As Boolean

Dim forma As Object 

For Each forma In ControleDaEmpresa.BlocoDeAbas.Pages(ControleDaEmpresa.BlocoDeAbas.Value).Controls

    If TypeName(forma) = "TextBox" And forma.Value = "" Then

        MsgBox ("Existem campos vazios. Favor preencher corretamente.")

        checarCamposVazios = True

        Exit Function

    End If

Next

 

checarCamposVazios = False

 

End Function

Comentários a respeito da function checarCamposVazios():

  • Vamos dimensionar a variável “forma” como um objeto. Ela vai representar cada possível objeto de cada aba/página do nosso formulário
  • Vamos utilizar de uma estrutura de repetição For Each, que vai fazer ações repetidas em uma unidade de um todo, que é formado por essas unidades.
    • No caso vamos considerar um único objeto que será representado pela variável “forma” no conjunto de objetos/controles da aba atual (onde o botão clicado de “Adicionar” estará), do nosso bloco de abas (objeto multipágina) do formulário ControleDeEmpresa (leia da direita para a esquerda)
    • Vamos utiliza de uma estrutura if que vai permitir a gente ver se o tipo do nome do nosso objeto analisado é igual a “TextBox”, a cada objeto da página em questão, e, ao mesmo tempo, deve checar se o valor da forma está vazia (nada preenchido)
    • Caso seja uma TextBox e esteja vazia a forma, essa comparação vai ser verdadeira, e vamos gerar caixa de mensagens na tela (MsgBox) avisando que “Existem campos vazios. Favor preencher corretamente.”. Além disso, será atribuído como resposta à function checarCamposVazios o valor de verdadeiro (True) e o código será abortado (exit sub).
    • E seguiremos para o próximo objeto a ser testado
    • Caso não haja objetos vazios naquela página, será atribuída à function checarCamposVazios o valor de falso (False)
    • Não havendo mais controles/objetos a analisar naquela aba/página, seguiremos o código
  • Se encerra o código

O código acima vai ser utilizado por vários botões “Adicionar” do nosso formulário. Por isso criamos apenas um código dentro de um módulo específico e separado.

Vamos “chamar” esse mesmo código universal por todos os botões “Adicionar”. Independentemente da página e dos nomes das caixas de textos dela, ele irá interpretar as comparações e fará a limpeza das caixas necessárias.

Na aula de hoje, no caso, vamos fazer ela ser chamada apenas para a aba de Compras do formulário e continuaremos nas aulas seguintes.

OBS1: Para entender melhor a diferença entre Sub e Function: digamos que a sub é formada por um conjunto de rotinas que vai te gerar ações e não necessariamente uma resposta; e a function vai ser um conjunto de rotinas que vai te gerar um resultado/resposta, geralmente através de cálculos.

OBS2: Caso queira aprender mais sobre estrutura de repetição For Each, indicamos esse outro post aqui que te ensina com detalhes.

OBS3: Além disso, explicamos a estrutura If em outro post do nosso blog também de forma detalhada, caso queira conferir.

Acessando o código do formulário

Para fazer alterações no nosso formulário já criado, precisamos primeiramente abrir o ambiente de VBA, a partir do atalho do teclado Alt(+Fn)+F11. Assim poderemos continuar o nosso formulário de controle da empresa.

Formulário VBA

Formulário VBA
Formulário VBA

Mais uma vez lembrando que, para abrir o código do nosso formulário de interesse, devemos ir com o botão direito no formulário ControleDaEmpresa > exibir código.

Inserindo os códigos abaixo dentro dos códigos já existentes no formulário

Private Sub BtAdicionarCompras_Click()

If checarCamposVazios Then Exit Sub

End Sub

Explicação do código acima:

  • O código acima vai simplesmente chamar (comando Call) a nossa sub criada no começo da aula de hoje, a checarCamposVazios.
  • Resumidamente: se a function retornar valor verdadeiro (alguma caixa estiver vazia), nada será feito em termos de adição de dados na planilha através do botão de adicionar, porque o código será abortado através do comando Exit Sub (instrução de saída).
  • Consequentemente, se a resposta da function for falsa (nenhuma caixa vazia), o botão de adicionar poderá funcionar normalmente
  • Se encerra o código

OBS: Você tem a opção de “abrir”/criar cada Private Sub quando você clicar, em duplo clique, nos botões (objetos) diretamente no formulário. Quer aprender tudo sobre o VBA? Confira nosso curso do básico ao avançado em VBA.

Voltar para o índice

Aula12 – Controle para Empresas – Movimentações da aba de Compras – Parte 2

Hoje em Controle para Empresas Aula12 nós vamos dar continuidade ao cadastro da movimentação da aba de compras.

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo!

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Essa é a décima segunda aula (Controle para Empresas Aula12) da série, nessa aula nós vamos continuar com o processo para cadastrar as movimentações no VBA na aba de compras!

Como você já deve saber vamos utilizar macros VBA para esse procedimento e vamos utilizar os conhecimentos das aulas anteriores.

Então vamos ver a estrutura for each no VBA, vamos ver a estrutura if no VBA, como formatar bordas com VBA para que a tabela fique visualmente mais agradável.

Outra parte muito importante que muita gente acaba perguntando, mas que é sempre bom relembrar é como encontrar a primeira linha vazia no VBA ou a última linha preenchida no VBA.

Por fim nós vamos trazer dados do VBA para o Excel, então vamos pegar as informações que foram preenchidas dentro do formulário e atribuir esses valores para o Excel.

Assim vamos poder preencher a nossa aba de compras de forma automática através do formulário.

Mudança no módulo modChecarCamposVazios

Function checarCamposVazios() As Boolean

Dim forma As Object

For Each forma In ControleDaEmpresa.BlocoDeAbas.Pages(ControleDaEmpresa.BlocoDeAbas.Value).Controls

    If TypeName(forma) = "TextBox" Then

        If forma.Value = "" Then

            MsgBox ("Existem campos vazios. Favor preencher corretamente.")

            checarCamposVazios = True

            Exit Function

        End If

    End If

Next

checarCamposVazios = False

End Function

Comentários a respeito da function checarCamposVazios():

  • Vamos dimensionar a variável “forma” como um objeto. Ela vai representar cada possível objeto de cada aba/página do nosso formulário
  • Vamos utilizar de uma estrutura de repetição For Each, que vai fazer ações repetidas em uma unidade de um todo, que é formado por essas unidades.
    • No caso vamos considerar um único objeto que será representado pela variável “forma” no conjunto de objetos/controles da aba atual (onde o botão clicado de “Adicionar” estará), do nosso bloco de abas (objeto multipágina) do formulário ControleDeEmpresa (leia da direita para a esquerda)
    • Vamos utiliza de uma estrutura if que vai permitir a gente ver se o tipo do nome do nosso objeto analisado é igual a “TextBox”, a cada objeto da página em questão
    • Caso ele seja do “tipo” textbox, vai checar também se o valor da forma (textbox) é igual a vazio (não há algo preenchido na caixa de texto)
    • Caso seja uma TextBox e esteja vazia a forma, essa comparação vai ser verdadeira, e vamos gerar caixa de mensagens na tela (MsgBox) avisando que “Existem campos vazios. Favor preencher corretamente.”. Além disso, será atribuído como resposta à function checarCamposVazios o valor de verdadeiro (True) e o código será abortado (exit sub).
    • E seguiremos para o próximo objeto a ser testado
    • Caso não haja objetos vazios naquela página, será atribuída à function checarCamposVazios o valor de falso (False)
    • Não havendo mais controles/objetos a analisar naquela aba/página, seguiremos o código
  • Se encerra o código

O código acima vai ser utilizado por vários botões “Adicionar” do nosso formulário. Por isso criamos apenas um código dentro de um módulo específico e separado.

Vamos “chamar” esse mesmo código universal por todos os botões “Adicionar”. Independentemente da página e dos nomes das caixas de textos dela, ele irá interpretar as comparações e fará a limpeza das caixas necessárias.

Na aula de hoje, no caso, vamos fazer ela ser chamada apenas para a aba de Compras do formulário e continuaremos nas aulas seguintes.

OBS1: Para entender melhor a diferença entre Sub e Function: digamos que a sub é formada por um conjunto de rotinas que vai te gerar ações e não necessariamente uma resposta; e a function vai ser um conjunto de rotinas que vai te gerar um resultado/resposta, geralmente através de cálculos.

OBS2: Caso queira aprender mais sobre estrutura de repetição For Each, indicamos esse outro post aqui que te ensina com detalhes.

OBS3: Além disso, explicamos a estrutura If em outro post do nosso blog também de forma detalhada, caso queira conferir.

Acessando o código do formulário

Para fazer alterações no nosso formulário já criado, precisamos primeiramente abrir o ambiente de VBA, a partir do atalho do teclado Alt(+Fn)+F11. Assim poderemos continuar o nosso formulário de controle da empresa.

Mais uma vez lembrando que, para abrir o código do nosso formulário de interesse, devemos ir com o botão direito no formulário ControleDaEmpresa > exibir código.

Formulário VBA
Formulário VBA

Inserindo os códigos abaixo dentro dos códigos já existentes no formulário

Option Explicit 

Private Sub BtAdicionarCompras_Click()

Dim abaCompras As Object
Dim priLin As Long

If checarCamposVazios Then Exit Sub

Set abaCompras = Sheets("Compras")

priLin = abaCompras.Range("A1000000").End(xlUp).Row + 1

abaCompras.Cells(priLin, 1).Value = CLng(CxIDCompras.Value)
abaCompras.Cells(priLin, 2).Value = CDate(CxDataPCompras.Value)
abaCompras.Cells(priLin, 3).Value = CDate(CxDataCCompras.Value)
abaCompras.Cells(priLin, 4).Value = CxFornecedorCompras.Value
abaCompras.Cells(priLin, 5).Value = CxProdutoCompras.Value
abaCompras.Cells(priLin, 6).Value = CLng(CxQuantidadeCompras.Value)
abaCompras.Cells(priLin, 7).Value = CDbl(CxCustoTotalCompras.Value)
abaCompras.Range("A" & priLin & ":G" & priLin).Borders.LineStyle = xlContinuous

End Sub

Explicação do código acima:

  • A configuração “Option Explicit” vai ser ativada, de forma a exigir que todas as variáveis utilizadas no código sejam declaradas, de forma obrigatória. Observe que isso é algo que é colocado fora da estrutura das nossas subs.
  • Vamos dimensionar uma variável chamada abaCompras como um objeto e uma variável chamada priLin como um número do tipo Long. Para mais detalhes dos tipos de variáveis no VBA visite essa página.
  • Vamos usar de uma estrutura de comparação If que vai verificar se a function criada anteriormente (checarCamposVazios) retornar valor verdadeiro (alguma caixa estiver vazia), nada será feito em termos de adição de dados na planilha através do botão de adicionar, porque o código será abortado através do comando Exit Sub (instrução de saída).
  • Por outro lado, se a resposta da function for falsa (ou seja, nenhuma caixa vazia), o botão de adicionar poderá funcionar normalmente
  • Vamos configurar a variável abaCompras para representar um objeto inteiro, que será nesse caso a aba do nosso arquivo em Excel “Compras”
  • Vamos armazenar na variável priLin a informação da primeira linha vazia da coluna A da abaCompras
  • O valor da célula da linha dada pela variável priLin, e da coluna 1 (coluna A) da aba compras vai receber o que estiver presenta na CxIDCompras, convertido para número
  • O valor da célula da linha dada pela variável priLin, e da coluna 2 (coluna B) da aba compras vai receber o que estiver presenta na CxDataPCompras, convertido para data
  • O valor da célula da linha dada pela variável priLin, e da coluna 3 (coluna C) da aba compras vai receber o que estiver presenta na CxIDataCCompras, convertido para data
  • O valor da célula da linha dada pela variável priLin, e da coluna 4 (coluna D) da aba compras vai receber o que estiver presenta na CxFornecedorCompras
  • O valor da célula da linha dada pela variável priLin, e da coluna 5 (coluna E) da aba compras vai receber o que estiver presenta na CxProdutoCompras
  • O valor da célula da linha dada pela variável priLin, e da coluna 6 (coluna F) da aba compras vai receber o que estiver presenta na CxQuantidadeCompras, convertido para número
  • O valor da célula da linha dada pela variável priLin, e da coluna 7 (coluna G) da aba compras vai receber o que estiver presenta na CxCustoTotalCompras, convertido para número
  • Para finalizar, vamos fazer também o estilo de linha da borda ser contínua, para as informações inseridas, da linha A até a linha G da linha dada por priLin da abaCompras
  • Se encerra o código

OBS: Você tem a opção de “abrir”/criar cada Private Sub quando você clicar, em duplo clique, nos botões (objetos) diretamente no formulário.

Nesse caso, optaríamos por entrar na aba Compras do formulário e daríamos duplo clique no botão “Adicionar” dela, para abrir o código.

Voltar para o índice

Aula 13 – Controle para Empresas – Movimentações da aba de Compras

Hoje em Controle para Empresas Aula13 nós vamos finalizar o cadastro da movimentação da aba de compras para prosseguir com a série!

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo!

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Essa é a décima terceira aula da série, nessa aula nós vamos continuar com o processo para cadastrar as movimentações no VBA na aba de compras!

Aqui ainda vamos fazer o procedimento de cadastrar valores do formulário no Excel, que é uma parte muito importante.

Além de importar dados do formulário no Excel nós vamos limpar campos do formulário em VBA, vamos criar a macro para limpar os campos do formulário e atualizar a caixa de listagem no VBA.

Com isso nós vamos ter toda a parte automática para preencher os dados no formulário e exportar para o Excel essas informações.

Outra parte bem importante é a parte de produtos, onde vamos utilizar o worksheetfunction para utilizar uma função do Excel no VBA.

Nesse caso vamos usar a função CONT.SE no VBA (função CountIf) para poder contar a quantidade de um produto, assim saberemos se será necessário cadastrar esse produto ou não.

E não podemos esquecer de converter dados no VBA, pois temos data e valores no formato contábil. Dessa forma nossa tabela fica preenchida de forma correta com os formatos corretos também!

Acessando o código do formulário

Para fazer alterações no nosso formulário já criado, precisamos primeiramente abrir o ambiente de VBA, a partir do atalho do teclado Alt(+Fn)+F11. Assim poderemos continuar o nosso formulário de controle da empresa.

Mais uma vez lembrando que, para abrir o código do nosso formulário de interesse, devemos ir com o botão direito no formulário ControleDaEmpresa > exibir código.

Formulário VBA
Controle para Empresas Aula13

Inserindo os códigos abaixo dentro dos códigos já existentes no formulário

Option Explicit

Private Sub BtAdicionarCompras_Click()

Dim abaCompras As Object, abaCaixa As Object, abaEstoque As Object
Dim priLin As Long, qtdProduto As Long

'Validando os campos do formulário
If checarCamposVazios Then Exit Sub

Set abaCompras = Sheets("Compras")
Set abaCaixa = Sheets("Caixa")
Set abaEstoque = Sheets("Estoque")


'Cadastrando na aba Compras
priLin = abaCompras.Range("A1000000").End(xlUp).Row + 1

abaCompras.Cells(priLin, 1).Value = CLng(CxIDCompras.Value)
abaCompras.Cells(priLin, 2).Value = CDate(CxDataPCompras.Value)
abaCompras.Cells(priLin, 3).Value = CDate(CxDataCCompras.Value)
abaCompras.Cells(priLin, 4).Value = CxFornecedorCompras.Value
abaCompras.Cells(priLin, 5).Value = CxProdutoCompras.Value
abaCompras.Cells(priLin, 6).Value = CLng(CxQuantidadeCompras.Value)
abaCompras.Cells(priLin, 7).Value = CDbl(CxCustoTotalCompras.Value)

abaCompras.Range("A" & priLin & ":G" & priLin).Borders.LineStyle = xlContinuous


'Cadastrando na aba Caixa
priLin = abaCaixa.Range("A1000000").End(xlUp).Row + 1

abaCaixa.Cells(priLin, 1).Value = CLng(CxIDCompras.Value)
abaCaixa.Cells(priLin, 2).Value = CDate(CxDataPCompras.Value)
abaCaixa.Cells(priLin, 3).Value = CDate(CxDataCCompras.Value)
abaCaixa.Cells(priLin, 4).Value = CxProdutoCompras.Value
abaCaixa.Cells(priLin, 5).Value = "Compra"
abaCaixa.Cells(priLin, 6).Value = CxContaCompras.Value
abaCaixa.Cells(priLin, 7).Value = -CDbl(CxCustoTotalCompras.Value)
abaCaixa.Cells(priLin, 8).Value = CxStatusCompras.Value


abaCaixa.Range("A" & priLin & ":H" & priLin).Borders.LineStyle = xlContinuous


'Verificar se o produto existe na aba de Estoque
qtdProduto = WorksheetFunction.CountIf(abaEstoque.Range("A:A"), CxProdutoCompras.Value)


If qtdProduto = 0 Then

   priLin = abaEstoque.Range("A1000000").End(xlUp).Row + 1  

   abaEstoque.Cells(priLin, 1).Value = CxProdutoCompras.Value
    abaEstoque.Range("A" & priLin & ":D" & priLin).Borders.LineStyle = xlContinuous

End If

'Limpar campos do formulário
Call limparCamposDoFormulario

'Atualizar Caixa de Listagem
Call atualizaCaixaDeListagemCompras

Set abaCompras = Nothing
Set abaCaixa = Nothing
Set abaEstoque = Nothing

End Sub

Explicação do código acima:

  • A configuração “Option Explicit” vai ser ativada, de forma a exigir que todas as variáveis utilizadas no código sejam declaradas, de forma obrigatória. Observe que isso é algo que é colocado fora da estrutura das nossas subs.
  • Vamos dimensionar uma variável chamada abaCompras como um objeto
  • Vamos dimensionar uma variável chamada abaCaixa como um objeto
  • Vamos dimensionar uma variável chamada abaEstoque como um objeto
  • Dimensionar uma variável chamada priLin como um número do tipo Long. Para mais detalhes dos tipos de variáveis no VBA visite essa página.
  • Vamos usar de uma estrutura de comparação If que vai verificar se a function criada anteriormente (checarCamposVazios) retornar valor verdadeiro (alguma caixa estiver vazia), nada será feito em termos de adição de dados na planilha através do botão de adicionar, porque o código será abortado através do comando Exit Sub (instrução de saída).
  • Por outro lado, se a resposta da function for falsa (ou seja, nenhuma caixa vazia), o botão de adicionar poderá funcionar normalmente
  • Vamos configurar a variável abaCompras para representar um objeto inteiro, que será nesse caso a aba do nosso arquivo em Excel “Compras”
  • Vamos configurar a variável abaCaixa para representar um objeto inteiro, que será nesse caso a aba do nosso arquivo em Excel “Caixa”
  • Vamos configurar a variável abaEstoque para representar um objeto inteiro, que será nesse caso a aba do nosso arquivo em Excel “Estoque”
  • Cadastro na aba Compras
    • Vamos armazenar na variável priLin a informação da primeira linha vazia da coluna A da abaCompras
    • O valor da célula da linha dada pela variável priLin, e da coluna 1 (coluna A) da aba compras vai receber o que estiver presenta na CxIDCompras, convertido para número
    • O valor da célula da linha dada pela variável priLin, e da coluna 2 (coluna B) da aba compras vai receber o que estiver presenta na CxDataPCompras, convertido para data
    • O valor da célula da linha dada pela variável priLin, e da coluna 3 (coluna C) da aba compras vai receber o que estiver presenta na CxIDataCCompras, convertido para data
    • O valor da célula da linha dada pela variável priLin, e da coluna 4 (coluna D) da aba compras vai receber o que estiver presenta na CxFornecedorCompras
    • O valor da célula da linha dada pela variável priLin, e da coluna 5 (coluna E) da aba compras vai receber o que estiver presenta na CxProdutoCompras
    • O valor da célula da linha dada pela variável priLin, e da coluna 6 (coluna F) da aba compras vai receber o que estiver presenta na CxQuantidadeCompras, convertido para número
    • O valor da célula da linha dada pela variável priLin, e da coluna 7 (coluna G) da aba compras vai receber o que estiver presenta na CxCustoTotalCompras, convertido para número
    • Para finalizar o processo na aba Compras, vamos fazer também o estilo de linha da borda ser contínua, para as informações inseridas, da linha A até a linha G da linha dada por priLin da abaCompras
  • Cadastro na aba Caixa
    • Vamos em seguida armazenar na variável priLin (reaproveitar o nome) a informação da primeira linha vazia da coluna A da abaCaixa
    • O valor da célula da linha dada pela variável priLin, e da coluna 1 (coluna A) da aba Caixa vai receber o que estiver presenta na CxIDCompras, convertido para número
    • O valor da célula da linha dada pela variável priLin, e da coluna 2 (coluna B) da aba Caixa vai receber o que estiver presenta na CxDataPCompras, convertido para data
    • O valor da célula da linha dada pela variável priLin, e da coluna 3 (coluna C) da aba Caixa vai receber o que estiver presenta na CxIDataCCompras, convertido para data
    • O valor da célula da linha dada pela variável priLin, e da coluna 4 (coluna D) da aba Caixa vai receber o que estiver presenta na CxProdutoCompras
    • O valor da célula da linha dada pela variável priLin, e da coluna 5 (coluna E) da aba Caixa vai receber o texto “Compra”
    • O valor da célula da linha dada pela variável priLin, e da coluna 6 (coluna F) da aba compras vai receber o que estiver presenta na CxContaCompras, convertido para número
    • O valor da célula da linha dada pela variável priLin, e da coluna 7 (coluna G) da aba Caixa vai receber o que estiver presenta na CxCustoTotalCompras, convertido para número e multiplicada por menos 1 (sinal de menos na frente)
    • O valor da célula da linha dada pela variável priLin, e da coluna 8 (coluna H) da aba Caixa vai receber o que estiver presenta na CxStatusCompras, convertido para número
    • Para finalizar o processo na aba Caixa vamos fazer também o estilo de linha da borda ser contínua, para as informações inseridas, da linha A até a linha H da linha dada por priLin da abaCaixa
  • Aba Estoque
    • Vamos utilizar a função CONT.SE do Excel pelo VBA (WorksheetFunction.CountIf) para contar a quantidade de vezes que o produto adicionado apareceria na aba Estoque. Armazenaremos essa quantidade na variável qtdProduto
    • Se qtdProduto for igual a 0, não temos esse produto, então vamos pegar a primeira linha vazia da abaEstoque, e armazenar na variável priLin
    • Armazenaremos na 1ª coluna da abaEstoque o nome do Produto em questão (que está na CxProdutoCompras), na linha identificada pela variável priLin
    • Para finalizar o processo na aba Estoque vamos fazer também o estilo de linha da borda ser contínua, para as informações inseridas, da linha A até a linha D da linha dada por priLin da abaEstoque
  • Com todos os cadastros feitos nas abas Compras, Caixa e Estoque, vamos prosseguir chamando as macros limparCamposDoFormulario e atualizaCaixaDeListagemCompras, que vão respectivamente limpar os campos do formulário da aba Compras e atualizar a caixa de listagem da aba compras com os novos dados adicionados
  • Vamos apagar o conteúdo (Nothing) das variáveis abaCompras, abaCaixa e abaEstoque, que antes armazenavam objetos
  • Se encerra o código

OBS: Você tem a opção de “abrir”/criar cada Private Sub quando você clicar, em duplo clique, nos botões (objetos) diretamente no formulário.

Nesse caso, optaríamos por entrar na aba Compras do formulário e daríamos duplo clique no botão “Adicionar” dela, para abrir o código.

Voltar para o índice

Aula 14 – Controle para Empresas – Preenchimento Automático do ID

Hoje em Controle para Empresas Aula14 nós vamos fazer preenchimento automático do ID dentro do formulário com a verificação na planilha.

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo!

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Essa é a décima quarta aula (Controle para Empresas Aula 14) da série, nessa aula nós vamos fazer o preenchimento automático de ID do formulário.

Vamos verificar campos vazios no formulário, para assim poder fazer um ajuste na caixa de ID para que ela possa ficar vazia sem mostrar a mensagem ao usuário.

Vamos utilizar a fórmula de texto InStr para verificar um texto específico dentro de outro para fazer essa verificação do ID.

Outra fórmula que vamos utilizar é o worksheetfunction para poder usar função do Excel no VBA (função MÁXIMO no VBA neste caso).

Para finalizar vamos utilizar a estrutura condicional no VBA (estrutura if no VBA) que você já deve saber muito bem e verificar informações duplicadas para checar o ID.

Ajuste num módulo específico

Vamos fazer um ajuste na função criada anteriormente no módulo “modChecarCamposVazios”:

Function checarCamposVazios() As Boolean

Dim forma As Object

For Each forma In ControleDaEmpresa.BlocoDeAbas.Pages(ControleDaEmpresa.BlocoDeAbas.Value).Controls

If TypeName(forma) = “TextBox” Then

If forma.Value = “” And InStr(forma.Name, “CxID”) = 0 Then
MsgBox (“Existem campos vazios. Favor preencher corretamente.”)
checarCamposVazios = True
Exit Function
End If

End If

Next

checarCamposVazios = False

End Function

Explicação da mudança:

  • Para mais detalhes da explicação completa da function, vocês podem conferir nas últimas aulas da série
  • Vamos fazer a verificação de todas as caixas de texto do formulário, e se a forma for uma caixa de texto vazia, e ao mesmo tempo diferente das caixas de ID, vamos gerar a mensagem avisando que há campos vazios e abortar a macro.
  • Isso se dá pela função InStr, que vai verificar partes de texto dentro de outro texto. Tanto nas formas CxIDCompras, CxIDVendas e CxIDCaixa nós temos a parte do texto “CxID”.
  • Assim, conseguimos identificar exatamente essas caixas através da função InStr, que vai identificar que o nome delas contém essa parte de texto, e retornar um número maior do que zero.
  • Se o número for igual a zero, quer dizer que ela não vai ser objeto de nossa análise, e vamos evitá-las nas comparações de verificação de checarCamposVazios.
  • Portanto, na estrutura If em questão vamos procurar por formas que estejam vazias e não sejam as caixas de ID, que vão estar desabilitadas por padrão e vazias, quando houver um preenchimento.

Inserindo um módulo

Para criar um código dentro de um módulo, precisamos primeiramente abrir o ambiente de VBA, a partir do atalho do teclado Alt(+Fn)+F11. Assim poderemos de fato criar o nosso código a ser utilizado.

Para inserir um novo módulo, vamos na guia Inserir > Módulo, e uma caixa branca se abrirá.

InserirModulo
Controle para Empresas Aula14

Mudaremos a propriedade Name desse novo módulo (como mostrado no vídeo) para “modChecarIDDuplicado”

Colocaremos a seguinte Function dentro dele, que será o objeto de estudo da aula de hoje:

Function checarIDDuplicado(IDaVerificar As Long) As Boolean

Dim abaCaixa As Object
Dim qtdID As Long

Set abaCaixa = Sheets("Caixa")

qtdID = WorksheetFunction.CountIf(abaCaixa.Range("A:A"), IDaVerificar)


If qtdID > 0 Then
   MsgBox ("Esse ID já aparece na planilha. Favor cadastrar outro")
   checarIDDuplicado = True

Else

    checarIDDuplicado = False

End If

End Function

Explicação do código acima:

  • Vamos estruturar uma Function que tem como argumentos um número do tipo Long, e retorna uma resposta True ou False (Verdadeiro ou Falso), do tipo booliana (Boolean). Para mais detalhes dos tipos de variáveis no VBA, visite essa página.
  • No começo da function vamos dimensionar a variável abaCaixa como um objeto, e a variável qtdID como um número do tipo Long
  • Vamos atribuir a aba chamada “Caixa” do arquivo para ser representada pela variável abaCompras, dimensionada anteriormente
  • Vamos utilizar de uma função do Excel invocada pelo VBA, através do método WorksheetFunction, mais especificamente falando da função CONT.SE (CountIf). Como argumentos vamos verificar a coluna A da abaCaixa, e ver se temos lá algum IDaVericicar, justamente o ID da function. Vamos armazenar a quantidade de vezes que o ID em questão aparece na coluna A da abaCompras na variável qtdID
  • Vamos utilizar de uma estrutura if que vai permitir a gente ver se a qtdID é maior do que zero.
  • Caso seja, essa comparação vai ser verdadeira. Então, vamos gerar caixa de mensagens na tela (MsgBox) avisando que “Esse ID já aparece na planilha. Favor cadastrar outro”. Além disso, será atribuído como resposta à function checarIDDuplicado o valor de verdadeiro (True)
  • Caso não tenha nenhuma contagem feita (qtdID <= 0), será atribuída à function checarIDDuplicado o valor de falso (False)
  • Se encerra a function

O código acima vai ser utilizado por vários botões “Adicionar” do nosso formulário. Por isso criamos apenas um código dentro de um módulo específico e separado.

Vamos “chamar” esse mesmo código universal por todos os botões “Adicionar”, especificamente falando da abaCompras.

OBS: Explicamos a estrutura If em outro post do nosso blog também de forma detalhada, caso queira conferir.

OBS2: Para conferir mais detalhes sobre usar as funções do Excel no VBA (WorksheetFunction) você pode dar uma olhada nesse outro post em que abordamos justamente isso.

Acessando o código do formulário

Para fazer alterações no nosso formulário já criado, precisamos primeiramente abrir o ambiente de VBA, a partir do atalho do teclado Alt(+Fn)+F11. Assim poderemos continuar o nosso formulário de controle da empresa.

Mais uma vez lembrando que, para abrir o código do nosso formulário de interesse, devemos ir com o botão direito no formulário ControleDaEmpresa > exibir código.

Controle para Empresas Aula14
Controle para Empresas Aula14

Inserindo os códigos abaixo dentro dos códigos já existentes no formulário

Private Sub BtAdicionarCompras_Click()


Dim abaCompras As Object, abaCaixa As Object, abaEstoque As Object
Dim priLin As Long, qtdProduto As Long, IDMovimentacao As Long


'Validando os campos do formulário
If checarCamposVazios Then Exit Sub

'Validando o ID da Movimentação
If CxIDCompras.Value <> "" Then
   If checarIDDuplicado(CxIDCompras.Value) Then Exit Sub

End If

 
Set abaCompras = Sheets("Compras")
Set abaCaixa = Sheets("Caixa")
Set abaEstoque = Sheets("Estoque")

'Cadastrando na aba Compras
priLin = abaCompras.Range("A1000000").End(xlUp).Row + 1


IDMovimentacao = WorksheetFunction.Max(abaCaixa.Range("A:A")) + 1

abaCompras.Cells(priLin, 1).Value = IDMovimentacao
abaCompras.Cells(priLin, 2).Value = CDate(CxDataPCompras.Value)
abaCompras.Cells(priLin, 3).Value = CDate(CxDataCCompras.Value)
abaCompras.Cells(priLin, 4).Value = CxFornecedorCompras.Value
abaCompras.Cells(priLin, 5).Value = CxProdutoCompras.Value
abaCompras.Cells(priLin, 6).Value = CLng(CxQuantidadeCompras.Value)
abaCompras.Cells(priLin, 7).Value = CDbl(CxCustoTotalCompras.Value)


abaCompras.Range("A" & priLin & ":G" & priLin).Borders.LineStyle = xlContinuous


'Cadastrando na aba Caixa
priLin = abaCaixa.Range("A1000000").End(xlUp).Row + 1

abaCaixa.Cells(priLin, 1).Value = IDMovimentacao
abaCaixa.Cells(priLin, 2).Value = CDate(CxDataPCompras.Value)
abaCaixa.Cells(priLin, 3).Value = CDate(CxDataCCompras.Value)
abaCaixa.Cells(priLin, 4).Value = CxProdutoCompras.Value
abaCaixa.Cells(priLin, 5).Value = "Compra"
abaCaixa.Cells(priLin, 6).Value = CxContaCompras.Value
abaCaixa.Cells(priLin, 7).Value = -CDbl(CxCustoTotalCompras.Value)
abaCaixa.Cells(priLin, 8).Value = CxStatusCompras.Value
abaCaixa.Range("A" & priLin & ":H" & priLin).Borders.LineStyle = xlContinuous


'Verificar se o produto existe na aba de Estoque
qtdProduto = WorksheetFunction.CountIf(abaEstoque.Range("A:A"), CxProdutoCompras.Value)

 

If qtdProduto = 0 Then

   priLin = abaEstoque.Range("A1000000").End(xlUp).Row + 1

    abaEstoque.Cells(priLin, 1).Value = CxProdutoCompras.Value
   abaEstoque.Range("A" & priLin & ":D" & priLin).Borders.LineStyle = xlContinuous

End If


'Limpar campos do formulário
Call limparCamposDoFormulario

'Atualizar Caixa de Listagem
Call atualizaCaixaDeListagemCompras


Set abaCompras = Nothing
Set abaCaixa = Nothing
Set abaEstoque = Nothing


End Sub

Explicação do código acima:

  • Vamos dimensionar uma variável chamada abaCompras como um objeto
  • Vamos dimensionar uma variável chamada abaCaixa como um objeto
  • Vamos dimensionar uma variável chamada abaEstoque como um objeto
  • Dimensionar uma variável chamada priLin como um número do tipo Long. Também dimensionar uma variável chamada qtdProduto como um número do tipo Long e uma variável chamada IDMovimentacao como outro número do tipo Long. Para mais detalhes dos tipos de variáveis no VBA visite essa página.
  • Vamos usar de uma estrutura de comparação If que vai verificar se a function criada anteriormente (checarCamposVazios) retornar valor verdadeiro (alguma caixa estiver vazia), nada será feito em termos de adição de dados na planilha através do botão de adicionar, porque o código será abortado através do comando Exit Sub (instrução de saída).
  • Por outro lado, se a resposta da function for falsa (ou seja, nenhuma caixa vazia), o botão de adicionar poderá funcionar normalmente
  • Para validar o ID da movimentação vamos ver se a CxIDCompras está preenchida (é diferente de vazio). Caso esteja preenchida, vamos invocar nossa função checarIDDuplicado para analisar a CxIDCompras para verificar aquele ID específico. Caso ela retorne com o resultado de que o ID existe, vamos abortar a nossa sub. Caso ela retorne com resultado de que não existe, vamos prosseguir com o código para adicionar esse ID/movimentação na planilha e no formulário
  • Vamos configurar a variável abaCompras para representar um objeto inteiro, que será nesse caso a aba do nosso arquivo em Excel “Compras”
  • Vamos configurar a variável abaCaixa para representar um objeto inteiro, que será nesse caso a aba do nosso arquivo em Excel “Caixa”
  • Vamos configurar a variável abaEstoque para representar um objeto inteiro, que será nesse caso a aba do nosso arquivo em Excel “Estoque”
  • Cadastro na aba Compras
    • Vamos armazenar na variável priLin a informação da primeira linha vazia da coluna A da abaCompras
    • O valor da célula da linha dada pela variável priLin, e da coluna 1 (coluna A) da aba compras vai receber o que estiver presenta na CxIDCompras, convertido para número
    • O valor da célula da linha dada pela variável priLin, e da coluna 2 (coluna B) da aba compras vai receber o que estiver presenta na CxDataPCompras, convertido para data
    • O valor da célula da linha dada pela variável priLin, e da coluna 3 (coluna C) da aba compras vai receber o que estiver presenta na CxIDataCCompras, convertido para data
    • O valor da célula da linha dada pela variável priLin, e da coluna 4 (coluna D) da aba compras vai receber o que estiver presenta na CxFornecedorCompras
    • O valor da célula da linha dada pela variável priLin, e da coluna 5 (coluna E) da aba compras vai receber o que estiver presenta na CxProdutoCompras
    • O valor da célula da linha dada pela variável priLin, e da coluna 6 (coluna F) da aba compras vai receber o que estiver presenta na CxQuantidadeCompras, convertido para número
    • O valor da célula da linha dada pela variável priLin, e da coluna 7 (coluna G) da aba compras vai receber o que estiver presenta na CxCustoTotalCompras, convertido para número
    • Para finalizar o processo na aba Compras, vamos fazer também o estilo de linha da borda ser contínua, para as informações inseridas, da linha A até a linha G da linha dada por priLin da abaCompras
  • Cadastro na aba Caixa
    • Vamos em seguida armazenar na variável priLin (reaproveitar o nome) a informação da primeira linha vazia da coluna A da abaCaixa
    • O valor da célula da linha dada pela variável priLin, e da coluna 1 (coluna A) da aba Caixa vai receber o que estiver presenta na CxIDCompras, convertido para número
    • O valor da célula da linha dada pela variável priLin, e da coluna 2 (coluna B) da aba Caixa vai receber o que estiver presenta na CxDataPCompras, convertido para data
    • O valor da célula da linha dada pela variável priLin, e da coluna 3 (coluna C) da aba Caixa vai receber o que estiver presenta na CxIDataCCompras, convertido para data
    • O valor da célula da linha dada pela variável priLin, e da coluna 4 (coluna D) da aba Caixa vai receber o que estiver presenta na CxProdutoCompras
    • O valor da célula da linha dada pela variável priLin, e da coluna 5 (coluna E) da aba Caixa vai receber o texto “Compra”
    • O valor da célula da linha dada pela variável priLin, e da coluna 6 (coluna F) da aba compras vai receber o que estiver presenta na CxContaCompras, convertido para número
    • O valor da célula da linha dada pela variável priLin, e da coluna 7 (coluna G) da aba Caixa vai receber o que estiver presenta na CxCustoTotalCompras, convertido para número e multiplicada por menos 1 (sinal de menos na frente)
    • O valor da célula da linha dada pela variável priLin, e da coluna 8 (coluna H) da aba Caixa vai receber o que estiver presenta na CxStatusCompras, convertido para número
    • Para finalizar o processo na aba Caixa vamos fazer também o estilo de linha da borda ser contínua, para as informações inseridas, da linha A até a linha H da linha dada por priLin da abaCaixa
  • Aba Estoque
    • Vamos utilizar a função CONT.SE do Excel pelo VBA (WorksheetFunction.CountIf) para contar a quantidade de vezes que o produto adicionado apareceria na aba Estoque. Armazenaremos essa quantidade na variável qtdProduto
    • Se qtdProduto for igual a 0, não temos esse produto, então vamos pegar a primeira linha vazia da abaEstoque, e armazenar na variável priLin
    • Armazenaremos na 1ª coluna da abaEstoque o nome do Produto em questão (que está na CxProdutoCompras), na linha identificada pela variável priLin
    • Para finalizar o processo na aba Estoque vamos fazer também o estilo de linha da borda ser contínua, para as informações inseridas, da linha A até a linha D da linha dada por priLin da abaEstoque
  • Com todos os cadastros feitos nas abas Compras, Caixa e Estoque, vamos prosseguir chamando as macros limparCamposDoFormulario e atualizaCaixaDeListagemCompras, que vão respectivamente limpar os campos do formulário da aba Compras e atualizar a caixa de listagem da aba compras com os novos dados adicionados
  • Vamos apagar o conteúdo (Nothing) das variáveis abaCompras, abaCaixa e abaEstoque, que antes armazenavam objetos
  • Se encerra o código

OBS: Você tem a opção de “abrir”/criar cada Private Sub quando você clicar, em duplo clique, nos botões (objetos) diretamente no formulário.

Nesse caso, optaríamos por entrar na aba Compras do formulário e daríamos duplo clique no botão “Adicionar” dela, para abrir o código.

Então, o que você aprendeu nessa (Controle para Empresas Aula14) aula foi, resumidamente:

Voltar para o índice

Aula 15 – Controle para Empresas – Cálculo do Estoque Automático

Hoje em Controle para Empresas Aula15 eu quero te mostrar como fazer o cálculo do estoque de forma automática com o VBA!

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo!

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Essa é a décima quinta aula (Controle para Empresas Aula15) da série, nessa aula nós vamos te mostrar como fazer cálculo automático no VBA para o estoque!

Vamos atualizar a caixa de listagem na parte de estoque para todos os produtos! Para isso vamos utilizar a estrutura de repetição for no VBA e claro a estrutura condicional if no VBA.

Além disso nós vamos utilizar os eventos no VBA, que são gatilhos para executar uma macro sempre que um desses eventos acontecer.

Neste caso nós vamos utilizar o evento change no VBA, que é sempre que acontecer uma mudança, nesse caso, uma mudança de aba.

Então sempre que alterarmos uma das abas esse código será executado para poder atualizar nosso estoque de forma automática.

Ajuste num módulo específico

Para acessar um módulo já criado, precisamos primeiramente abrir o ambiente de VBA, a partir do atalho do teclado Alt(+Fn)+F11.
Opa

Vamos localizar o módulo “modAtualizarCaixaListagem”, daremos duplo clique nele para fazer ajustes na sub abaixo, criada na aula 10 da nossa série:

Sub atualizaCaixaDeListagemEstoque()

Dim abaEstoque As Object, abaCompras As Object, abaVendas As Object
Dim ultLin As Long, linha As Long

Set abaEstoque = Sheets("Estoque")
Set abaCompras = Sheets("Compras")
Set abaVendas = Sheets("Vendas")

ultLin = abaEstoque.Range("A1000000").End(xlUp).Row

If ultLin > 1 Then

    For linha = 2 To ultLin
       abaEstoque.Cells(linha, 2).Value = WorksheetFunction.SumIf(abaCompras.Range("E:E"), abaEstoque.Cells(linha, 1).Value, abaCompras.Range("F:F"))
       abaEstoque.Cells(linha, 3).Value = WorksheetFunction.SumIf(abaVendas.Range("E:E"), abaEstoque.Cells(linha, 1).Value, abaVendas.Range("F:F"))
       abaEstoque.Cells(linha, 4).Value = abaEstoque.Cells(linha, 2).Value - abaEstoque.Cells(linha, 3).Value
   Next

End If


ControleDaEmpresa.CxListagemEstoque.ColumnCount = 4
ControleDaEmpresa.CxListagemEstoque.ColumnHeads = True
ControleDaEmpresa.CxListagemEstoque.ColumnWidths = "125;125;125;125"
ControleDaEmpresa.CxListagemEstoque.RowSource = "Estoque!A2:D" & ultLin

End Sub

Explicação do código acima (atualizaCaixaDeListagemEstoque):

  • No começo vamos dimensionar a variável “abaEstoque” como um objeto, que vai representar de fato a aba “Estoque” do nosso arquivo em Excel
  • Vamos também dimensionar a variável “abaCompras” como um objeto, que vai representar de fato a aba “Compras” do nosso arquivo em Excel
  • Após, vamos dimensionar a variável “abaVendas” como um objeto, que vai representar de fato a aba “Vendas” do nosso arquivo em Excel
  • Também vamos dimensionar a variável “ultLin” como um número do tipo Long, que vai representar um número natural maior que zero que pode vir a ser grande. Faremos o mesmo com a variável “linha”
  • Vamos “setar”/configurar/dizer que abaEstoque é o objeto que vai representar a aba “Estoque” da nossa planilha. Isso se dá através do comando Set no VBA
  • Vamos “setar”/configurar/dizer que abaCompras é o objeto que vai representar a aba “Compras” da nossa planilha. Isso se dá através do comando Set no VBA
  • Vamos “setar”/configurar/dizer que abaVendas é o objeto que vai representar a aba “Vendas” da nossa planilha. Isso se dá através do comando Set no VBA
  • Após essas configurações, vamos descobrir a última linha preenchida da coluna A, da abaEstoque, e iremos armazenar essa informação na variável “ultLin”
  • Vamos, antes do preenchimento de fato fazer uma verificação através de uma Estrutura If no VBA para verificar se temos alguma linha preenchida (se ultLin é maior do que 1). Caso seja, vamos fazer o preenchimento normalmente. Se não for (ultLin =1), teremos apenas o cabeçalho preenchido, então não vamos fazer nenhuma ação (porque não há produtos cadastrados)
  • Tendo produtos cadastrados, faremos as seguintes ações, utilizando de uma estrutura de repetição do tipo For:
    • Na célula localizada na linha dada pela variável “linha” e na 2ª coluna da abaEstoque, vamos inserir o resultado da Função SOMASE no Excel, fazendo a soma do que estiver na coluna F da abaCompras, considerando o que na coluna E da abaCompras, o que for igual ao que tiver na célula localizada na linha dada pela variável “linha” e 1ª coluna da abaEstoque. Com isso conseguimos a quantidade de produtos comprados
    • Na célula localizada na linha dada pela variável “linha” e na 3ª coluna da abaEstoque, vamos inserir o resultado da Função SOMASE no Excel, fazendo a soma do que estiver na coluna F da abaVendas, considerando o que na coluna E da abaVendas, o que for igual ao que tiver na célula localizada na linha dada pela variável “linha” e 1ª coluna da abaEstoque. Com isso conseguimos a quantidade de produtos vendidos
    • Na célula localizada na linha dada pela variável “linha” e na 4ª coluna da abaEstoque nós vamos fazer a diferença do resultado da célula localizada na 2ª linha e na 2ª coluna da abaEstoque (quantidade de produto comprada) e da célula localizada na linha dada pela variável “linha” e na 3ª coluna da abaEstoque (quantidade de produto vendida). Com isso conseguimos a quantidade de produtos em estoque
  • Vamos configurar a caixa de listagem contendo as informações de Estoque (CxListagemEstoque), que vai ter 4 colunas. Repare que essa caixa de listagem está no ControleDaEmpresa, por isso o comando começa com o nome do formulário.
  • A próxima instrução irá dizer que a nossa caixa de listagem tem cabeçalho (Heads = True).
  • Em seguida iremos passar para o código a largura de cada coluna. Das 9 existentes, separadas por ponto e vírgula (;). Lembrando que isso é ajuste fino e cada usuário pode personalizar a largura como deseja.
  • A última linha do nosso código diz respeito ao carregamento de informações que a nossa caixa de listagem vai ter. A fonte de dados (RowSource) da nossa caixa de listagem será preenchida com as informações da aba “Estoque”, da 2ª linha da coluna A até a última linha da coluna D, dada pela variável “ultLin” descoberta no começo do nosso código.
  • E encerra-se a nossa (primeira) sub.

Agora, precisamos dentro do código do formulário falar que: quando acessarmos a aba de Estoque, queremos que ela seja/esteja atualizada. Porque se adicionarmos algum produto, por exemplo, a mudança não estaria refletida.

Então iremos chamar essa sub para disparar quando o nosso formulário ControleDaEmpresa estiver exatamente na abaEstoque.

Acessando o código do formulário

Para fazer alterações no nosso formulário já criado, precisamos primeiramente abrir o ambiente de VBA, a partir do atalho do teclado Alt(+Fn)+F11.

Mais uma vez lembrando que, para abrir o código do nosso formulário de interesse, devemos ir com o botão direito no formulário ControleDaEmpresa > exibir código.

Formulário VBA
Formulário VBA

Colocaremos a seguinte private sub no interior do código do formulário:

Private Sub BlocoDeAbas_Change()

If BlocoDeAbas.Value = 3 Then Call atualizaCaixaDeListagemEstoque

End Sub

Explicação:

  • Vamos optar pelo evento Change do bloco de abas porque queremos fazer a atualização/verificação quando houver alguma mudança no nosso formulário
  • Vamos fazer a seguinte verificação: se estivermos na aba 3 (valor do bloco de abas for igual a 3), então chamaremos a sub para atualizar a caixa de listagem estoque.
  • Caso contrário, não atualizaremos o estoque
  • Se encerra a sub

Para fechar a aula de hoje vamos incluir um ajuste na sub privada (dentro do formulário) para ele ser aberto sempre na primeira aba.

Private Sub UserForm_Initialize()

BlocoDeAbas.Value = 0
 
Call atualizaCaixaDeListagemCompras
Call atualizaCaixaDeListagemVendas
Call atualizaCaixaDeListagemCaixa
Call atualizaCaixaDeListagemEstoque

End Sub

Explicação:

  • Vamos optar pelo evento Initialize do bloco de abas porque queremos fazer a atualização/verificação quando houver a abertura do nosso formulário
  • Vamos forçar/configurar para que o formulário esteja na aba 0 quando abrir (valor do bloco de abas for igual a 0)
  • Além disso, atualizaremos as caixas de listagem de Compras, Vendas, Caixa e Estoque
  • Se encerra a sub

Nessa aula (Controle para Empresas Aula15) você resumidamente lidou com:

Voltar para o índice

Aula 16 – Controle para Empresas – Cadastrando Movimentações

Hoje em Controle para Empresas Aula16 vamos cadastrar as movimentações na aba vendas para automatizar esse preenchimento com o VBA!

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo!

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Essa é a décima sexta (Controle para Empresas Aula16) aula da série, nessa aula vamos te mostrar como cadastrar as movimentações na aba de vendas!

Como boa parte do que vamos fazer nós já temos de macros anteriores isso fica muito mais fácil, pois agora só vamos precisar copiar e fazer alguns pequenos ajustes na macro.

Temos a validação de campos no VBA, validação de ID duplicado, limpar campos no formulário, atualizar caixa de listagem, estrutura condicional if.

Vamos utilizar o SOMASE no VBA com o worksheetfunction.sumif para verificar o total do estoque para validar se podemos ou não efetuar uma venda.

E para essa comparação vamos utilizar o CLng no VBA (converter para long no VBA) para garantir que a comparação será feita entre 2 números e não entre um número e um texto.

Caso não seja possível efetuar uma venda vamos utilizar a caixa de mensagens no VBA (Msgbox) para informar isso ao usuário.

E por fim nós vamos cadastrar informações do VBA no Excel. Lembrando que praticamente todas as macros já existem, só vamos fazer os ajustes para cada aba!

Acessando o código do formulário

Para fazer alterações no nosso formulário já criado, precisamos primeiramente abrir o ambiente de VBA, a partir do atalho do teclado Alt(+Fn)+F11. Assim poderemos continuar o nosso formulário de controle da empresa.

Mais uma vez lembrando que, para abrir o código do nosso formulário de interesse, devemos ir com o botão direito no formulário ControleDaEmpresa > exibir código.

Controle para Empresas Aula16
Controle para Empresas Aula16

Inserindo o código abaixo dentro dos códigos já existentes no formulário

Private Sub BtAdicionarVendas_Click()

Dim abaVendas As Object, abaCaixa As Object, abaEstoque As Object
Dim priLin As Long, qtdProduto As Long, IDMovimentacao As Long, estoqueProduto As Long


'Validando os campos do formulário
If checarCamposVazios Then Exit Sub

'Validando o ID da Movimentação
If CxIDVendas.Value <> "" Then
   If checarIDDuplicado(CxIDVendas.Value) Then Exit Sub

End If

Set abaVendas = Sheets("Vendas")
Set abaCaixa = Sheets("Caixa")
Set abaEstoque = Sheets("Estoque")


'Validar se a quantidade a ser vendida está disponível em Estoque
estoqueProduto = WorksheetFunction.SumIf(abaEstoque.Range("A:A"), CxProdutoVendas.Value, abaEstoque.Range("D:D"))


If estoqueProduto < CLng(CxQuantidadeVendas.Value) Then
   MsgBox ("O estoque do produto em questão não é suficiente para realizar essa venda.")
   Exit Sub

End If

 

'Cadastrando na aba Vendas
priLin = abaVendas.Range("A1000000").End(xlUp).Row + 1

IDMovimentacao = WorksheetFunction.Max(abaCaixa.Range("A:A")) + 1

abaVendas.Cells(priLin, 1).Value = IDMovimentacao
abaVendas.Cells(priLin, 2).Value = CDate(CxDataPVendas.Value)
abaVendas.Cells(priLin, 3).Value = CDate(CxDataCVendas.Value)
abaVendas.Cells(priLin, 4).Value = CxClienteVendas.Value
abaVendas.Cells(priLin, 5).Value = CxProdutoVendas.Value
abaVendas.Cells(priLin, 6).Value = CLng(CxQuantidadeVendas.Value)
abaVendas.Cells(priLin, 7).Value = CDbl(CxValorVendaVendas.Value)
abaVendas.Cells(priLin, 8).Value = CDbl(CxCustoUVendas.Value)
abaVendas.Cells(priLin, 9).Value = CDbl(CxCustoVVendas.Value)

abaVendas.Range("A" & priLin & ":I" & priLin).Borders.LineStyle = xlContinuous



'Cadastrando na aba Caixa
priLin = abaCaixa.Range("A1000000").End(xlUp).Row + 1

abaCaixa.Cells(priLin, 1).Value = IDMovimentacao
abaCaixa.Cells(priLin, 2).Value = CDate(CxDataPVendas.Value)
abaCaixa.Cells(priLin, 3).Value = CDate(CxDataCVendas.Value)
abaCaixa.Cells(priLin, 4).Value = CxProdutoVendas.Value
abaCaixa.Cells(priLin, 5).Value = "Venda"
abaCaixa.Cells(priLin, 6).Value = CxContaVendas.Value
abaCaixa.Cells(priLin, 7).Value = CDbl(CxValorVendaVendas.Value)
abaCaixa.Cells(priLin, 8).Value = CxStatusVendas.Value

abaCaixa.Range("A" & priLin & ":H" & priLin).Borders.LineStyle = xlContinuous


'Limpar campos do formulário
Call limparCamposDoFormulario


'Atualizar Caixa de Listagem
Call atualizaCaixaDeListagemVendas
Call atualizaCaixaDeListagemCaixa


Set abaVendas = Nothing
Set abaCaixa = Nothing
Set abaEstoque = Nothing

End Sub

Explicação do código acima (BtAdicionarVendas_Click):

  • Vamos dimensionar uma variável chamada abaVendas como um objeto
  • Vamos dimensionar uma variável chamada abaCaixa como um objeto
  • Vamos dimensionar uma variável chamada abaEstoque como um objeto
  • Dimensionar uma variável chamada priLin como um número do tipo Long. Também dimensionar outras variáveis, sendo qtdProduto, IDMovimentacao estoqueProduto números do tipo Long. Para mais detalhes dos tipos de variáveis no VBA visite essa página.
  • Vamos usar de uma estrutura de comparação If que vai verificar se a function criada anteriormente (checarCamposVazios) retornar valor verdadeiro (alguma caixa estiver vazia), nada será feito em termos de adição de dados na planilha através do botão de adicionar, porque o código será abortado através do comando Exit Sub (instrução de saída).
  • Por outro lado, se a resposta da function for falsa (ou seja, nenhuma caixa vazia), o botão de adicionar poderá funcionar normalmente
  • Para validar o ID da movimentação vamos ver se a CxIDVendas está preenchida (é diferente de vazio). Caso esteja preenchida, vamos invocar nossa função checarIDDuplicado para analisar a CxIDVendas para verificar aquele ID específico. Caso ela retorne com o resultado de que o ID existe, vamos abortar a nossa sub. Caso ela retorne com resultado de que não existe, vamos prosseguir com o código para adicionar esse ID/movimentação na planilha e no formulário
  • Vamos configurar a variável abaVendas para representar um objeto inteiro, que será nesse caso a aba do nosso arquivo em Excel “Compras”
  • Vamos configurar a variável abaCaixa para representar um objeto inteiro, que será nesse caso a aba do nosso arquivo em Excel “Caixa”
  • Vamos configurar a variável abaEstoque para representar um objeto inteiro, que será nesse caso a aba do nosso arquivo em Excel “Estoque”
  • Vamos armazenar na variável “estoqueProduto” a soma das quantidades da coluna D da abaEstoque do produto em questão (que estará na CxProdutoVendas).
  • Faremos uma verificação, através de uma estrutura If para verificar se o estoqueProduto é menor do que o valor numérico (dado pela função de conversão CLng) que está escrito na CxQuantidadeVendas:
    • Se for menor, uma mensagem na tela (MsgBox) vai aparecer: “O estoque do produto em questão não é suficiente para realizar essa venda.” e a macro será abortada (através da instrução de saída Exit Sub). Ou seja, nada será registrado na planilha/sistema
    • Se for maior, seguiremos com o registro na planilha/sistema daquela venda
  • Cadastro na aba Vendas
    • Vamos armazenar na variável priLin a informação da primeira linha vazia da coluna A da abaVendas
    • Vamos armazenar na variável IDMovimentacao o valor resultado da soma entre o maior valor da coluna A da abaCaixa com 1 unidade, representando sempre um ID único a ser adicionado (número 1 unidade maior do que o ID anterior)
    • O valor da célula da linha dada pela variável priLin, e da coluna 1 (coluna A) da aba Vendas vai receber o que estiver na variável IDMovimentacao
    • O valor da célula da linha dada pela variável priLin, e da coluna 2 (coluna B) da aba Vendas vai receber o que estiver presenta na CxDataPVendas, convertido para data
    • O valor da célula da linha dada pela variável priLin, e da coluna 3 (coluna C) da aba Vendas vai receber o que estiver presenta na CxDataCVendas, convertido para data
    • O valor da célula da linha dada pela variável priLin, e da coluna 4 (coluna D) da aba Vendas vai receber o que estiver presenta na CxClienteVendas
    • O valor da célula da linha dada pela variável priLin, e da coluna 5 (coluna E) da aba Vendas vai receber o que estiver presenta na CxProdutoVendas
    • O valor da célula da linha dada pela variável priLin, e da coluna 6 (coluna F) da aba Vendas vai receber o que estiver presenta na CxQuantidadeVendas, convertido para número
    • O valor da célula da linha dada pela variável priLin, e da coluna 7 (coluna G) da aba Vendas vai receber o que estiver presenta na CxValorVendaVendas, convertido para número O valor da célula da linha dada pela variável priLin, e da coluna 8 (coluna H) da aba Vendas vai receber o que estiver presenta na CxCustoUVendas, convertido para número
    • O valor da célula da linha dada pela variável priLin, e da coluna 9 (coluna I) da aba Vendas vai receber o que estiver presenta na CxCustoVVendas, convertido para número
    • Para finalizar o processo na aba Vendas, vamos fazer também o estilo de linha da borda ser contínua, para as informações inseridas, da linha A até a linha I da linha dada por priLin da abaVendas
  • Cadastro na aba Caixa
    • Vamos em seguida armazenar na variável priLin (reaproveitar o nome) a informação da primeira linha vazia da coluna A da abaCaixa
    • O valor da célula da linha dada pela variável priLin, e da coluna 1 (coluna A) da aba Caixa vai receber o que estiver presenta na IDMovimentacao, convertido para número
    • O valor da célula da linha dada pela variável priLin, e da coluna 2 (coluna B) da aba Caixa vai receber o que estiver presenta na CxDataPVendas, convertido para data
    • O valor da célula da linha dada pela variável priLin, e da coluna 3 (coluna C) da aba Caixa vai receber o que estiver presenta na CxDataCVendas, convertido para data
    • O valor da célula da linha dada pela variável priLin, e da coluna 4 (coluna D) da aba Caixa vai receber o que estiver presenta na CxProdutoVendas
    • O valor da célula da linha dada pela variável priLin, e da coluna 5 (coluna E) da aba Caixa vai receber o texto “Venda”
    • O valor da célula da linha dada pela variável priLin, e da coluna 6 (coluna F) da aba compras vai receber o que estiver presenta na CxContaVendas, convertido para número
    • O valor da célula da linha dada pela variável priLin, e da coluna 7 (coluna G) da aba Caixa vai receber o que estiver presenta na CxValorVendaVendas, convertido para número e multiplicada por menos 1 (sinal de menos na frente)
    • O valor da célula da linha dada pela variável priLin, e da coluna 8 (coluna H) da aba Caixa vai receber o que estiver presenta na CxStatusVendas, convertido para número
    • Para finalizar o processo na aba Caixa vamos fazer também o estilo de linha da borda ser contínua, para as informações inseridas, da linha A até a linha H da linha dada por priLin da abaCaixa
  • Com todos os cadastros feitos nas abas Vendas e Caixa, vamos prosseguir chamando as macros limparCamposDoFormulario, atualizaCaixaDeListagemVendas e atualizaCaixaDeListagemCaixa, que vão respectivamente limpar os campos do formulário da aba Vendas, atualizar a caixa de listagem da aba Vendas, e atualizar a caixa de listagem da aba Caixa com os novos dados adicionados
  • Vamos apagar o conteúdo (Nothing) das variáveis abaCompras, abaCaixa e abaEstoque, que antes armazenavam objetos
  • Se encerra o código

OBS: Você tem a opção de “abrir”/criar cada Private Sub quando você clicar, em duplo clique, nos botões (objetos) diretamente no formulário.

Nesse caso, optaríamos por entrar na aba Vendas do formulário e daríamos duplo clique no botão “Adicionar” dela, para abrir o código.

OBS2: Explicamos a estrutura If em outro post do nosso blog também de forma detalhada, caso queira conferir.

OBS3: Para conferir mais detalhes sobre usar as funções do Excel no VBA (WorksheetFunction) você pode dar uma olhada nesse outro post em que abordamos justamente isso.

OBS4: Para conferir detalhes sobre as funções de conversão de tipo, dê uma olhada nesse link aqui!

Nessa aula (Controle para Empresas Aula16) você resumidamente lidou com:

Voltar para o índice

Aula 17 – Controle para Empresas – Cálculo do Custo Unitário Médio

Hoje em Controle para Empresas Aula17 vamos dar início ao cálculo de custo unitário médio da venda no Excel para depois passar ao VBA!

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo!

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Essa é a décima sétima aula da série, nessa aula vamos te mostrar como calcular custo unitário de uma venda!

Vamos fazer o cálculo de custo unitário no Excel para que fique mais fácil de entender, então fique ligado no passo a passo, e veja também como utilizar a função SOMASES no Excel para fazer alguns cálculos.

Dessa forma vai ficar mais fácil para que você entenda a parte de custo médio no Excel e facilite na hora de criar o código em VBA.

Essa é uma boa prática quando você ainda não tem muita experiência ou de fato precisa aprender como vai construir a lógica dentro do VBA.

Então é importante que faça o cálculo de custo unitário no Excel (ou qualquer outra operação que precise fazer) e depois tendo todos os passos você consegue passar para o VBA de uma forma muito mais fácil e rápida.

Até porque fazendo os cálculos dentro do Excel você vai conseguir confirmar se o seu código em VBA está funcionando corretamente e está retornando exatamente o que precisa!

Agora vamos a aula que ela tem muitos detalhes importantes para que você entenda o cálculo de custo da venda no Excel!

Aba Compras

Compras

– Custo de Compra

É o que vai nos dar o custo de compra daquelas unidades em questão, até a data analisada.

Para retornar o custo de compra vamos utilizar de uma função SOMASES no Excel.

Nela vamos somar na coluna G da aba Compras o que na coluna E da aba Compras for equivalente ao produto que está na célula C7 da aba Vendas (exemplo: Produto2), e que na coluna C da aba compras corresponda a uma data menor ou igual à existente na célula C5 da aba Vendas (exemplo: 20/11/2021).

Segue a fórmula usada:

=SOMASES(Compras!G:G;Compras!E:E;Vendas!C7;Compras!C:C;"<="&Vendas!C5)

Resultado: R$ 21.748,30

OBS: Repare que foram somados os custos totais das linhas 3 e 5 da aba de Compras.

– Quantidade Comprada

É o que vai nos dar a quantidade comprada daquele produto em questão, até a data analisada.

Para retornar a quantidade comprada vamos utilizar também de uma função SOMASES no Excel.

Nela vamos somar na coluna F da aba Compras o que na coluna E da aba Compras for equivalente ao produto que está na célula C7 da aba Vendas (exemplo: Produto2), e que na coluna C da aba compras corresponda a uma data menor ou igual à existente na célula C5 da aba Vendas (exemplo: 20/11/2021).

Segue a fórmula usada:

=SOMASES(Compras!F:F;Compras!E:E;Vendas!C7;Compras!C:C;"<="&Vendas!C5)

Resultado: 1400

OBS: Repare que foram somadas as quantidades das linhas 3 e 5 da aba de Compras.

Aba Vendas

Vendas

– Custo de Venda

É o que vai nos dar o custo de venda daquelas unidades em questão, até a data analisada.

Para retornar o custo de venda vamos utilizar de uma função SOMASES no Excel.

Nela vamos somar na coluna I da aba Vendas (custo da venda) o que na coluna E (produtos) da aba Vendas for equivalente ao produto que está na célula C7 da aba Vendas (exemplo: Produto2), e que na coluna C (data de competência) da aba Vendas corresponda a uma data menor ou igual à existente na célula C5 da aba Vendas (exemplo: 20/11/2021), além de levar em consideração que na coluna A (de IDs) da aba Vendas vão ser analisados os IDs diferentes do ID em questão (exemplo: 8).

Segue a fórmula usada:

=SOMASES(I:I;E:E;C7;C:C;"<="&C5;A:A;"<>"&A5)

Resultado: R$ 14.451,79

OBS: Repare que foram somadas as quantidades das linhas 3 e 4 da aba de Vendas, desconsiderando a linha 5 porque ela é o mesmo do ID em questão (exemplo: 8).

– Quantidade Vendida

É o que vai nos dar a quantidade vendida daquelas unidades em questão, até a data analisada.

Para retornar a quantidade vendida vamos utilizar também de uma função SOMASES no Excel.

Nela vamos somar na coluna F da aba Vendas (quantidade) o que na coluna E (produtos) da aba Vendas for equivalente ao produto que está na célula C7 da aba Vendas (exemplo: Produto2), e que na coluna C (data de competência) da aba Vendas corresponda a uma data menor ou igual à existente na célula C5 da aba Vendas (exemplo: 20/11/2021), além de levar em consideração que na coluna A (de IDs) da aba Vendas vão ser analisados os IDs diferentes do ID em questão (exemplo: 8).

Segue a fórmula usada:

=SOMASES(F:F;E:E;C7;C:C;"<="&C5;A:A;"<>"&A5)

Resultado: 900

OBS: Repare que foram somadas as quantidades das linhas 3 e 4 da aba de Vendas, desconsiderando a linha 5 porque ela é o mesmo do ID em questão (exemplo: 8).

Custo Unitário

Vamos utilizar da seguinte expressão matemática para definir o custo unitário:

= (Custo de Compra – Custo de Venda) / (Quantidade Comprada – Quantidade Vendida)

=(D8-D10)/(D9-D11)

= (R$ 21.748,30 - R$ 14.451,79) / (1400 - 900)

= R$ 7.296,51 / 500

= R$ 14,5930200

= R$ 14,59

Tabela resumo dos exemplos usados em aula:

Controle para Empresas Aula17

Tabela com fórmulas expostas:

Controle para Empresas Aula17

Nessa aula (Controle para Empresas Aula17) você aprendeu a calcular custo unitário de uma venda, a calcular custo unitário de uma venda, a usar a função SOMASES no Excel.

Voltar para o índice

Aula 18 – Parte 1 – Controle para Empresas – Automatizando Cálculo de Custo

Hoje em Controle para Empresas Aula18 vamos começar a automatizar o cálculo de custo unitário médio da venda com o VBA!

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo!

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Essa é a décima oitava aula da série, nessa aula vamos dar continuidade ao cálculo de custo unitário no Excel!

Já vimos como fazer o custo unitário médio no Excel na aula passada, mas hoje nós vamos dar início ao custo unitário médio no VBA.

Vamos começar a construir a macro no VBA para fazer esse cálculo. Para isso vamos utilizar o SOMASES no VBA, que seria o SumIfs no VBA.

Lembrando que para utilizar uma função do Excel dentro do VBA é necessário utilizar o worksheetfunction.

Isso pode facilitar em alguns cálculos para que você não tenha que escrever uma função para fazer algo que já existe dentro do Excel.

Agora vamos a aula para iniciar o nosso cálculo de custo unitário médio!

Os passos da aula de hoje:

Inserindo um módulo

Para criar um código dentro de um módulo, precisamos primeiramente abrir o ambiente de VBA, a partir do atalho do teclado Alt(+Fn)+F11. Assim poderemos de fato criar o nosso código a ser utilizado.

Como não temos nenhum módulo criado antes nessa planilha, vamos na guia Inserir > Módulo, e uma caixa branca se abrirá.
InserirModulo

Alteraremos a propriedade “name” do módulo para “modCalcularCustoVenda”.

Em seguida colocaremos a seguinte sub (código) dentro desse módulo, que será o objeto de estudo da aula de hoje:

Option Explicit

Sub calcularCustoVenda()

Dim abaVendas As Object, abaCompras As Object
Dim custoCompra As Double, custoVenda As Double, custoUnitario As Double, custoTotalVenda As Double
Dim qtdCompra As Long, qtdVenda As Long

Set abaCompras = Sheets("Compras")
Set abaVendas = Sheets("Vendas")


'custoCompra = WorksheetFunction.SumIfs(abaCompras.Range("G:G"), abaCompras.Range("E:E"), ControleDaEmpresa.CxProdutoVendas.Value, abaCompras.Range("C:C"), "<=" & ControleDaEmpresa.CxDataCVendas.Value)

custoCompra = WorksheetFunction.SumIfs(abaCompras.Range("G:G"), abaCompras.Range("E:E"), "Produto2", abaCompras.Range("C:C"), "<=" & CLng(CDate("20/11/2021")))
qtdCompra = WorksheetFunction.SumIfs(abaCompras.Range("F:F"), abaCompras.Range("E:E"), "Produto2", abaCompras.Range("C:C"), "<=" & CLng(CDate("20/11/2021")))

custoVenda = WorksheetFunction.SumIfs(abaVendas.Range("I:I"), abaVendas.Range("E:E"), "Produto2", abaVendas.Range("C:C"), "<=" & CLng(CDate("20/11/2021")), abaVendas.Range("A:A"), "<>" & 8)
qtdVenda = WorksheetFunction.SumIfs(abaVendas.Range("F:F"), abaVendas.Range("E:E"), "Produto2", abaVendas.Range("C:C"), "<=" & CLng(CDate("20/11/2021")), abaVendas.Range("A:A"), "<>" & 8)

custoUnitario = (custoCompra - custoVenda) / (qtdCompra - qtdVenda)
custoTotalVenda = Round(custoUnitario * 300, 2)

End Sub

Explicação do código acima “calcularCustoVenda”:

  • Vamos começar a sub com uma configuração para o módulo, em si: ativando o modo “Option Explicit”, que significa que seremos obrigados a declarar todas as variáveis usadas no código. Do contrário, seremos alertados com uma mensagem de erro.
  • Dimensionar:
    • abaVendas e abaCompras como objetos
    • custoCompra, custoVenda, custoUnitario, custoTotalVenda como números do tipo Double (decimal)
    • qtdCompra e qtdVenda como números do tipo Long (inteiro de grandes magnitudes, incluindo números de -2.147.483.648 a 2.147.483.647)
    • Para entender melhor os tipos de dados no VBA, visite esse link
  • Configurar (“setar”):
    • abaCompras para assumir o objeto aba da planilha de nome “Compras”
    • abaVendas para assumir o objeto aba da planilha de nome “Vendas”
  • Armazenar na variável custoCompra o resultado da soma da coluna G da aba Compras, considerando o que na coluna E da aba Compras for equivalente ao “Produto2”, e que na coluna C da aba compras corresponda a uma data menor ou igual a 20/11/2021
  • Armazenar na variável qtdCompra o resultado da soma da coluna F da aba Compras, o que na coluna E da aba Compras for equivalente ao “Produto2”, e que na coluna C da aba compras corresponda a uma data menor ou igual a 20/11/2021
  • Armazenar na variável custoVenda o resultado da soma da coluna I da aba Vendas (custo da venda) o que na coluna E (produtos) da aba Vendas for equivalente “ Produto2”, e que na coluna C (data de competência) da aba Vendas corresponda a uma data menor ou igual a 20/11/2021, além de levar em consideração que na coluna A (de IDs) da aba Vendas vão ser analisados os IDs diferentes do ID em questão (8)
  • Armazenar na variável qtdVenda o resultado da soma da coluna F da aba Vendas (quantidade) o que na coluna E (produtos) da aba Vendas for equivalente ao “Produto2”, e que na coluna C (data de competência) da aba Vendas corresponda a uma data menor ou igual a 20/11/2021, além de levar em consideração que na coluna A (de IDs) da aba Vendas vão ser analisados os IDs diferentes do ID em questão (8)
  • Armazenar, por final, na variável custoUnitario o resultado da razão entre a subtração de custoCompra por custoVenda e qtdCompra e qtdVenda, que resulta na expressão matemática: (custoCompra – custoVenda) / (qtdCompra – qtdVenda)
  • Armazenar na variável custoTotalVenda o resultado do produto de custoUnitario e o número 300 (quantidade usada no exemplo), arredondado para 2 casas decimais, pela função Round.

O código acima vai ser utilizado para auxiliar o código de cadastro de produtos no nosso formulário.

Vamos “chamar” esse mesmo código universal para todas as páginas/abas do nosso formulário. Independentemente da página e dos nomes das caixas de textos dela, ele irá interpretar as ações necessárias e calcular.

Hoje começamos a ver como é o cálculo para o exemplo dado na aula passada, de forma didática, traduzindo o que tínhamos estruturado por fórmulas do Excel dentro do VBA. Na próxima aula vamos tornar ele automático, para funcionar para qualquer caso e interagindo com as informações do formulário.

OBS1: Caso queira aprender mais sobre o método WorksheetFunction, e sobre a função SOMASES no VBA, indicamos esse outro post aqui que te ensina com detalhes.

OBS2: Além disso, explicamos a diferença entre Dim e Set em outro post do nosso blog também de forma detalhada, caso queira conferir.

OBS3: Para entender melhor sobre funções de conversão de tipo (CLng e CDate usados no código), visite esse link aqui.

Nessa aula (Controle para Empresas Aula18) você lidou com:

Voltar para o índice

Aula 19 – Parte 2 – Controle para Empresas – Automatizando Cálculo de Custo

Hoje em Controle para Empresas Aula19 vamos dar continuidade a automação do cálculo de custo unitário médio da venda com VBA!

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo!

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Essa é a décima nona aula (Controle para Empresas Aula19) da série, nessa aula vamos dar continuidade ao cálculo de custo unitário no Excel só que dentro do formulário.

Fizemos na aula 17 o cálculo do custo unitário e na aula 18 nós fizemos o custo unitário médio no VBA.

O objetivo dessa aula é utilizar o código que já temos, onde temos o SOMASES no VBA (SumIfs no VBA), utilizando o worksheetfunction (permite a utilização de funções do Excel no VBA).

Só teremos que fazer alguns ajustes para que as macros funcionem corretamente quando preenchermos alguns campos, e é claro que temos que fazer a verificação desses campos para que os cálculos sejam feitos corretamente!

Assim teremos o nosso cálculo de custo unitário e custo unitário da venda sendo preenchidos de forma automática dentro do formulário.

Ajuste num módulo específico

Para acessar um módulo já criado, precisamos primeiramente abrir o ambiente de VBA, a partir do atalho do teclado Alt(+Fn)+F11.

Cálculo de custo unitário no Excel
Cálculo de custo unitário no Excel

Vamos localizar o módulo “modCalcularCustoVenda”, daremos duplo clique nele para fazer ajustes na sub abaixo, criada na aula passada da nossa série:

Option Explicit
Sub calcularCustoVenda()

Dim abaVendas As Object, abaCompras As Object
Dim custoCompra As Double, custoVenda As Double, custoUnitario As Double, custoTotalVenda As Double
Dim qtdCompra As Long, qtdVenda As Long

If ControleDaEmpresa.CxProdutoVendas.Value = "" Or ControleDaEmpresa.CxQuantidadeVendas.Value = "" Or ControleDaEmpresa.CxDataCVendas.Value = "" Then
   Exit Sub

End If

Set abaCompras = Sheets("Compras")
Set abaVendas = Sheets("Vendas")

custoCompra = WorksheetFunction.SumIfs(abaCompras.Range("G:G"), abaCompras.Range("E:E"), ControleDaEmpresa.CxProdutoVendas.Value, abaCompras.Range("C:C"), "<=" & CLng(CDate(ControleDaEmpresa.CxDataCVendas.Value)))
qtdCompra = WorksheetFunction.SumIfs(abaCompras.Range("F:F"), abaCompras.Range("E:E"), ControleDaEmpresa.CxProdutoVendas.Value, abaCompras.Range("C:C"), "<=" & CLng(CDate(ControleDaEmpresa.CxDataCVendas.Value)))
custoVenda = WorksheetFunction.SumIfs(abaVendas.Range("I:I"), abaVendas.Range("E:E"), ControleDaEmpresa.CxProdutoVendas.Value, abaVendas.Range("C:C"), "<=" & CLng(CDate(ControleDaEmpresa.CxDataCVendas.Value)))
qtdVenda = WorksheetFunction.SumIfs(abaVendas.Range("F:F"), abaVendas.Range("E:E"), ControleDaEmpresa.CxProdutoVendas.Value, abaVendas.Range("C:C"), "<=" & CLng(CDate(ControleDaEmpresa.CxDataCVendas.Value)))


custoUnitario = (custoCompra - custoVenda) / (qtdCompra - qtdVenda)
custoTotalVenda = Round(custoUnitario * ControleDaEmpresa.CxQuantidadeVendas.Value, 2)

ControleDaEmpresa.CxCustoUVendas.Value = Format(custoUnitario, "0.00")
ControleDaEmpresa.CxCustoVVendas.Value = Format(custoTotalVenda, "#,##0.00")

End Sub

Explicação do código acima “calcularCustoVenda”:

  • Vamos começar a sub com uma configuração para o módulo, em si: ativando o modo “Option Explicit”, que significa que seremos obrigados a declarar todas as variáveis usadas no código. Do contrário, seremos alertados com uma mensagem de erro.
  • Dimensionar:
    • abaVendas e abaCompras como objetos
    • custoCompra, custoVenda, custoUnitario, custoTotalVenda como números do tipo Double (decimal)
    • qtdCompra e qtdVenda como números do tipo Long (inteiro de grandes magnitudes, incluindo números de -2.147.483.648 a 2.147.483.647)
    • Para entender melhor os tipos de dados no VBA, visite esse link
  • Vamos usar de uma estrutura If para verificar se as caixas CxProdutoVendas ou CxQuantidadeVendas ou CxDataCVendas possuem algo preenchido.
    • Caso estejam, a macro segue para fazer o cálculo do custo de venda
    • Caso alguma delas (pelo menos uma) esteja vazia, a macro será abortada, pela expressão Exit Sub
  • Configurar (“setar”):
    • abaCompras para assumir o objeto aba da planilha de nome “Compras”
    • abaVendas para assumir o objeto aba da planilha de nome “Vendas”
  • Armazenar na variável custoCompra o resultado da soma da coluna G da aba Compras, considerando o que na coluna E da aba Compras for equivalente ao valor que estiver na CxProdutoVendas (produto), e que na coluna C da aba compras corresponda a uma data menor ou igual ao valor que estiver na CxDataCVendas (data)
  • Armazenar na variável qtdCompra o resultado da soma da coluna F da aba Compras, o que na coluna E da aba Compras for equivalente ao valor que estiver na CxProdutoVendas (produto)e que na coluna C da aba compras corresponda a uma data menor ou igual ao valor que estiver na CxDataCVendas (data)
  • Armazenar na variável custoVenda o resultado da soma da coluna I da aba Vendas (custo da venda) o que na coluna E (produtos) da aba Vendas for equivalente valor que estiver na CxProdutoVendas (produto)e que na coluna C (data de competência) da aba Vendas corresponda a uma data menor ou igual ao valor que estiver na CxDataCVendas (data)
  • Armazenar na variável qtdVenda o resultado da soma da coluna F da aba Vendas (quantidade) o que na coluna E (produtos) da aba Vendas for equivalente ao valor que estiver na CxProdutoVendas (produto)e que na coluna C (data de competência) da aba Vendas corresponda a uma data menor ou igual ao valor que estiver na CxDataCVendas (data)
  • Armazenar, por final, na variável custoUnitario o resultado da razão entre a subtração de custoCompra por custoVenda e qtdCompra e qtdVenda, que resulta na expressão matemática: (custoCompra – custoVenda) / (qtdCompra – qtdVenda)
  • Armazenar na variável custoTotalVenda o resultado do produto de custoUnitario e o valor que estiver na CxQuantidadeVendas, arredondado para 2 casas decimais, pela função Round
  • A CxCustoUVendas vai receber o valor resultante da da formatação (através da função Format) da variável custoUnitario para mostrar sempre 2 casas decimais
  • A CxCustoVVendas vai receber o valor resultante da da formatação (através da função Format) da variável custoTotalVenda para mostrar sempre 2 casas decimais

O código acima vai ser utilizado para auxiliar o código de cadastro de produtos no nosso formulário.

Vamos “chamar” esse mesmo código universal para todas as páginas/abas do nosso formulário. Independentemente da página e dos nomes das caixas de textos dela, ele irá interpretar as ações necessárias e calcular.

Nessa aula tornamos essa sub para interpretar o cálculo de preço unitário automático, para funcionar para qualquer caso, e interagir com as informações do formulário.

OBS1: Caso queira aprender mais sobre o método WorksheetFunction, e sobre a função SOMASES no VBA, indicamos esse outro post aqui que te ensina com detalhes.

OBS2: Além disso, explicamos a diferença entre Dim e Set em outro post do nosso blog também de forma detalhada, caso queira conferir.

OBS3: Para entender melhor sobre funções de conversão de tipo (CLng e CDate usados no código), visite esse link aqui.

Acessando o código do formulário

Para fazer alterações no nosso formulário já criado, precisamos primeiramente abrir o ambiente de VBA, a partir do atalho do teclado Alt(+Fn)+F11. Assim poderemos continuar o nosso formulário de controle da empresa.

Mais uma vez lembrando que, para abrir o código do nosso formulário de interesse, devemos ir com o botão direito no formulário ControleDaEmpresa > exibir código.

Controle para Empresas Aula19
Formulário VBA

Inserindo os códigos abaixo dentro dos códigos já existentes no formulário

Private Sub CxDataCVendas_Change()
Call calcularCustoVenda
End Sub
 
Private Sub CxProdutoVendas_Change()
Call calcularCustoVenda
End Sub

Private Sub CxQuantidadeVendas_Change()
Call calcularCustoVenda
End Sub

Explicação do código acima:

  • Os códigos acima vão simplesmente chamar (comando Call) a nossa sub criada anteriormente (calcularCustoVenda)
  • Ela vai ser chamada para os eventos de quando as CxDataCVendas, CxProdutoVendas e CxQuantidadeVendas forem mudadas/preenchidas de alguma forma
Controle para Empresas Aula19
Custo unitário no VBA
  • Se encerra o código de cada uma delas apenas com essa ação

OBS: Você tem a opção de “abrir”/criar cada Private Sub quando você clicar, em duplo clique, nos botões (objetos) diretamente no formulário.

Nessa aula (Controle para Empresas Aula19) você lidou com os conceitos:

Voltar para o índice

Aula 20 – Controle para Empresas – Cadastrando Movimentações

Hoje em Controle para Empresas Aula20 vamos fazer o cadastro das movimentações na aba de caixa para continuar nossa automação!

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo!

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Essa é a vigésima aula (Controle para Empresas Aula20) da nossa Série de Controle para Empresas. Nessa aula nós vamos cadastrar as movimentações na aba de caixa.

Essa construção é mais fácil, pois boa parte do que nós vamos utilizar já fizemos nas aulas anteriores.

Então já temos o formulário no VBA construído, mas vamos seguir alguns passos para cadastrar essas movimentações.

Vamos validar campos do Excel com VBA, validar ID duplicado, cadastrar informações na aba caixa, limpar campos do formulário com VBA e atualizar caixa de listagem.

Como boa parte desses procedimentos nós já fizemos, isso fica muito mais fácil, pois podemos copiar o código anterior e adaptar para essa nova atividade.

Então isso facilita muito o processo de criação e aumenta a sua produtividade!

Acessando o código do formulário

Para fazer alterações no nosso formulário já criado, precisamos primeiramente abrir o ambiente de VBA, a partir do atalho do teclado Alt(+Fn)+F11. Assim poderemos continuar o nosso formulário de controle da empresa.

Mais uma vez lembrando que, para abrir o código do nosso formulário de interesse, devemos ir com o botão direito no formulário ControleDaEmpresa > exibir código.

Controle para Empresas Aula20
Formulário VBA

Inserindo o código abaixo dentro dos códigos já existentes no formulário

Private Sub BtAdicionarCaixa_Click()

 

Dim abaCaixa As Object

Dim priLin As Long, IDMovimentacao As Long

 

'Validando os campos do formulário

If checarCamposVazios Then Exit Sub

 

'Validando o ID da Movimentação

If CxIDCaixa.Value <> "" Then

    If checarIDDuplicado(CxIDCaixa.Value) Then Exit Sub

End If

 

Set abaCaixa = Sheets("Caixa")

 

'Cadastrando na aba Caixa

priLin = abaCaixa.Range("A1000000").End(xlUp).Row + 1

 

IDMovimentacao = WorksheetFunction.Max(abaCaixa.Range("A:A")) + 1

 

abaCaixa.Cells(priLin, 1).Value = IDMovimentacao

abaCaixa.Cells(priLin, 2).Value = CDate(CxDataPCaixa.Value)

abaCaixa.Cells(priLin, 3).Value = CDate(CxDataCCaixa.Value)

abaCaixa.Cells(priLin, 4).Value = CxDescricaoCaixa.Value

abaCaixa.Cells(priLin, 5).Value = CxTipoCaixa.Value

abaCaixa.Cells(priLin, 6).Value = CxContaCaixa.Value

abaCaixa.Cells(priLin, 7).Value = CDbl(CxValorCaixa.Value)

abaCaixa.Cells(priLin, 8).Value = CxStatusCaixa.Value

 

abaCaixa.Range("A" & priLin & ":H" & priLin).Borders.LineStyle = xlContinuous

abaCaixa.Range("A:H").Columns.AutoFit

 

'Limpar campos do formulário

Call limparCamposDoFormulario

 

'Atualizar Caixa de Listagem

Call atualizaCaixaDeListagemCaixa

 

Set abaCaixa = Nothing

 

End Sub

Explicação do código acima (BtAdicionarCaixa_Click):

  • Vamos dimensionar uma variável chamada abaCaixa como um objeto
  • Dimensionar uma variável chamada priLin como um número do tipo Long. Também dimensionar IDMovimentacao como número do tipo Long. Para mais detalhes dos tipos de variáveis no VBA visite essa página.
  • Vamos usar de uma estrutura de comparação If que vai verificar se a function criada “checarCamposVazios” vai retornar valor verdadeiro (alguma caixa estiver vazia):
    • Nada será feito em termos de adição de dados na planilha através do botão de adicionar, porque o código será abortado através do comando Exit Sub (instrução de saída).
    • Por outro lado, se a resposta da function for falsa (ou seja, nenhuma caixa vazia), o botão de adicionar poderá funcionar normalmente
  • Para validar o ID da movimentação vamos ver se a CxIDCaixa está preenchida (é diferente de vazio). Caso esteja preenchida, vamos invocar nossa função checarIDDuplicado para analisar a CxIDCaixa para verificar aquele ID específico:
    • Caso ela retorne com o resultado de que o ID existe, vamos abortar a nossa sub.
    • Caso ela retorne com resultado de que não existe, vamos prosseguir com o código para adicionar esse ID/movimentação na planilha e no formulário
  • Vamos configurar a variável abaCaixa para representar um objeto inteiro, que será nesse caso a aba do nosso arquivo em Excel “Caixa”
  • Cadastro na aba Caixa
    • Vamos armazenar na variável priLin a informação da primeira linha vazia da coluna A da abaCaixa
    • Vamos armazenar na variável IDMovimentacao o valor resultado da soma entre o maior valor da coluna A da abaCaixa com 1 unidade, representando sempre um ID único a ser adicionado (número 1 unidade maior do que o ID registrado na coluna A antes da nova informação)
    • O valor da célula da linha dada pela variável priLin, e da coluna 1 (coluna A) da aba Caixa vai receber o que estiver na variável IDMovimentacao
    • O valor da célula da linha dada pela variável priLin, e da coluna 2 (coluna B) da aba Caixa vai receber o que estiver presenta na CxDataPCaixa, convertido para data
    • O valor da célula da linha dada pela variável priLin, e da coluna 3 (coluna C) da aba Caixa vai receber o que estiver presenta na CxDataCCaixa, convertido para data
    • O valor da célula da linha dada pela variável priLin, e da coluna 4 (coluna D) da aba Caixa vai receber o que estiver presenta na CxDescricaoCaixa
    • O valor da célula da linha dada pela variável priLin, e da coluna 5 (coluna E) da aba Caixa vai receber o que estiver presenta na CxTipoCaixa
    • O valor da célula da linha dada pela variável priLin, e da coluna 6 (coluna F) da aba Caixa vai receber o que estiver presenta na CxContaCaixa
    • O valor da célula da linha dada pela variável priLin, e da coluna 7 (coluna G) da aba Caixa vai receber o que estiver presenta na CxValorCaixa, convertido para número
    • O valor da célula da linha dada pela variável priLin, e da coluna 8 (coluna H) da aba Caixa vai receber o que estiver presenta na CxStatusCaixa
    • Para finalizar o processo na aba Caixa, vamos fazer também o estilo de linha da borda ser contínua, para as informações inseridas, da coluna A até a coluna H da linha dada por priLin da abaCaixa
    • vamos fazer também o autoajuste do tamanho das colunas A até H da linha dada por priLin da abaCaixa
  • Com todos os cadastros feitos nas abas Vendas e Caixa, vamos prosseguir chamando as macros limparCamposDoFormulario e atualizaCaixaDeListagemCaixa, que vão respectivamente limpar os campos do formulário da aba Vendas e atualizar a caixa de listagem da aba Caixa com os novos dados adicionados
  • Vamos apagar o conteúdo (Nothing) da variável abaCaixa, que antes armazenava um objeto
  • Se encerra o código

OBS: Você tem a opção de “abrir”/criar cada Private Sub quando você clicar, em duplo clique, nos botões (objetos) diretamente no formulário.

Nesse caso, optaríamos por entrar na aba Caixa do formulário e daríamos duplo clique no botão “Adicionar” dela, para abrir o código.

OBS: Explicamos a estrutura If em outro post do nosso blog também de forma detalhada, caso queira conferir.

OBS2: Para conferir mais detalhes sobre usar as funções do Excel no VBA (WorksheetFunction) você pode dar uma olhada nesse outro post em que abordamos justamente isso.

OBS3: Para conferir detalhes sobre as funções de conversão de tipo, dê uma olhada nesse link aqui.

Nessa aula (Controle para Empresas Aula20) você resumidamente lidou com:

Voltar para o índice

Aula 21 – Controle para Empresas – Excluindo Movimentações

Hoje em Controle para Empresas Aula21 vamos fazer o processo reverso da última aula que é excluir as movimentações!

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo!

Controle para Empresas Aula21

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Essa é a vigésima primeira aula (Controle para Empresas Aula21) da série, nessa aula vamos aprender como excluir dados com VBA.

Vamos criar a nossa macro dentro da caixa de listagem do VBA para que primeiramente possamos carregar campos do formulário com as informações selecionadas.

E em seguida vamos poder utilizar a macro de excluir para excluir dados de forma automática no VBA.

Então vamos selecionar as informações, elas serão atualizadas dentro do formulário e com isso vamos poder excluir esses dados.

Lembrando que vamos excluir essas informações de todas as abas, não só do formulário.

Esse é um recurso muito interessante, pois normalmente só aprendemos a parte de adicionar informações, mas muita das vezes precisamos excluir ou editar essas informações.

Agora vamos aprender como excluir dados do Excel com VBA de forma automática!

Inserindo um módulo

Para criar um código dentro de um módulo, precisamos primeiramente abrir o ambiente de VBA, a partir do atalho do teclado Alt(+Fn)+F11. Assim poderemos de fato criar o nosso código a ser utilizado.

Como não temos nenhum módulo criado antes nessa planilha, vamos na guia Inserir > Módulo, e uma caixa branca se abrirá.

Mudaremos a sua propriedade name para “modExcluirID” e colocaremos a seguinte sub dentro dele, que será um objeto de estudo da aula de hoje:

Option Explicit

Sub excluirID(IDaExcluir As Long)


Dim abaCompras As Object, abaVendas As Object, abaCaixa As Object

Dim ultLin As Long, i As Long


Set abaCaixa = Sheets("Caixa")

Set abaCompras = Sheets("Compras")

Set abaVendas = Sheets("Vendas")

 

'Excluindo o ID da aba Compras

ultLin = abaCompras.Range("A1000000").End(xlUp).Row

 

For i = 2 To ultLin

    If abaCompras.Cells(i, 1).Value = IDaExcluir Then

        abaCompras.Range(i & ":" & i).Delete shift:=xlUp

        i = i - 1

    End If

Next

 

'Excluindo o ID da aba Vendas

ultLin = abaVendas.Range("A1000000").End(xlUp).Row

 

For i = 2 To ultLin

    If abaVendas.Cells(i, 1).Value = IDaExcluir Then

        abaVendas.Range(i & ":" & i).Delete shift:=xlUp

        i = i - 1

    End If

Next

 

'Excluindo o ID da aba Caixa

ultLin = abaCaixa.Range("A1000000").End(xlUp).Row

 

For i = 2 To ultLin

    If abaCaixa.Cells(i, 1).Value = IDaExcluir Then

        abaCaixa.Range(i & ":" & i).Delete shift:=xlUp

        i = i - 1

    End If

Next

 

End Sub

Comentários a respeito da sub excluirID(IDaExcluir As Long):

  • utilizadas no código sejam declaradas, de forma obrigatória. Observe que isso é algo que é colocado fora da estrutura das nossas subs.
  • Vamos dimensionar uma variável chamada abaCompras como um objeto
  • Vamos dimensionar uma variável chamada abaCaixa como um objeto
  • Vamos dimensionar uma variável chamada abaEstoque como um objeto
  • Dimensionar uma variável chamada ultLin como um número do tipo Long, assim como outra variável chamada de “i”. Para mais detalhes dos tipos de variáveis no VBA visite essa página.
  • Vamos configurar a variável abaCompras para representar um objeto inteiro, que será nesse caso a aba do nosso arquivo em Excel “Compras”
  • Vamos configurar a variável abaCaixa para representar um objeto inteiro, que será nesse caso a aba do nosso arquivo em Excel “Caixa”
  • Vamos configurar a variável abaEstoque para representar um objeto inteiro, que será nesse caso a aba do nosso arquivo em Excel “Estoque”
  • Aba Compras:
    • Vamos em seguida armazenar na variável ultLin a informação da última linha preenchida da coluna A da abaCompras
    • Vamos utilizar de uma estrutura de repetição, que vai da linha 2 até a linha representada pela variável ultLin
    • Utilizaremos a comparação através de uma estrutura If para ver se o valor daquela linha (representada pela variável i) e 1ª coluna da aba Compras é equivalente ao IDaExcluir
      • Caso seja igual, vamos excluir aquela linha “i”, levando a linha debaixo para cima (Shift:=xlUp) e subtrairemos 1 unidade da variável i, para que não percamos nenhuma linha na análise (já que uma subiu, a variável tem que ser “voltar uma unidade”)
      • Caso seja diferente, seguiremos para a próxima linha
    • Aba Vendas:
      • Vamos em seguida armazenar na variável ultLin a informação da última linha preenchida da coluna A da abaVendas Vamos utilizar de uma estrutura de repetição, que vai da linha 2 até a linha representada pela variável ultLin
      • Utilizaremos a comparação através de uma estrutura If para ver se o valor daquela linha (representada pela variável i) e 1ª coluna da aba Vendas é equivalente ao IDaExcluir
        • Caso seja igual, vamos excluir aquela linha “i”, levando a linha debaixo para cima (Shift:=xlUp) e subtrairemos 1 unidade da variável i, para que não percamos nenhuma linha na análise (já que uma subiu, a variável tem que ser “voltar uma unidade”)
        • Caso seja diferente, seguiremos para a próxima linha
  • Aba Caixa:
    • Vamos em seguida armazenar na variável ultLin a informação da última linha preenchida da coluna A da abaCaixa Vamos utilizar de uma estrutura de repetição, que vai da linha 2 até a linha representada pela variável ultLin
    • Utilizaremos a comparação através de uma estrutura If para ver se o valor daquela linha (representada pela variável i) e 1ª coluna da aba Caixa é equivalente ao IDaExcluir
      • Caso seja igual, vamos excluir aquela linha “i”, levando a linha debaixo para cima (Shift:=xlUp) e subtrairemos 1 unidade da variável i, para que não percamos nenhuma linha na análise (já que uma subiu, a variável tem que ser “voltar uma unidade”)
      • Caso seja diferente, seguiremos para a próxima linha
  • Se encerra o código

O código acima vai ser utilizado por vários botões “Excluir” do nosso formulário. Por isso criamos apenas um código dentro de um módulo específico e separado.

Vamos “chamar” esse mesmo código universal por todos os botões “Excluir”. Independentemente da página e dos nomes das caixas de textos dela, ele irá interpretar as comparações e fará a limpeza das caixas necessárias.

OBS: Caso queira aprender mais sobre estrutura de repetição For, indicamos esse outro post aqui que te ensina com detalhes.

OBS2: Além disso, explicamos a estrutura If em outro post do nosso blog também de forma detalhada, caso queira conferir.

Acessando o código do formulário

Para fazer alterações no nosso formulário já criado, precisamos primeiramente abrir o ambiente de VBA, a partir do atalho do teclado Alt(+Fn)+F11. Assim poderemos continuar o nosso formulário de controle da empresa.

Mais uma vez lembrando que, para abrir o código do nosso formulário de interesse, devemos ir com o botão direito no formulário ControleDaEmpresa > exibir código.

Controle para Empresas Aula21
Controle para Empresas Aula21

Inserindo os códigos abaixo dentro dos códigos já existentes no formulário

Private Sub BtExcluirCaixa_Click()


If CxIDCaixa.Value = "" Then

    MsgBox "O ID a ser excluído não está preenchido. Dê um duplo clique na movimentação a ser excluída."

    Exit Sub

End If

 

excluirID (CxIDCaixa.Value)

 

Call limparCamposDoFormulario

Call atualizaCaixaDeListagemCaixa

 

End Sub

Explicação do código acima:

  • Vamos começar realizando uma comparação através de uma estrutura condicional If que vai ver se o valor da CxIDCaixa é vazio:
    • Caso seja, uma mensagem vai aparecer na tela (MsgBox) alertando que “O ID a ser excluído não está preenchido. Dê um duplo clique na movimentação a ser excluída” e o código será abortado através do comando Exit Sub (instrução de saída).
    • Caso não seja vazia (esteja preenechida), vamos simplesmente chamar a nossa sub criada no começo da aula de hoje, a “excluirID” passando para ela como argumento o ID que estiver na CxIDCaixa.
  • Em seguida vamos chamar as macros de limparCamposDoFormulario e atualizaCaixaDeListagemCaixa
  • Se encerra o código
Private Sub BtExcluirCompras_Click()


If CxIDCompras.Value = "" Then

    MsgBox "O ID a ser excluído não está preenchido. Dê um duplo clique na movimentação a ser excluída."

    Exit Sub

End If

 

excluirID (CxIDCompras.Value)

 

Call limparCamposDoFormulario

Call atualizaCaixaDeListagemCompras

Call atualizaCaixaDeListagemCaixa


End Sub
 

Explicação do código acima:

  • Vamos começar realizando uma comparação através de uma estrutura condicional If que vai ver se o valor da CxIDCompras é vazio:
    • Caso seja, uma mensagem vai aparecer na tela (MsgBox) alertando que “O ID a ser excluído não está preenchido. Dê um duplo clique na movimentação a ser excluída” e o código será abortado através do comando Exit Sub (instrução de saída).
    • Caso não seja vazia (esteja preenechida), vamos simplesmente chamar a nossa sub criada no começo da aula de hoje, a “excluirID” passando para ela como argumento o ID que estiver na CxIDCompras.
  • Em seguida vamos chamar as macros de limparCamposDoFormulario, atualizaCaixaDeListagemCompras e atualizaCaixaDeListagemCaixa
  • Se encerra o código
Private Sub BtExcluirVendas_Click()

 

If CxIDVendas.Value = "" Then

    MsgBox "O ID a ser excluído não está preenchido. Dê um duplo clique na movimentação a ser excluída."

    Exit Sub

End If

 

excluirID (CxIDVendas.Value)

 

Call limparCamposDoFormulario

Call atualizaCaixaDeListagemVendas

Call atualizaCaixaDeListagemCaixa

 

End Sub

Explicação do código acima:

  • Vamos começar realizando uma comparação através de uma estrutura condicional If que vai ver se o valor da CxIDVendas é vazio:
    • Caso seja, uma mensagem vai aparecer na tela (MsgBox) alertando que “O ID a ser excluído não está preenchido. Dê um duplo clique na movimentação a ser excluída” e o código será abortado através do comando Exit Sub (instrução de saída).
    • Caso não seja vazia (esteja preenechida), vamos simplesmente chamar a nossa sub criada no começo da aula de hoje, a “excluirID” passando para ela como argumento o ID que estiver na CxIDVendas.
  • Em seguida vamos chamar as macros de limparCamposDoFormulario, atualizaCaixaDeListagemVendas e atualizaCaixaDeListagemCaixa
  • Se encerra o código

OBS: Você tem a opção de “abrir”/criar cada Private Sub quando você clicar, em duplo clique, nos botões (objetos) diretamente no formulário.

Além desses ajustes citados acima, faremos outro tipo de modificação na aula de hoje, dentro do código do formulário também.

Dessa vez, vamos atuar com o evento de duplo clique na caixa de listagem das abas Caixa, Vendas e Compras para carregar as informações da linha selecionada para as caixas individuais de cada aba. Observe:

Private Sub CxListagemCaixa_DblClick(ByVal Cancel As MSForms.ReturnBoolean)


CxIDCaixa.Value = CxListagemCaixa.List(CxListagemCaixa.ListIndex, 0)

CxDataPCaixa.Value = Format(CxListagemCaixa.List(CxListagemCaixa.ListIndex, 1), "dd/mm/yyyy")

CxDataCCaixa.Value = Format(CxListagemCaixa.List(CxListagemCaixa.ListIndex, 2), "dd/mm/yyyy")

CxDescricaoCaixa.Value = CxListagemCaixa.List(CxListagemCaixa.ListIndex, 3)

CxTipoCaixa.Value = CxListagemCaixa.List(CxListagemCaixa.ListIndex, 4)

CxContaCaixa.Value = CxListagemCaixa.List(CxListagemCaixa.ListIndex, 5)

CxValorCaixa.Value = Format(CxListagemCaixa.List(CxListagemCaixa.ListIndex, 6), "#,##0.00")

CxStatusCaixa.Value = CxListagemCaixa.List(CxListagemCaixa.ListIndex, 7)

 

End Sub

 

Explicação do código acima:

  • A CxIDCaixa vai receber o valor que estiver na CxListagemCaixa, na linha selecionada, na 1ª coluna (índice 0)
  • A CxDataPCaixa vai receber o valor que estiver na CxListagemCaixa, na linha selecionada, na 2ª coluna (índice 1), formatado para data
  • A CxDataCCaixa vai receber o valor que estiver na CxListagemCaixa, na linha selecionada, na 3ª coluna (índice 2), formatado para data
  • A CxDescricaoCaixa vai receber o valor que estiver na CxListagemCaixa, na linha selecionada, na 4ª coluna (índice 3)
  • A CxTipoCaixa vai receber o valor que estiver na CxListagemCaixa, na linha selecionada, na 5ª coluna (índice 4)
  • A CxContaCaixa vai receber o valor que estiver na CxListagemCaixa, na linha selecionada, na 6ª coluna (índice 5)
  • A CxValorCaixa vai receber o valor que estiver na CxListagemCaixa, na linha selecionada, na 7ª coluna (índice 6), formatado para número com 2 casas decimais e separado por milhar
  • A CxStatusCaixa vai receber o valor que estiver na CxListagemCaixa, na linha selecionada, na 8ª coluna (índice 7)
Private Sub CxListagemCompras_DblClick(ByVal Cancel As MSForms.ReturnBoolean)


CxIDCompras.Value = CxListagemCompras.List(CxListagemCompras.ListIndex, 0)

CxDataPCompras.Value = Format(CxListagemCompras.List(CxListagemCompras.ListIndex, 1), "dd/mm/yyyy")

CxDataCCompras.Value = Format(CxListagemCompras.List(CxListagemCompras.ListIndex, 2), "dd/mm/yyyy")

CxFornecedorCompras.Value = CxListagemCompras.List(CxListagemCompras.ListIndex, 3)

CxProdutoCompras.Value = CxListagemCompras.List(CxListagemCompras.ListIndex, 4)

CxQuantidadeCompras.Value = CxListagemCompras.List(CxListagemCompras.ListIndex, 5)

CxCustoTotalCompras.Value = Format(CxListagemCompras.List(CxListagemCompras.ListIndex, 6), "#,##0.00")

 

End Sub

Explicação do código acima:

  • A CxIDCompras vai receber o valor que estiver na CxListagemCompras, na linha selecionada, na 1ª coluna (índice 0)
  • A CxDataPCompras vai receber o valor que estiver na CxListagemCompras, na linha selecionada, na 2ª coluna (índice 1), formatado para data
  • A CxDataCCompras vai receber o valor que estiver na CxListagemCompras, na linha selecionada, na 3ª coluna (índice 2), formatado para data
  • A CxFornecedorCompras vai receber o valor que estiver na CxListagemCompras, na linha selecionada, na 4ª coluna (índice 3)
  • A CxProdutoCompras vai receber o valor que estiver na CxListagemCompras, na linha selecionada, na 5ª coluna (índice 4)
  • A CxQuantidadeCompras vai receber o valor que estiver na CxListagemCompras, na linha selecionada, na 6ª coluna (índice 5)
  • A CxCustoTotalCompras vai receber o valor que estiver na CxListagemCompras, na linha selecionada, na 7ª coluna (índice 6), formatado para número com 2 casas decimais e separado por milhar
Private Sub CxListagemVendas_DblClick(ByVal Cancel As MSForms.ReturnBoolean)


CxIDVendas.Value = CxListagemVendas.List(CxListagemVendas.ListIndex, 0)

CxDataPVendas.Value = Format(CxListagemVendas.List(CxListagemVendas.ListIndex, 1), "dd/mm/yyyy")

CxDataCVendas.Value = Format(CxListagemVendas.List(CxListagemVendas.ListIndex, 2), "dd/mm/yyyy")

CxClienteVendas.Value = CxListagemVendas.List(CxListagemVendas.ListIndex, 3)

CxProdutoVendas.Value = CxListagemVendas.List(CxListagemVendas.ListIndex, 4)

CxQuantidadeVendas.Value = CxListagemVendas.List(CxListagemVendas.ListIndex, 5)

CxValorVendaVendas.Value = Format(CxListagemVendas.List(CxListagemVendas.ListIndex, 6), "#,##0.00")

CxCustoUVendas.Value = Format(CxListagemVendas.List(CxListagemVendas.ListIndex, 7), "#,##0.00")

CxCustoVVendas.Value = Format(CxListagemVendas.List(CxListagemVendas.ListIndex, 8), "#,##0.00")


End Sub

Explicação do código acima:

  • A CxIDVendas vai receber o valor que estiver na CxListagemVendas, na linha selecionada, na 1ª coluna (índice 0)
  • A CxDataPVendas vai receber o valor que estiver na CxListagemVendas, na linha selecionada, na 2ª coluna (índice 1), formatado para data
  • A CxDataCVendas vai receber o valor que estiver na CxListagemVendas, na linha selecionada, na 3ª coluna (índice 2), formatado para data
  • A CxClienteVendas vai receber o valor que estiver na CxListagemVendas, na linha selecionada, na 4ª coluna (índice 3)
  • A CxProdutoVendas vai receber o valor que estiver na CxListagemVendas, na linha selecionada, na 5ª coluna (índice 4)
  • A CxQuantidadeVendas vai receber o valor que estiver na CxListagemVendas, na linha selecionada, na 6ª coluna (índice 5)
  • A CxValorVendaVendas vai receber o valor que estiver na CxListagemVendas, na linha selecionada, na 7ª coluna (índice 6)
  • A CxCustoUVendas vai receber o valor que estiver na CxListagemVendas, na linha selecionada, na 8ª coluna (índice 7), formatado para número com 2 casas decimais e separado por milhar
  • A CxCustoVVendas vai receber o valor que estiver na CxListagemVendas, na linha selecionada, na 9ª coluna (índice 8), formatado para número com 2 casas decimais e separado por milhar

Nessa aula (Controle para Empresas Aula21) se destacaram os seguintes tópicos:

Voltar para o índice

Aula 22 – Controle para Empresas – Alterando as Movimentações nas Abas

Hoje em Controle para Empresas Aula22 vamos fazer as alterações das movimentações nas abas vendas, compras e caixa.

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo!

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Essa é a vigésima segunda aula (Controle para Empresas Aula22) da série, nessa aula vamos aprender como alterar dados com VBA dentro do formulário.

Nessa aula nós vamos criar a macro para alterar as movimentações na aba vendas e para isso vamos checar campos em branco no formulário.

Vamos limpar campos do formulário, atualizar caixa de listagem, usar a função IF no VBA, utilizar o MsgBox que é a caixa de mensagens para passar uma informação ao usuário.

Vamos utilizar o código para encontrar a última linha preenchida, a estrutura de repetição For no VBA e os eventos no VBA para que o usuário consiga fazer essa ação através do botão.

Como você deve saber boa parte dos códigos nós já temos prontos, então vamos apenas copiá-los e fazer os devidos ajustes para criar esse código de alteração de informações!

Acessando o código do formulário

Para fazer alterações no nosso formulário já criado, precisamos primeiramente abrir o ambiente de VBA, a partir do atalho do teclado Alt(+Fn)+F11. Assim poderemos continuar o nosso formulário de controle da empresa.

Mais uma vez lembrando que, para abrir o código do nosso formulário de interesse, devemos ir com o botão direito no formulário ControleDaEmpresa > exibir código.

Controle para Empresas Aula22
Controle para Empresas Aula22

Inserindo o código abaixo dentro dos códigos já existentes no formulário

 1) Compras

Private Sub BtAlterarCompras_Click()
Dim abaCompras As Object, abaCaixa As Object
Dim ultLin As Long, i As Long 

'Validando os campos do formulário
If checarCamposVazios Then Exit Sub

'Checar se o ID está preenchido
If CxIDCompras.Value = "" Then
   MsgBox "O ID a ser alterado não está preenchido. Dê um duplo clique na movimentação a ser alterada."
   Exit Sub

End If

Set abaCompras = Sheets("Compras")
Set abaCaixa = Sheets("Caixa")

'Alterar na aba Compras
ultLin = abaCompras.Range("A1000000").End(xlUp).Row

For i = 2 To ultLin

    If CLng(abaCompras.Cells(i, 1).Value) = CLng(CxIDCompras.Value) Then

        abaCompras.Cells(i, 2).Value = CDate(CxDataPCompras.Value)
       abaCompras.Cells(i, 3).Value = CDate(CxDataCCompras.Value)
       abaCompras.Cells(i, 4).Value = CxFornecedorCompras.Value
       abaCompras.Cells(i, 5).Value = CxProdutoCompras.Value
       abaCompras.Cells(i, 6).Value = CLng(CxQuantidadeCompras.Value)
       abaCompras.Cells(i, 7).Value = CDbl(CxCustoTotalCompras.Value)    

        abaCompras.Range("A:G").Columns.AutoFit
   End If

Next


'Alterando na aba Caixa
ultLin = abaCaixa.Range("A1000000").End(xlUp).Row

For i = 2 To ultLin

    If CLng(abaCaixa.Cells(i, 1).Value) = CLng(CxIDCompras.Value) Then

        abaCaixa.Cells(i, 2).Value = CDate(CxDataPCompras.Value)
       abaCaixa.Cells(i, 3).Value = CDate(CxDataCCompras.Value)
       abaCaixa.Cells(i, 4).Value = CxProdutoCompras.Value
       abaCaixa.Cells(i, 5).Value = "Compra"
       abaCaixa.Cells(i, 6).Value = CxContaCompras.Value
       abaCaixa.Cells(i, 7).Value = -CDbl(CxCustoTotalCompras.Value)
       abaCaixa.Cells(i, 8).Value = CxStatusCompras.Value     

        abaCaixa.Range("A:H").Columns.AutoFit

    End If

Next

'Limpar campos do formulário
Call limparCamposDoFormulario


'Atualizar Caixa de Listagem
Call atualizaCaixaDeListagemCompras
Call atualizaCaixaDeListagemCaixa


Set abaCompras = Nothing
Set abaCaixa = Nothing

End Sub

Explicação do código acima (BtAlterarCompras_Click):

  • Vamos dimensionar uma variável chamada abaCompras como um objeto
  • Vamos dimensionar uma variável chamada abaCaixa como um objeto
  • Dimensionar uma variável chamada ultLin como um número do tipo Long, assim como uma variável “i”. Para mais detalhes dos tipos de variáveis no VBA visite essa página.
  • Vamos usar de uma estrutura de comparação If que vai verificar se a function criada anteriormente (checarCamposVazios) retornar valor verdadeiro (alguma caixa estiver vazia), nada será feito em termos de adição de dados na planilha através do botão de adicionar, porque o código será abortado através do comando Exit Sub (instrução de saída).
  • Por outro lado, se a resposta da function for falsa (ou seja, nenhuma caixa vazia), o botão de adicionar poderá funcionar normalmente
  • Vamos configurar a variável abaCompras para representar um objeto inteiro, que será nesse caso a aba do nosso arquivo em Excel “Compras”
  • Vamos configurar a variável abaCaixa para representar um objeto inteiro, que será nesse caso a aba do nosso arquivo em Excel “Caixa”
  • Vamos armazenar na variável ultLin a informação da última linha preenchida da coluna A da abaCompras
  • Vamos utilizar de uma estrutura de repetição do tipo For, que vai realizar ações da linha 2 até a linha dada pela variável ultLin
  • Dentro da estrutura de repetição, faremos linha a linha uma verificação, através de uma estrutura If entre o número do ID da linha “i” em questão, na coluna 1 (dado pela função de conversão CLng) e o número dado pela CxIDCompras:
    • Se for diferente, nada será feito, e a estrutura de repetição irá para a próxima linha “i”
    • Se for o ID em questão, seguiremos com a alteração na planilha/sistema daquela compra
  • Alteração na aba Compras
    • O valor da célula da linha dada pela variável i, e da coluna 1 (coluna A) da aba compras vai receber o que estiver presenta na CxIDCompras, convertido para número
    • O valor da célula da linha dada pela variável i, e da coluna 2 (coluna B) da aba compras vai receber o que estiver presenta na CxDataPCompras, convertido para data
    • O valor da célula da linha dada pela variável i, e da coluna 3 (coluna C) da aba compras vai receber o que estiver presenta na CxIDataCCompras, convertido para data
    • O valor da célula da linha dada pela variável i, e da coluna 4 (coluna D) da aba compras vai receber o que estiver presenta na CxFornecedorCompras
    • O valor da célula da linha dada pela variável i, e da coluna 5 (coluna E) da aba compras vai receber o que estiver presenta na CxProdutoCompras
    • O valor da célula da linha dada pela variável i, e da coluna 6 (coluna F) da aba compras vai receber o que estiver presenta na CxQuantidadeCompras, convertido para número
    • O valor da célula da linha dada pela variável i, e da coluna 7 (coluna G) da aba compras vai receber o que estiver presenta na CxCustoTotalCompras, convertido para número
    • Para finalizar o processo na aba Compras vamos fazer o autoajuste das colunas para as informações inseridas, da coluna A até a coluna G
  • Vamos armazenar na variável ultLin (reaproveitar o nome) a informação da última linha preenchida da coluna A da abaCaixa
  • Vamos utilizar de uma estrutura de repetição do tipo For, que vai realizar ações da linha 2 até a linha dada pela variável ultLin
  • Dentro da estrutura de repetição, faremos linha a linha uma verificação, através de uma estrutura If entre o número do ID da linha “i” em questão, na coluna 1 (dado pela função de conversão CLng) e o número dado pela CxIDCompras:
    • Se for diferente, nada será feito, e a estrutura de repetição irá para a próxima linha “i”
    • Se for o ID em questão, seguiremos com a alteração na planilha/sistema daquela compra
  • Alteração na aba Caixa
    • O valor da célula da linha dada pela variável i, e da coluna 1 (coluna A) da aba Caixa vai receber o que estiver presenta na CxIDCompras, convertido para número
    • O valor da célula da linha dada pela variável i, e da coluna 2 (coluna B) da aba Caixa vai receber o que estiver presenta na CxDataPCompras, convertido para data
    • O valor da célula da linha dada pela variável i, e da coluna 3 (coluna C) da aba Caixa vai receber o que estiver presenta na CxIDataCCompras, convertido para data
    • O valor da célula da linha dada pela variável i, e da coluna 4 (coluna D) da aba Caixa vai receber o que estiver presenta na CxProdutoCompras
    • O valor da célula da linha dada pela variável i, e da coluna 5 (coluna E) da aba Caixa vai receber o texto “Compra”
    • O valor da célula da linha dada pela variável i, e da coluna 6 (coluna F) da aba compras vai receber o que estiver presenta na CxContaCompras, convertido para número
    • O valor da célula da linha dada pela variável i, e da coluna 7 (coluna G) da aba Caixa vai receber o que estiver presenta na CxCustoTotalCompras, convertido para número e multiplicada por menos 1 (sinal de menos na frente)
    • O valor da célula da linha dada pela variável i, e da coluna 8 (coluna H) da aba Caixa vai receber o que estiver presenta na CxStatusCompras, convertido para número
    • Para finalizar o processo na aba Caixa vamos fazer o autoajuste das colunas para as informações inseridas, da coluna A até a coluna H
  • Com todos os cadastros feitos nas abas Compras e Caixa, vamos prosseguir chamando as macros limparCamposDoFormulario e atualizaCaixaDeListagemCompras, que vão respectivamente limpar os campos do formulário da aba Compras e atualizar a caixa de listagem da aba compras com os novos dados adicionados
  • Vamos apagar o conteúdo (Nothing) das variáveis abaCompras e abaCaixa, que antes armazenavam objetos
  • Se encerra o código

2) Vendas

Private Sub BtAlterarVendas_Click()
Dim abaVendas As Object, abaCaixa As Object
Dim ultLin As Long, i As Long


'Validando os campos do formulário
If checarCamposVazios Then Exit Sub


'Checar se o ID está preenchido
If CxIDVendas.Value = "" Then
   MsgBox "O ID a ser alterado não está preenchido. Dê um duplo clique na movimentação a ser alterada."
   Exit Sub
End If

Set abaVendas = Sheets("Vendas")
Set abaCaixa = Sheets("Caixa")

'Alterar na aba Vendas
ultLin = abaVendas.Range("A1000000").End(xlUp).Row


For i = 2 To ultLin

    If CLng(abaVendas.Cells(i, 1).Value) = CLng(CxIDVendas.Value) Then

        abaVendas.Cells(i, 2).Value = CDate(CxDataPVendas.Value)
       abaVendas.Cells(i, 3).Value = CDate(CxDataCVendas.Value)
       abaVendas.Cells(i, 4).Value = CxClienteVendas.Value
       abaVendas.Cells(i, 5).Value = CxProdutoVendas.Value
       abaVendas.Cells(i, 6).Value = CLng(CxQuantidadeVendas.Value)
       abaVendas.Cells(i, 7).Value = CDbl(CxValorVendaVendas.Value)
       abaVendas.Cells(i, 8).Value = CDbl(CxCustoUVendas.Value)
       abaVendas.Cells(i, 9).Value = CDbl(CxCustoVVendas.Value)

      abaVendas.Range("A:I").Columns.AutoFit

    End If

Next

'Alterando na aba Caixa
ultLin = abaCaixa.Range("A1000000").End(xlUp).Row


For i = 2 To ultLin

    If CLng(abaCaixa.Cells(i, 1).Value) = CLng(CxIDVendas.Value) Then

        abaCaixa.Cells(i, 2).Value = CDate(CxDataPVendas.Value)
       abaCaixa.Cells(i, 3).Value = CDate(CxDataCVendas.Value)
       abaCaixa.Cells(i, 4).Value = CxProdutoVendas.Value
       abaCaixa.Cells(i, 5).Value = "Venda"
       abaCaixa.Cells(i, 6).Value = CxContaVendas.Value
       abaCaixa.Cells(i, 7).Value = CDbl(CxValorVendaVendas.Value)
       abaCaixa.Cells(i, 8).Value = CxStatusVendas.Value

        abaCaixa.Range("A:H").Columns.AutoFit

    End If

Next

'Limpar campos do formulário
Call limparCamposDoFormulario

'Atualizar Caixa de Listagem
Call atualizaCaixaDeListagemVendas
Call atualizaCaixaDeListagemCaixa
 
Set abaVendas = Nothing
Set abaCaixa = Nothing

End Sub

Explicação do código acima (BtAlterarVendas_Click):

  • Vamos dimensionar uma variável chamada abaVendas como um objeto
  • Vamos dimensionar uma variável chamada abaCaixa como um objeto
  • Dimensionar uma variável chamada ultLin como um número do tipo Long, assim como uma variável “i”. Para mais detalhes dos tipos de variáveis no VBA visite essa página.
  • Vamos usar de uma estrutura de comparação If que vai verificar se a function criada anteriormente (checarCamposVazios) retornar valor verdadeiro (alguma caixa estiver vazia), nada será feito em termos de adição de dados na planilha através do botão de adicionar, porque o código será abortado através do comando Exit Sub (instrução de saída).
  • Por outro lado, se a resposta da function for falsa (ou seja, nenhuma caixa vazia), o botão de adicionar poderá funcionar normalmente
  • Para validar o ID da movimentação vamos ver se a CxIDVendas está preenchida (é diferente de vazio). Caso esteja preenchida, vamos invocar nossa função checarIDDuplicado para analisar a CxIDVendas para verificar aquele ID específico. Caso ela retorne com o resultado de que o ID existe, vamos abortar a nossa sub. Caso ela retorne com resultado de que não existe, vamos prosseguir com o código para adicionar esse ID/movimentação na planilha e no formulário
  • Vamos configurar a variável abaVendas para representar um objeto inteiro, que será nesse caso a aba do nosso arquivo em Excel “Vendas”
  • Vamos configurar a variável abaCaixa para representar um objeto inteiro, que será nesse caso a aba do nosso arquivo em Excel “Caixa”
  • Vamos armazenar na variável ultLin a informação da última linha preenchida da coluna A da abaVendas
  • Vamos utilizar de uma estrutura de repetição do tipo For, que vai realizar ações da linha 2 até a linha dada pela variável ultLin
  • Dentro da estrutura de repetição, faremos linha a linha uma verificação, através de uma estrutura If entre o número do ID da linha “i” em questão, na coluna 1 (dado pela função de conversão CLng) e o número dado pela CxIDVendas:
    • Se for diferente, nada será feito, e a estrutura de repetição irá para a próxima linha “i”
    • Se for o ID em questão, seguiremos com a alteração na planilha/sistema daquela venda
  • Alteração na aba Vendas
    • Vamos armazenar na variável IDMovimentacao o valor resultado da soma entre o maior valor da coluna A da abaCaixa com 1 unidade, representando sempre um ID único a ser adicionado (número 1 unidade maior do que o ID anterior)
    • O valor da célula da linha dada pela variável i, e da coluna 1 (coluna A) da aba Vendas vai receber o que estiver na variável IDMovimentacao
    • O valor da célula da linha dada pela variável i, e da coluna 2 (coluna B) da aba Vendas vai receber o que estiver presenta na CxDataPVendas, convertido para data
    • O valor da célula da linha dada pela variável i, e da coluna 3 (coluna C) da aba Vendas vai receber o que estiver presenta na CxDataCVendas, convertido para data
    • O valor da célula da linha dada pela variável i, e da coluna 4 (coluna D) da aba Vendas vai receber o que estiver presenta na CxClienteVendas
    • O valor da célula da linha dada pela variável i, e da coluna 5 (coluna E) da aba Vendas vai receber o que estiver presenta na CxProdutoVendas
    • O valor da célula da linha dada pela variável i, e da coluna 6 (coluna F) da aba Vendas vai receber o que estiver presenta na CxQuantidadeVendas, convertido para número
    • O valor da célula da linha dada pela variável i, e da coluna 7 (coluna G) da aba Vendas vai receber o que estiver presenta na CxValorVendaVendas, convertido para número O valor da célula da linha dada pela variável i, e da coluna 8 (coluna H) da aba Vendas vai receber o que estiver presenta na CxCustoUVendas, convertido para número
    • O valor da célula da linha dada pela variável i, e da coluna 9 (coluna I) da aba Vendas vai receber o que estiver presenta na CxCustoVVendas, convertido para número
    • Para finalizar o processo na aba Vendas vamos fazer o autoajuste das colunas para as informações inseridas, da coluna A até a coluna I
  • Vamos armazenar na variável ultLin (reaproveitar o nome anterior) a informação da última linha preenchida da coluna A da abaCaixa (dessa vez)
  • Vamos utilizar de uma estrutura de repetição do tipo For, que vai realizar ações da linha 2 até a linha dada pela variável ultLin
  • Dentro da estrutura de repetição, faremos linha a linha uma verificação, através de uma estrutura If entre o número do ID da linha “i” em questão, na coluna 1 (dado pela função de conversão CLng) e o número dado pela CxIDVendas:
    • Se for diferente, nada será feito, e a estrutura de repetição irá para a próxima linha “i”
    • Se for o ID em questão, seguiremos com a alteração na planilha/sistema daquela venda
  • Alteração na aba Caixa
    • O valor da célula da linha dada pela variável i, e da coluna 1 (coluna A) da aba Caixa vai receber o que estiver presenta na IDMovimentacao, convertido para número
    • O valor da célula da linha dada pela variável i, e da coluna 2 (coluna B) da aba Caixa vai receber o que estiver presenta na CxDataPVendas, convertido para data
    • O valor da célula da linha dada pela variável i, e da coluna 3 (coluna C) da aba Caixa vai receber o que estiver presenta na CxDataCVendas, convertido para data
    • O valor da célula da linha dada pela variável i, e da coluna 4 (coluna D) da aba Caixa vai receber o que estiver presenta na CxProdutoVendas
    • O valor da célula da linha dada pela variável i, e da coluna 5 (coluna E) da aba Caixa vai receber o texto “Venda”
    • O valor da célula da linha dada pela variável i, e da coluna 6 (coluna F) da aba compras vai receber o que estiver presenta na CxContaVendas, convertido para número
    • O valor da célula da linha dada pela variável i, e da coluna 7 (coluna G) da aba Caixa vai receber o que estiver presenta na CxValorVendaVendas, convertido para número e multiplicada por menos 1 (sinal de menos na frente)
    • O valor da célula da linha dada pela variável i, e da coluna 8 (coluna H) da aba Caixa vai receber o que estiver presenta na CxStatusVendas, convertido para número
    • Para finalizar o processo na aba Caixa vamos fazer o autoajuste das colunas para as informações inseridas, da coluna A até a coluna H
  • Com todos os cadastros feitos nas abas Vendas e Caixa, vamos prosseguir chamando as macros limparCamposDoFormulario, atualizaCaixaDeListagemVendas e atualizaCaixaDeListagemCaixa, que vão respectivamente limpar os campos do formulário da aba Vendas, atualizar a caixa de listagem da aba Vendas, e atualizar a caixa de listagem da aba Caixa com os novos dados adicionados
  • Vamos apagar o conteúdo (Nothing) das variáveis abaCompras e abaCaixa, que antes armazenavam objetos
  • Se encerra o código


3) Caixa

Private Sub BtAlterarCaixa_Click()
Dim abaVendas As Object, abaCaixa As Object, abaCompras As Object
Dim ultLin As Long, i As Long

'Validando os campos do formulário
If checarCamposVazios Then Exit Sub

'Checar se o ID está preenchido
If CxIDCaixa.Value = "" Then
   MsgBox "O ID a ser alterado não está preenchido. Dê um duplo clique na movimentação a ser alterada."
   Exit Sub
End If

Set abaVendas = Sheets("Vendas")
Set abaCompras = Sheets("Compras")
Set abaCaixa = Sheets("Caixa")

'Alterar na aba Compras
ultLin = abaCompras.Range("A1000000").End(xlUp).Row


For i = 2 To ultLin
   If CLng(abaCompras.Cells(i, 1).Value) = CLng(CxIDCaixa.Value) Then

        abaCompras.Cells(i, 2).Value = CDate(CxDataPCaixa.Value)
       abaCompras.Cells(i, 3).Value = CDate(CxDataCCaixa.Value)
       abaCompras.Cells(i, 5).Value = CxDescricaoCaixa.Value
       abaCompras.Cells(i, 7).Value = -CDbl(CxValorCaixa.Value)

        abaCompras.Range("A:G").Columns.AutoFit

    End If

Next

 

'Aterar na aba Vendas
ultLin = abaVendas.Range("A1000000").End(xlUp).Row

For i = 2 To ultLin

    If CLng(abaVendas.Cells(i, 1).Value) = CLng(CxIDCaixa.Value) Then

        abaVendas.Cells(i, 2).Value = CDate(CxDataPCaixa.Value)
       abaVendas.Cells(i, 3).Value = CDate(CxDataCCaixa.Value)
       abaVendas.Cells(i, 5).Value = CxDescricaoCaixa.Value
       abaVendas.Cells(i, 7).Value = CDbl(CxValorCaixa.Value)

       abaVendas.Range("A:I").Columns.AutoFit

    End If

Next


'Alterando na aba Caixa
ultLin = abaCaixa.Range("A1000000").End(xlUp).Row

For i = 2 To ultLin

    If CLng(abaCaixa.Cells(i, 1).Value) = CLng(CxIDCaixa.Value) Then

        abaCaixa.Cells(i, 2).Value = CDate(CxDataPCaixa.Value)
       abaCaixa.Cells(i, 3).Value = CDate(CxDataCCaixa.Value)
       abaCaixa.Cells(i, 4).Value = CxDescricaoCaixa.Value
       abaCaixa.Cells(i, 5).Value = CxTipoCaixa.Value
       abaCaixa.Cells(i, 6).Value = CxContaCaixa.Value
       abaCaixa.Cells(i, 7).Value = CDbl(CxValorCaixa.Value)
       abaCaixa.Cells(i, 8).Value = CxStatusCaixa.Value

        abaCaixa.Range("A:H").Columns.AutoFit

    End If

Next

'Limpar campos do formulário
Call limparCamposDoFormulario
 

'Atualizar Caixa de Listagem
Call atualizaCaixaDeListagemVendas
Call atualizaCaixaDeListagemCompras
Call atualizaCaixaDeListagemCaixa

Set abaVendas = Nothing
Set abaCompras = Nothing
Set abaCaixa = Nothing

End Sub

Explicação do código acima (BtAlterarCaixa_Click):

  • Vamos dimensionar uma variável chamada abaVendas como um objeto
  • Vamos dimensionar uma variável chamada abaCaixa como um objeto
  • Vamos dimensionar uma variável chamada abaCompras como um objeto
  • Dimensionar uma variável chamada ultLin como um número do tipo Long. Também dimensionar IDMovimentacao como número do tipo Long, assim como uma variável “i”. Para mais detalhes dos tipos de variáveis no VBA visite essa página.
  • Vamos usar de uma estrutura de comparação If que vai verificar se a function criada “checarCamposVazios” vai retornar valor verdadeiro (alguma caixa estiver vazia):
    • Nada será feito em termos de adição de dados na planilha através do botão de adicionar, porque o código será abortado através do comando Exit Sub (instrução de saída).
    • Por outro lado, se a resposta da function for falsa (ou seja, nenhuma caixa vazia), o botão de adicionar poderá funcionar normalmente
  • Para validar o ID da movimentação vamos ver se a CxIDCaixa está preenchida (é diferente de vazio).
    • Caso esteja vazia, uma mensagem será exibida na tela alertando para esse fato e o código vai ser abortado através do comando Exit Sub (instrução de saída).
    • Caso ela esteja preenchida, vamos prosseguir com o código para adicionar esse ID/movimentação na planilha e no formulário
  • Vamos configurar a variável abaVendas para representar um objeto inteiro, que será nesse caso a aba do nosso arquivo em Excel “Vendas”
  • Vamos configurar a variável abaCompras para representar um objeto inteiro, que será nesse caso a aba do nosso arquivo em Excel “Compras”
  • Vamos configurar a variável abaCaixa para representar um objeto inteiro, que será nesse caso a aba do nosso arquivo em Excel “Caixa”
  • Vamos armazenar na variável ultLin a informação da última linha preenchida da coluna A da abaCompras
  • Vamos utilizar de uma estrutura de repetição do tipo For, que vai realizar ações da linha 2 até a linha dada pela variável ultLin
  • Dentro da estrutura de repetição, faremos linha a linha uma verificação, através de uma estrutura If entre o número do ID da linha “i” em questão, na coluna 1 (dado pela função de conversão CLng) e o número dado pela CxIDCaixa:
    • Se for diferente, nada será feito, e a estrutura de repetição irá para a próxima linha “i”
    • Se for o ID em questão, seguiremos com a alteração na planilha/sistema daquela movimentação
  • Alteração na aba Compras
    • O valor da célula da linha dada pela variável i, e da coluna 2 (coluna B) da aba Caixa vai receber o que estiver presenta na CxDataPCaixa, convertido para data
    • O valor da célula da linha dada pela variável i, e da coluna 3 (coluna C) da aba Caixa vai receber o que estiver presenta na CxDataCCaixa, convertido para data
    • O valor da célula da linha dada pela variável i, e da coluna 5 (coluna E) da aba Caixa vai receber o que estiver presenta na CxDescricaoCaixa
    • O valor da célula da linha dada pela variável i, e da coluna 7 (coluna G) da aba Caixa vai receber o que estiver presenta na CxValorCaixa, convertido para número e com sinal de negativo (porque foi uma compra)
    • vamos fazer também o autoajuste do tamanho das colunas A até G da linha dada por i da abaCompras
  • Vamos armazenar novamente na variável ultLin a informação da última linha preenchida da coluna A, mas agora da abaVendas
  • Vamos utilizar de uma estrutura de repetição do tipo For, que vai realizar ações da linha 2 até a linha dada pela variável ultLin
  • Dentro da estrutura de repetição, faremos linha a linha uma verificação, através de uma estrutura If entre o número do ID da linha “i” em questão, na coluna 1 (dado pela função de conversão CLng) e o número dado pela CxIDCaixa:
    • Se for diferente, nada será feito, e a estrutura de repetição irá para a próxima linha “i”
    • Se for o ID em questão, seguiremos com a alteração na planilha/sistema daquela movimentação
  • Alteração na aba Vendas
    • O valor da célula da linha dada pela variável i, e da coluna 2 (coluna B) da aba Caixa vai receber o que estiver presenta na CxDataPCaixa, convertido para data
    • O valor da célula da linha dada pela variável i, e da coluna 3 (coluna C) da aba Caixa vai receber o que estiver presenta na CxDataCCaixa, convertido para data
    • O valor da célula da linha dada pela variável i, e da coluna 5 (coluna E) da aba Caixa vai receber o que estiver presenta na CxDescricaoCaixa
    • O valor da célula da linha dada pela variável i, e da coluna 7 (coluna G) da aba Caixa vai receber o que estiver presenta na CxValorCaixa, convertido para número (sinal positivo porque foi uma venda entrou algo no caixa)
    • vamos fazer também o autoajuste do tamanho das colunas A até H da linha dada por i da abaVendas
  • Vamos armazenar novamente na variável ultLin a informação da última linha preenchida da coluna A, mas agora da abaCaixa
  • Vamos utilizar de uma estrutura de repetição do tipo For, que vai realizar ações da linha 2 até a linha dada pela variável ultLin
  • Dentro da estrutura de repetição, faremos linha a linha uma verificação, através de uma estrutura If entre o número do ID da linha “i” em questão, na coluna 1 (dado pela função de conversão CLng) e o número dado pela CxIDCaixa:
    • Se for diferente, nada será feito, e a estrutura de repetição irá para a próxima linha “i”
    • Se for o ID em questão, seguiremos com a alteração na planilha/sistema daquela movimentação
  • Alteração na aba Caixa
    • O valor da célula da linha dada pela variável i, e da coluna 2 (coluna B) da aba Caixa vai receber o que estiver presenta na CxDataPCaixa, convertido para data
    • O valor da célula da linha dada pela variável i, e da coluna 3 (coluna C) da aba Caixa vai receber o que estiver presenta na CxDataCCaixa, convertido para data
    • O valor da célula da linha dada pela variável i, e da coluna 4 (coluna D) da aba Caixa vai receber o que estiver presenta na CxDescricaoCaixa
    • O valor da célula da linha dada pela variável i, e da coluna 5 (coluna E) da aba Caixa vai receber o que estiver presenta na CxTipooCaixa
    • O valor da célula da linha dada pela variável i, e da coluna 6 (coluna F) da aba Caixa vai receber o que estiver presenta na CxContaCaixa
    • O valor da célula da linha dada pela variável i, e da coluna 7 (coluna G) da aba Caixa vai receber o que estiver presenta na CxValorCaixa, convertido para número (sinal positivo porque foi uma venda entrou algo no caixa)
    • O valor da célula da linha dada pela variável i, e da coluna 8 (coluna H) da aba Caixa vai receber o que estiver presenta na CxStatusCaixa
    • Vamos fazer também o autoajuste do tamanho das colunas A até H da linha dada por i da abaVendas
  • Com todos os cadastros feitos nas abas Vendas e Caixa, vamos prosseguir chamando as macros limparCamposDoFormulario, atualizaCaixaDeListagemVendas, atualizaCaixaDeListagemCompras e atualizaCaixaDeListagemCaixa, que vão respectivamente limpar os campos do formulário da aba Vendas e atualizar as caixas de listagem das abas Vendas, Compras e Caixa com os novos dados adicionados
  • Vamos apagar o conteúdo (Nothing) da variável abaVendas, abaCompras e abaCaixa, que antes armazenava um objeto
  • Se encerra o código

OBS: Você tem a opção de “abrir”/criar cada Private Sub quando você clicar, em duplo clique, nos botões (objetos) diretamente no formulário.

Nesse caso, poderíamos optar por dar duplo clique no botão “Alterar” delas abas/páginas Compras, Vendas e Caixa, respectivamente, para abrir o código.

OBS: Explicamos a estrutura If em outro post do nosso blog também de forma detalhada, caso queira conferir.

OBS2: Para conferir mais detalhes sobre usar as funções do Excel no VBA (WorksheetFunction) você pode dar uma olhada nesse outro post em que abordamos justamente isso.

OBS3: Para conferir detalhes sobre as funções de conversão de tipo, dê uma olhada nesse link aqui.

Nessa aula (Controle para Empresas Aula22) você resumidamente lidou com:

Voltar para o índice

Aula 23 – Parte 1 – Controle para Empresas – Atualizando a Aba de DRE

Hoje em Controle para Empresas Aula23 vamos começar a atualização da aba de DRE para automatizar essa parte do nosso formulário.

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo!

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Essa é a vigésima terceira aula (Controle para Empresas Aula23) da série, nessa aula vamos dar início a construção da macro para cálculo de DRE.

Vamos fazer esses cálculos no VBA ao invés de fazer no Excel, então vamos construir essa macro do zero para esses cálculos.

Vamos utilizar a estrutura condicional (função IF) que você já sabe como funciona, vamos utilizar o MsgBox (caixa de mensagens), pois vamos precisar informar o usuário.

Uma estrutura importante é o CLng para transformar valor para long (principalmente na parte de datas), pois o VBA acaba tendo dificuldades na comparação de datas com números.

O worksheetfunction você já deve conhecer, que é para usar funções do Excel no VBA, então vamos utilizar o SumIfs (que seria o SOMASES no VBA) para poder somar os valores corresponde ao ano desejado.

E claro, tudo isso vai estar dentro de um botão, então vamos precisar utilizar os eventos no VBA para que ao clicar essa macro seja executada!

Acessando o código do formulário

Para fazer alterações no nosso formulário já criado, precisamos primeiramente abrir o ambiente de VBA, a partir do atalho do teclado Alt(+Fn)+F11. Assim poderemos continuar o nosso formulário de controle da empresa.

Mais uma vez lembrando que, para abrir o código do nosso formulário de interesse, devemos ir com o botão direito no formulário ControleDaEmpresa > exibir código.

Formulário VBA
Formulário VBA

Inserindo o código abaixo dentro dos códigos já existentes no formulário

Private Sub btCarregarDRE_Click()

Dim recBruta As Double, dedRec As Double, recLiq As Double, cmv As Double
Dim resBruto As Double, despOp As Double, resAntIR As Double
Dim impRenda As Double, resLiq As Double
Dim anoAnalise As Long
Dim abaVendas As Object, abaCaixa As Object, abaDRE As Object

If cxAnoDRE.Value = "" Then
   MsgBox "A caixa de ano está vazia. Favor preencher a caixa com o ano desejado."
   Exit Sub
End If


Set abaVendas = Sheets("Vendas")
Set abaCaixa = Sheets("Caixa")
Set abaDRE = Sheets("DRE")

anoAnalise = CLng(cxAnoDRE.Value)

recBruta = WorksheetFunction.SumIfs(abaVendas.Range("G:G"), abaVendas.Range("C:C"), ">=" & CLng(DateSerial(anoAnalise, 1, 1)), abaVendas.Range("C:C"), "<=" & CLng(DateSerial(anoAnalise, 12, 31)))
dedRec = 0
recLiq = recBruta - dedRec

cmv = WorksheetFunction.SumIfs(abaVendas.Range("I:I"), abaVendas.Range("C:C"), ">=" & CLng(DateSerial(anoAnalise, 1, 1)), abaVendas.Range("C:C"), "<=" & CLng(DateSerial(anoAnalise, 12, 31)))
resBruto = recLiq - cmv

despOp = -WorksheetFunction.SumIfs(abaCaixa.Range("G:G"), abaCaixa.Range("C:C"), ">=" & CLng(DateSerial(anoAnalise, 1, 1)), abaCaixa.Range("C:C"), "<=" & CLng(DateSerial(anoAnalise, 12, 31)), abaCaixa.Range("E:E"), "Despesa")
resAntIR = resBruto - despOp

impRenda = recBruta * 0.06
resLiq = resAntIR - impRenda

abaDRE.Cells(1, 2).Value = anoAnalise
abaDRE.Cells(2, 2).Value = recBruta
abaDRE.Cells(3, 2).Value = dedRec
abaDRE.Cells(4, 2).Value = recLiq
abaDRE.Cells(5, 2).Value = cmv
abaDRE.Cells(6, 2).Value = resBruto
abaDRE.Cells(7, 2).Value = despOp
abaDRE.Cells(8, 2).Value = resAntIR
abaDRE.Cells(9, 2).Value = impRenda
abaDRE.Cells(10, 2).Value = resLiq

abaDRE.Cells(4, 3).Value = recLiq / recBruta
abaDRE.Cells(6, 3).Value = resBruto / recBruta
abaDRE.Cells(8, 3).Value = resAntIR / recBruta
abaDRE.Cells(10, 3).Value = resLiq / recBruta

abaDRE.Range("A:C").Columns.AutoFit

Set abaVendas = Nothing

Set abaCaixa = Nothing
Set abaDRE = Nothing


End Sub

Explicação do código acima:

  • Vamos dimensionar as seguintes variáveis como números do tipo Double:
    • recBruta, dedRec, recLiq, cmv
    • resBruto, despOp, resAntIR
    • impRenda, resLiq
  • Vamos dimensionar anoAnalise como número do tipo Long
  • Vamos dimensionar abaVendas, abaCaixa e abaDRE como objetos
  • Para validar o ano de análise do DRE a ser “feito” vamos ver se a CxAnoDRE está preenchida (é diferente de vazio).
    • Caso esteja vazia, uma mensagem será exibida na tela alertando para esse fato e o código vai ser abortado através do comando Exit Sub (instrução de saída).
    • Caso ela esteja preenchida, vamos prosseguir com o código para disparar o código que dará o DRE na página específica no formulário
  • Vamos configurar a variável abaVendas para representar um objeto inteiro, que será nesse caso a aba do nosso arquivo em Excel “Vendas”
  • Vamos configurar a variável abaCaixa para representar um objeto inteiro, que será nesse caso a aba do nosso arquivo em Excel “Caixa”
  • Vamos configurar a variável abaDRE para representar um objeto inteiro, que será nesse caso a aba do nosso arquivo em Excel “DRE”
  • Vamos armazenar na variável “anoAnalise” o número do ano (dado pela função de conversão CLng) do valor que estiver escrito na CxAnoDRE
  • Armazenar na variável “recBruta” o resultado da função SOMASES no VBA, que vai somar os valores da coluna G da aba Vendas, considerando o que na coluna C da aba Vendas for equivalente a uma data maior ou igual ao 1º dia do 1º mês do anoAnalise, e menor ou igual ao 31º dia do 12º mês do anoAnalise
  • Armazenar na variável “dedRec” valor zero (0)
  • Armazenar na variável “recLiq” o resultado da subtração entre “recBruta” e “dedRec”
  • Armazenar na variável “cmv” o resultado da função SOMASES no VBA, que vai somar os valores da coluna I da aba Vendas, considerando o que na coluna C da aba Vendas for equivalente a uma data maior ou igual ao 1º dia do 1º mês do anoAnalise, e menor ou igual ao 31º dia do 12º mês do anoAnalise
  • Armazenar na variável “resBruto” o resultado da subtração entre “recLiq” e “cmv”
  • Armazenar na variável “despOp” o resultado da função SOMASES no VBA, que vai somar os valores da coluna G da aba Caixa, considerando o que na coluna C da aba Caixa for equivalente a uma data maior ou igual ao 1º dia do 1º mês do anoAnalise, e menor ou igual ao 31º dia do 12º mês do anoAnalise. Multiplicaremos esse resultado por -1 para representar uma despesa (sinal negativo)
  • Armazenar na variável “resAntIR” o resultado da subtração entre “resBruto” e “despOP”
  • Armazenar na variável “impRenda” valor resultante da multiplicação entre a variável “recBruta” e 6% (0,06)
  • Armazenar na variável “resAntIR” o resultado da subtração entre “resAntIR” e “impRenda”
  • Agora vamos passar os valores das variáveis para as células da 2ª coluna (coluna B) da aba DRE:
    • Na 1ª linha vamos colocar o que tiver na variável anoAnalise
    • Na 2ª linha vamos colocar o que tiver na variável recBruta
    • Na 3ª linha vamos colocar o que tiver na variável dedRec
    • Na 4ª linha vamos colocar o que tiver na variável recLiq
    • Na 5ª linha vamos colocar o que tiver na variável cmv
    • Na 6ª linha vamos colocar o que tiver na variável resBruto
    • Na 7ª linha vamos colocar o que tiver na variável despOp
    • Na 8ª linha vamos colocar o que tiver na variável resAntIR
    • Na 9ª linha vamos colocar o que tiver na variável impRenda
    • Na 10ª linha vamos colocar o que tiver na variável resLiq
  • Agora vamos passar os valores dos percentuais para as células da 3ª coluna (coluna C) da aba DRE:
    • Na 4ª linha vamos colocar o resultado da razão entre recLiq e recBruta
    • Na 6ª linha vamos colocar o resultado da razão entre resBruto e recBruta
    • Na 8ª linha vamos colocar o resultado da razão entre resAntIR e recBruta
    • Na 10ª linha vamos colocar o resultado da razão entre resLiq e recBruta
  • Vamos fazer o autoajuste do tamanho das colunas A até C da abaDRE
  • Vamos apagar o conteúdo (Nothing) da variável abaVendas, abaCaixa e abaDRE, que antes armazenava um objeto
  • Se encerra o código

Veja um exemplo pronto depois de rodar o DRE para o ano de 2021, mostrado em aula:

Macros VBA
Macros VBA

OBS: Para mais detalhes dos tipos de variáveis no VBA visite essa página.

OBS2: Explicamos a estrutura If em outro post do nosso blog também de forma detalhada, caso queira conferir.

OBS3: Para conferir mais detalhes sobre usar as funções do Excel no VBA (WorksheetFunction) você pode dar uma olhada nesse outro post em que abordamos justamente isso.

Até agora, na parte 1, conseguimos:

  • Validar Caixa Ano
  • Fazer cálculos da DRE
  • Preencher a Aba DRE

Nas próximas aulas vamos fechar o código dessa aba.

Nessa aula (Controle para Empresas Aula23) você resumidamente lidou com:

Voltar para o índice

Aula 24 – Parte 2 – Controle para Empresas – Atualizando a Aba de DRE

Hoje em Controle para Empresas Aula24 vamos dar continuidade a atualização da aba de DRE para trazer as informações para o formulário!

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo!

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Série de Controle para Empresas

Hoje nós vamos dar continuidade a atualização da aba de DRE no nosso formulário para finalizar essa automação!

Nessa aula vamos tratar os valores em branco para evitar o erro de estouro no VBA, que acontece por conta da divisão por zero.

E vamos transformar o intervalo em imagem para que seja possível mostrar as informações do DRE como imagem dentro do formulário.

Controles para Empresas

Nós já fizemos os cálculos DRE, mas ainda faltam alguns tratamentos para que possamos de fato visualizar o DRE dentro do formulário.

Como nossa macro para cálculo de DRE já está pronta, nós vamos começar com o ajuste dos valores em branco, ou seja, dos valores quando colocamos um ano que não temos informações.

Para isso vamos fazer um pequeno ajuste na nossa macro, que é já deixar todos os campos vazios antes de colocar os valores.

E em seguida inserimos um tratamento de erro no VBA com o On Error Resume Next no código dos cálculos do DRE.

Tratamento de erros no VBA
Tratamento de erros no VBA

Dessa forma independente do ano já vamos ter os valores vazios e se tiver algum erro no nosso cálculo, como a divisão por 0 (por não termos informações) o VBA vai simplesmente ignorar o erro e continuar com o código.

Depois de ignorar os cálculos que possivelmente podem retornar algum erro nós vamos utilizar o GoTo no VBA para “resetar” o padrão de erros e dar continuidade ao código.

OBS: Essa parte é para que o tratamento de erro funcione apenas para esses 4 cálculos que estamos fazendo, depois disso qualquer erro irá aparecer normalmente.

Isso concluí o tratamento de anos em branco, ou seja, dos anos que não temos nenhuma informação.

Agora nós vamos para a parte de transformar o intervalo em imagem, só que essa parte nós pegamos um código pronto, então não vale a pena decorar isso.

Vou deixar aqui o código que utilizei e a fonte de onde peguei esse código pronto, claro que foram feitas algumas modificações para o nosso código.

abaDRE.Select

abaDRE.Range("A1:C10").Copy
abaDRE.Range("R2").Select

abaDRE.Pictures.Paste Link:=True
abaDRE.Pictures.Select
Application.CutCopyMode = False

Dim meuGrafico As String, minhaImagem As String
Dim larguraImg As Long, alturaImg As Long

Application.ScreenUpdating = False

minhaImagem = Selection.Name

alturaImg = Selection.ShapeRange.Height
larguraImg = Selection.ShapeRange.Width

Charts.Add
ActiveChart.Location Where:=xlLocationAsObject, Name:="DRE"
Selection.Border.LineStyle = 0

meuGrafico = Selection.Name & " " & Split(ActiveChart.Name, " ")(2)

abaDRE.Shapes(meuGrafico).Width = larguraImg
abaDRE.Shapes(meuGrafico).Height = alturaImg

abaDRE.Shapes(minhaImagem).Copy

ActiveChart.ChartArea.Select
ActiveChart.Paste

O código foi tirado do site abaixo, então se quiser ver o código original pode acessar o link!

https://www.exceltrainingvideos.com/place-picture-excel-worksheet-range-into-user-form-with-vba/

Agora vamos a explicação desse código para que você entenda o que está sendo feito.

Vamos selecionar, copiar e colar como imagem o nosso DRE. Em seguida vamos obter a largura e altura da imagem.

Em seguida vamos criar um gráfico já com essas informações de altura e largura e vamos colar essa imagem dentro do gráfico.

DRE em formato de imagem e em gráfico
DRE em formato de imagem e em gráfico

Então ao rodar esse código nós vamos ter a imagem que colamos do nosso DRE e também o gráfico já com essa imagem.

Na próxima aula nós vamos dar continuidade ao código, pois temos mais uma parte para poder trazer essa informação para dentro do formulário.

Voltar para o índice

Aula 25 – Parte 3 – Controle para Empresas – Atualizando a Aba de DRE

Hoje em Controle para Empresas Aula25 vamos finalizar a atualização do DRE para inserir a imagem no formulário e automatizar essa parte!

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo!

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Série de Controle para Empresas

Hoje nós vamos dar continuidade a série para poder finalizar a nossa atualização da aba de DRE para terminar a nossa automação.

Nessa aula vamos fazer os últimos passos para conseguir pegar o nosso DRE e passar para dentro do formulário.

hash

Carregar Imagem no Formulário

Como você já deve saber, nós já fizemos os cálculos DRE e estamos apenas fazendo um último ajuste na macro para cálculo de DRE para que possamos inserir a imagem dentro do formulário.

Na aula anterior nós pegamos um código já pronto e adaptamos para o nosso projeto. Hoje nós vamos pegar a continuação desse código para que possamos automatizar o cálculo por completo.

caminhoImagem = ThisWorkbook.Path & "\img.jpg"
'caminhoImagem = "C:\Users\damor\OneDrive\Área de Trabalho\Imagem DRE\img.jpg"

abaDRE.ChartObjects(1).Chart.Export Filename:=caminhoImagem, FilterName:="jpg"
abaDRE.Shapes(meuGrafico).Delete

Application.ScreenUpdating = True

imgDRE.Picture = LoadPicture(caminhoImagem)

abaDRE.Pictures.Delete

abaDRE.Range("A1").Select

Hoje vamos utilizar esse código para poder finalizar nossa automação. Aqui nós vamos salvar a imagem com VBA utilizando o mesmo caminho do nosso arquivo.

OBS: Nessa parte você pode utilizar o caminho do arquivo, ou pode utilizar a parte comentada que já tem o caminho completo do arquivo onde deseja salvar. Isso serve caso precise ou queira salvar em um lugar específico.

Em seguida nós vamos carregar essa imagem que salvamos dentro do nosso formulário.

Para finalizar nós vamos deletar a imagem que utilizamos como base que está colada e vamos selecionar a célula A1, pois os procedimentos foram feitos lá na coluna R.

IMPORTANTE: Essa parte do Application.ScreenUpdating é para ativar ou desativar a atualização da tela. Esse é um dos códigos que eu ensino para deixar seu código mais rápido no VBA.

Ao executar o código você vai notar que fazer tudo o que está no código dessa aula e da aula passada de forma bem rápida e vai atualizar o nosso formulário.

Inserindo imagem dentro do formulário de forma automática
Inserindo imagem dentro do formulário de forma automática

Assim você vai ter a visualização do DRE dentro do formulário, deixando-o mais completo!

Voltar para o índice

Aula 26 – Parte 1 – Controle para Empresas – Caixa de Combinação

Hoje em Controle para Empresas Aula26 vamos utilizar a caixa de combinação para preencher o formulário substituindo a caixa de texto!

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo!

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Essa é a vigésima sexta aula da série, nessa aula vamos começar a aplicar as sugestões que vocês deram!

Hoje vou te mostrar como trocar caixa de texto por caixa de combinação, ou seja, vamos tirar as caixas de texto, onde o próprio usuário escreve e vamos substituir pelas caixas de combinação no VBA.

Com essas caixas você vai poder definir as opções disponíveis para seleção, então o usuário só vai poder selecionar o que estiver dentro dessa caixa.

Dessa forma você vai evitar de inserir informações erradas dentro da sua tabela. Então vamos ter que criar as listas de opções no formulário para cada uma das opções que temos.

E com isso vamos poder atualizar caixa de combinação com essas informações, dessa forma vamos facilitar o uso para o usuário final!

Outro ponto muito importante é que nessa substituição você não vai poder trocar o nome que já tínhamos dado as caixas de texto, caso contrário você vai ter que fazer essa alteração em todo o código.

Acessando o UserForm

Para acessar o UserForm, precisamos:

  • abrir o ambiente VBA, a partir do atalho do teclado Alt(+Fn)+F11
  • clicar, no menu à esquerda, no formulário de nome “ControleDaEmpresa”


OBS:
Repare que, toda vez que tocamos no formulário, a Caixa de ferramentas aparece como um pop-up (janela flutuante no canto inferior esquerdo, na imagem acima) para nos auxiliar. Ela que nos permitirá criar os objetos que iremos inserir no formulário.

Caso você clique no formulário e a caixa de ferramentas não esteja “aberta”, basta ir em Exibir > Caixa de ferramentas.

Caixa de combinação

Precisaremos inserir alguns botões de comando, que nas próximas aulas vão acionar os nossos códigos e interagir com as caixas de texto e a caixa de listagem criadas.

Para isso, temos que, com a caixa de ferramenta aberta:

  • Clicar no 4º ícone da caixa de ferramentas (miniatura que contém dois quadrados azuis na parte superior)
  • Clicar dentro do formulário com o botão esquerdo
  • Arrastar para dimensionar do tamanho que queremos e soltar o mouse

OBS: A cada caixa de combinação criada nós vamos excluir a caixa de texto a ser substituída.

OBS2: Vamos manter os nomes das caixas anteriores, para que não precisemos mudar várias partes dos códigos já prontas. Assim, não precisaremos mexer em códigos anteriores, apenas programar os novos comandos necessários.

Ao final da criação dos objetos, nosso formulário ficará da seguinte maneira:

Controle para Empresas Aula26

Criando aba Cadastro e listas (fontes de dados)

Vamos listar exatamente o que queremos ter naquelas caixas de combinação criadas. Elas servirão de fonte de dados/opções na lista suspensa de escolha de cada caixa de combinação.

Observe abaixo as listas criadas.

Controle para Empresas Aula26

OBS3: A cada coluna vamos acabar inserindo uma tabela, para facilitar o código que vai puxar essas fontes de dados. Vamos selecionar cada coluna e ir na guia Inserir > Tabela

OBS4: Daremos nomes intuitivos a cada tabela, para que sejam referenciadas no código de forma fácil. Ex: TabProduto.

Acessando o código do formulário

Para fazer alterações no nosso formulário já criado, precisamos primeiramente abrir o ambiente de VBA, a partir do atalho do teclado Alt(+Fn)+F11. Assim poderemos continuar o nosso formulário de controle da empresa.

Mais uma vez lembrando que, para abrir o código do nosso formulário de interesse, devemos ir com o botão direito no formulário ControleDaEmpresa > exibir código.

Controle para Empresas Aula26
Formulário VBA

Inserindo o código abaixo dentro dos códigos já existentes no formulário

Private Sub UserForm_Initialize()

BlocoDeAbas.Value = 0

Call atualizaCaixaDeListagemCompras
Call atualizaCaixaDeListagemVendas
Call atualizaCaixaDeListagemCaixa
Call atualizaCaixaDeListagemEstoque

CxFornecedorCompras.List = Sheets("Cadastro").ListObjects("TabFornecedor").ListColumns(1).DataBodyRange.Value
CxProdutoCompras.List = Sheets("Cadastro").ListObjects("TabProduto").ListColumns(1).DataBodyRange.Value
CxContaCompras.List = Sheets("Cadastro").ListObjects("TabConta").ListColumns(1).DataBodyRange.Value
CxStatusCompras.List = Sheets("Cadastro").ListObjects("TabStatus").ListColumns(1).DataBodyRange.Value

End Sub

Explicação do código acima:

  • Vamos optar pelo evento Initialize do bloco de abas porque queremos fazer a atualização/verificação quando houver a abertura do nosso formulário
  • Vamos forçar/configurar para que o formulário esteja na aba 0 quando abrir (valor do bloco de abas for igual a 0)
  • Chamaremos as macros criadas nas aulas anteriores (atualizaCaixaDeListagemEstoque, atualizaCaixaDeListagemCompras, atualizaCaixaDeListagemVendas e atualizaCaixaDeListagemCaixa), que vão configurar/atualizar as informações das caixas de listagem das nossas páginas “Estoque”, “Compras”, “Vendas” e “Caixa”, respectivamente.
  • Vamos fazer com que a lista da caixa de fornecedor da aba compras receba os valores listados no corpo de dados da lista da coluna 1 da tabela TabFornecedor
  • Vamos fazer com que a lista da caixa de produto da aba compras receba os valores listados no corpo de dados da lista da coluna 1 da tabela TabProduto
  • Vamos fazer com que a lista da caixa de compras da aba compras receba os valores listados no corpo de dados da lista da coluna 1 da tabela TabConta
  • Vamos fazer com que a lista da caixa de status da aba compras receba os valores listados no corpo de dados da lista da coluna 1 da tabela TabStatus
  • E assim se encerra o código de atualização das caixas de combinação

Na aula de hoje (Controle para Empresas Aula26) você lidou com:

  • Acessar formulário no VBA
  • Exibir código de formulário no VBA
  • Trocar caixa de texto por caixa de combinação
  • Formatar como tabela no Excel
  • Formatar caixa de combinação

Voltar para o índice

Aula 27 – Parte 2 – Controle para Empresas – Caixa de Combinação

Hoje em Controle para Empresas Aula27 vamos dar continuidade as sugestões de vocês para acrescentar no formulário!

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo!

Controle para Empresas Aula27

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Essa é a vigésima sétima aula da série, nessa aula vamos dar continuidade a aula anterior para trocar as caixas de texto por caixas de combinação.

Vamos, então, continuar esse processo para trocar essas caixas de texto por caixas de combinação no VBA, agora nas abas de Vendas, Caixa e DRE.

Essa alteração é para evitar com que o usuário insira informações incorretas, então a ideia é atualizar a caixa de combinação no VBA somente com as opções que você definir em uma lista.

Com essa lista de opções no formulário o usuário já vai ter as opções pré-definidas e não vai poder inserir qualquer outra informação que não seja o que você já selecionou.

Essa ferramenta é similar a validação de dados por lista, onde o usuário só visualiza e só pode utilizar as opções que foram dadas, qualquer outra opção não será aceita.

Com isso você evita com que pessoas que não sabem mexer no sistema a colocar informação errada, ou até evitar um erro de digitação que é algo muito comum.

Acessando o UserForm

Para acessar o UserForm, precisamos:

  • abrir o ambiente VBA, a partir do atalho do teclado Alt(+Fn)+F11
  • clicar, no menu à esquerda, no formulário de nome “ControleDaEmpresa”


OBS:
Repare que, toda vez que tocamos no formulário, a Caixa de ferramentas aparece como um pop-up (janela flutuante no canto inferior esquerdo, na imagem acima) para nos auxiliar. Ela que nos permitirá criar os objetos que iremos inserir no formulário.

Caso você clique no formulário e a caixa de ferramentas não esteja “aberta”, basta ir em Exibir > Caixa de ferramentas.

Caixa de combinação

Precisaremos inserir alguns botões de comando, que nas próximas aulas vão acionar os nossos códigos e interagir com as caixas de texto e a caixa de listagem criadas.

Para isso, temos que, com a caixa de ferramenta aberta:

  • Clicar no 4º ícone da caixa de ferramentas (miniatura que contém dois quadrados azuis na parte superior)
  • Clicar dentro do formulário com o botão esquerdo
  • Arrastar para dimensionar do tamanho que queremos e soltar o mouse
Controle para Empresas Aula27

OBS: A cada caixa de combinação criada nós vamos excluir a caixa de texto a ser substituída.

OBS2: Vamos manter os nomes das caixas anteriores, para que não precisemos mudar várias partes dos códigos já prontas. Assim, não precisaremos mexer em códigos anteriores, apenas programar os novos comandos necessários.

Vamos fazer as seguintes criações/substituições:

AbaVendas (formulário)

  • Caixas de Cliente, Produto, Conta e Status

AbaCaixa (formulário)

  • Caixas de Tipo, Conta e Status

AbaEstoque (formulário)

  • Única caixa (de ano)

Aba de nome “Cadastro” (planilha)

  • Criar uma coluna extra, de título “Tipo”, e com as opções “Compra, Despesa e Venda”

Acessando o código do formulário

Para fazer alterações no nosso formulário já criado, precisamos primeiramente abrir o ambiente de VBA, a partir do atalho do teclado Alt(+Fn)+F11. Assim poderemos continuar o nosso formulário de controle da empresa.

Mais uma vez lembrando que, para abrir o código do nosso formulário de interesse, devemos ir com o botão direito no formulário ControleDaEmpresa > exibir código.

Controle para Empresas Aula27
Controle para Empresas Aula27

Inserindo o código abaixo dentro dos códigos já existentes no formulário

Private Sub UserForm_Initialize()

BlocoDeAbas.Value = 0

Call atualizaCaixaDeListagemCompras
Call atualizaCaixaDeListagemVendas
Call atualizaCaixaDeListagemCaixa
Call atualizaCaixaDeListagemEstoque

CxFornecedorCompras.List = Sheets("Cadastro").ListObjects("TabFornecedor").ListColumns(1).DataBodyRange.Value
CxProdutoCompras.List = Sheets("Cadastro").ListObjects("TabProduto").ListColumns(1).DataBodyRange.Value
CxContaCompras.List = Sheets("Cadastro").ListObjects("TabConta").ListColumns(1).DataBodyRange.Value
CxStatusCompras.List = Sheets("Cadastro").ListObjects("TabStatus").ListColumns(1).DataBodyRange.Value

CxClienteVendas.List = Sheets("Cadastro").ListObjects("TabCliente").ListColumns(1).DataBodyRange.Value
CxProdutoVendas.List = Sheets("Cadastro").ListObjects("TabProduto").ListColumns(1).DataBodyRange.Value
CxContaVendas.List = Sheets("Cadastro").ListObjects("TabConta").ListColumns(1).DataBodyRange.Value
CxStatusVendas.List = Sheets("Cadastro").ListObjects("TabStatus").ListColumns(1).DataBodyRange.Value

CxTipoCaixa.List = Sheets("Cadastro").ListObjects("TabTipo").ListColumns(1).DataBodyRange.Value
CxContaCaixa.List = Sheets("Cadastro").ListObjects("TabConta").ListColumns(1).DataBodyRange.Value
CxStatusCaixa.List = Sheets("Cadastro").ListObjects("TabStatus").ListColumns(1).DataBodyRange.Value

cxAnoDRE.List = Sheets("Cadastro").ListObjects("TabAno").ListColumns(1).DataBodyRange.Value

End Sub

Explicação do código acima:

  • Vamos optar pelo evento Initialize do bloco de abas porque queremos fazer a atualização/verificação quando houver a abertura do nosso formulário
  • Vamos forçar/configurar para que o formulário esteja na aba 0 quando abrir (valor do bloco de abas for igual a 0)
  • Chamaremos as macros criadas nas aulas anteriores (atualizaCaixaDeListagemEstoque, atualizaCaixaDeListagemCompras, atualizaCaixaDeListagemVendas e atualizaCaixaDeListagemCaixa), que vão configurar/atualizar as informações das caixas de listagem das nossas páginas “Estoque”, “Compras”, “Vendas” e “Caixa”, respectivamente.
  • Bloco da aba Compras:
    • Vamos fazer com que a lista da caixa de fornecedor da aba compras receba os valores listados no corpo de dados da lista da coluna 1 da tabela TabFornecedor
    • Vamos fazer com que a lista da caixa de produto da aba compras receba os valores listados no corpo de dados da lista da coluna 1 da tabela TabProduto
    • Vamos fazer com que a lista da caixa de compras da aba compras receba os valores listados no corpo de dados da lista da coluna 1 da tabela TabConta
    • Vamos fazer com que a lista da caixa de status da aba compras receba os valores listados no corpo de dados da lista da coluna 1 da tabela TabStatus
  • Bloco da aba Vendas:
    • Vamos fazer com que a lista da caixa de cliente da aba Vendas receba os valores listados no corpo de dados da lista da coluna 1 da tabela TabCliente
    • Vamos fazer com que a lista da caixa de produto da aba Vendas receba os valores listados no corpo de dados da lista da coluna 1 da tabela TabProduto
    • Vamos fazer com que a lista da caixa de compras da aba Vendas receba os valores listados no corpo de dados da lista da coluna 1 da tabela TabConta
    • Vamos fazer com que a lista da caixa de status da aba Vendas receba os valores listados no corpo de dados da lista da coluna 1 da tabela TabStatus
  • Bloco da aba Caixa:
    • Vamos fazer com que a lista da caixa de tipo da aba Caixa receba os valores listados no corpo de dados da lista da coluna 1 da tabela TabTipo
    • Vamos fazer com que a lista da caixa de conta da aba Caixa receba os valores listados no corpo de dados da lista da coluna 1 da tabela TabConta
    • Vamos fazer com que a lista da caixa de status da aba Caixa receba os valores listados no corpo de dados da lista da coluna 1 da tabela TabStatus
  • Bloco da aba DRE:
    • Vamos fazer com que a lista da caixa de ano da aba DRE receba os valores listados no corpo de dados da lista da coluna 1 da tabela TabAno
  • E assim se encerra o código de atualização das caixas de combinação

Disparar macro ao fechar formulário: evento terminate

Private Sub UserForm_Terminate()

Application.Visible = True

If BlocoDeAbas.Value = 0 Or BlocoDeAbas.Value = 1 Then
    ThisWorkbook.Sheets("Compras").Select

ElseIf BlocoDeAbas.Value = 2 Then
    ThisWorkbook.Sheets("Vendas").Select

ElseIf BlocoDeAbas.Value = 3 Then
    ThisWorkbook.Sheets("Estoque").Select

ElseIf BlocoDeAbas.Value = 4 Then
    ThisWorkbook.Sheets("Caixa").Select

Else
    ThisWorkbook.Sheets("DRE").Select

End If

End Sub

Explicação do código acima:

  • O código acima diz respeito ao evento de fechamento do formulário. Quando ele for fechado, esse código irá ser disparado
  • Vamos deixar a aplicação (forma como nos referimos ao Excel) visível (argumento configurado para True = verdadeiro)
  • Se o valor do objeto BlocoDeAbas (que é dado pela posição da aba/página do objeto multi-página, sendo o da esquerda começando por 0):
    • For igual a 0 ou 1, ele selecionará a aba Compras
    • For igual a 2, ele selecionará a aba Vendas
    • For igual a 3, ele selecionará a aba Estoque
    • For igual a 4, ele selecionará a aba Caixa
    • For igual a qualquer outro caso, ele selecionará a aba DRE
  • Se encerra o código

Disparar macro ao abrir a planilha: evento de abertura

Para fazer com que a nossa macro rode automaticamente ao abrir a planilha, deveremos utilizar de um evento no VBA, mais especificamente falando de um evento de abertura da planilha.

Um evento nada mais é do que um acontecimento que vai fazer alguma(s) ação(ões) disparar: o nosso código.

Com o VBA aberto, teremos que programar um evento Workbook_Open da forma mostrada abaixo, clicando duas vezes no menu à esquerda em “EstaPastaDeTrabalho”, e colocando o seguinte código:

abertura
Private Sub Workbook_Open()

Application.Visible = False
ControleDaEmpresa.Show

End Sub

Explicação do código acima:

  • O código acima diz respeito ao evento de abertura da planilha. Quando ela fora aberta, esse código irá ser disparado
  • Vamos deixar a aplicação (forma como nos referimos ao Excel) invisível (argumento configurado para False = falso)
  • Logo em seguida mostramos o formulário ControleDaEmpresa. Dessa forma só veremos o formulário ao abrir o arquivo.

Nessa aula (Controle para Empresas Aula27) você lidou com:

  • Acessar formulário no VBA
  • Exibir código de formulário no VBA
  • Caixas de texto
  • Listas de opções no formulário
  • Trocar caixa de texto por caixa de combinação
  • Formatar como tabela no Excel
  • Caixa de combinação no VBA

Voltar para o índice

Aula 28 – Controle para Empresas – Criando a Análise do DRE Mensal

Hoje em Controle para Empresas Aula28 vamos criar uma análise mensal do DRE, então teremos a análise anual e mensal!

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo!

Controle para Empresas Aula28

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Essa é a vigésima oitava aula (Controle para Empresas Aula28) da série, nessa aula vamos criar uma análise do DRE mensal e fazer algumas validações que vocês deram como sugestão.

Inicialmente nós vamos fazer uma validação sugerida por vocês que é uma mensagem de confirmação no VBA para excluir ou alterar um item.

Isso é muito importante até como segurança caso clique na opção sem querer, então é sempre bom ter uma segunda verificação.

Então vamos criar uma confirmação para excluir um item no VBA e uma validação para alterar um item no VBA.

Para isso vamos apenas adicionar a estrutura condicional if no VBA com uma msgbox (caixa de mensagem no VBA) para perguntar ao usuário se de fato deseja excluir ou alterar a informação.

Depois nós vamos partir para a análise mensal do DRE, pois até então nós tínhamos apenas uma análise mensal!

1) Verificação na hora de Excluir (e Alterar)

Em primeiro lugar vamos incluir linhas de código específicas para criar uma verificação antes de excluir qualquer movimentação/cadastro do nosso formulário/planilha.

Para fazer isso, deveremos acessar o código do nosso formulário, e ir diretamente no código que faz a exclusão, da seguinte forma.

Para fazer alterações no nosso formulário já criado, precisamos primeiramente abrir o ambiente de VBA, a partir do atalho do teclado Alt(+Fn)+F11. Assim poderemos continuar o nosso formulário de controle da empresa.

Mais uma vez lembrando que, para abrir o código do nosso formulário de interesse, devemos ir com o botão direito no formulário ControleDaEmpresa > exibir código.

Formulário VBA
Formulário VBA

Inserindo os códigos abaixo dentro dos códigos já existentes no formulário


Private Sub BtExcluirCaixa_Click()


If CxIDCaixa.Value = "" Then

    MsgBox "O ID a ser excluído não está preenchido. Dê um duplo clique na movimentação a ser excluída."
   Exit Sub

End If

If MsgBox("Você realmente quer excluir essa movimentação?", vbYesNo) <> 6 Then Exit Sub

excluirID (CxIDCaixa.Value)

Call limparCamposDoFormulario
Call atualizaCaixaDeListagemCaixa
End Sub


Private Sub BtExcluirCompras_Click()

If CxIDCompras.Value = "" Then
   MsgBox "O ID a ser excluído não está preenchido. Dê um duplo clique na movimentação a ser excluída."
   Exit Sub
End If

If MsgBox("Você realmente quer excluir essa movimentação?", vbYesNo) <> 6 Then Exit Sub

excluirID (CxIDCompras.Value)


Call limparCamposDoFormulario
Call atualizaCaixaDeListagemCompras
Call atualizaCaixaDeListagemCaixa

End Sub

Private Sub BtExcluirVendas_Click()

If CxIDVendas.Value = "" Then

    MsgBox "O ID a ser excluído não está preenchido. Dê um duplo clique na movimentação a ser excluída."
   Exit Sub

End If


If MsgBox("Você realmente quer excluir essa movimentação?", vbYesNo) <> 6 Then Exit Sub



excluirID (CxIDVendas.Value)

Call limparCamposDoFormulario
Call atualizaCaixaDeListagemVendas
Call atualizaCaixaDeListagemCaixa

End Sub

Explicação das macros atreladas aos botões de Excluir, das abas respectivas de Caixa, Compras e Vendas:

  • Adicionamos uma linha que vai fazer aparecer uma caixa de mensagem no VBA perguntando se deseja excluir a movimentação dessas abas, com as opções de respostas sendo “Sim” ou “Não”.
  • Caso a resposta seja igual a “Sim” (equivalente ao número 6 no VBA), seguiremos com a macro, que irá excluir a movimentação normalmente
  • Caso a resposta seja diferente de “Sim” (ou seja, diferente de 6 no VBA e igual a “Não”), a macro vai ser abortada (instrução de saída Exit Sub)

Inserindo os códigos abaixo dentro dos códigos já existentes no formulário

Private Sub BtAlterarCaixa_Click()

Dim abaVendas As Object, abaCaixa As Object, abaCompras As Object

Dim ultLin As Long, i As Long

'Validando os campos do formulário

If checarCamposVazios Then Exit Sub

'Checar se o ID está preenchido

If CxIDCaixa.Value = "" Then

MsgBox "O ID a ser alterado não está preenchido. Dê um duplo clique na movimentação a ser alterada."

Exit Sub

End If

If MsgBox("Você realmente quer alterar essa movimentação?", vbYesNo) <> 6 Then Exit Sub

Set abaVendas = Sheets("Vendas")

Set abaCompras = Sheets("Compras")

Set abaCaixa = Sheets("Caixa")

'Alterar na aba Compras

ultLin = abaCompras.Range("A1000000").End(xlUp).Row

For i = 2 To ultLin

If CLng(abaCompras.Cells(i, 1).Value) = CLng(CxIDCaixa.Value) Then

abaCompras.Cells(i, 2).Value = CDate(CxDataPCaixa.Value)

abaCompras.Cells(i, 3).Value = CDate(CxDataCCaixa.Value)

abaCompras.Cells(i, 5).Value = CxDescricaoCaixa.Value

abaCompras.Cells(i, 7).Value = -CDbl(CxValorCaixa.Value)

abaCompras.Range("A:G").Columns.AutoFit

End If

Next

'Alterar na aba Vendas

ultLin = abaVendas.Range("A1000000").End(xlUp).Row

For i = 2 To ultLin

If CLng(abaVendas.Cells(i, 1).Value) = CLng(CxIDCaixa.Value) Then

abaVendas.Cells(i, 2).Value = CDate(CxDataPCaixa.Value)

abaVendas.Cells(i, 3).Value = CDate(CxDataCCaixa.Value)

abaVendas.Cells(i, 5).Value = CxDescricaoCaixa.Value

abaVendas.Cells(i, 7).Value = CDbl(CxValorCaixa.Value)

abaVendas.Range("A:I").Columns.AutoFit

End If

Next

'Alterando na aba Caixa

ultLin = abaCaixa.Range("A1000000").End(xlUp).Row

For i = 2 To ultLin

If CLng(abaCaixa.Cells(i, 1).Value) = CLng(CxIDCaixa.Value) Then

abaCaixa.Cells(i, 2).Value = CDate(CxDataPCaixa.Value)

abaCaixa.Cells(i, 3).Value = CDate(CxDataCCaixa.Value)

abaCaixa.Cells(i, 4).Value = CxDescricaoCaixa.Value

abaCaixa.Cells(i, 5).Value = CxTipoCaixa.Value

abaCaixa.Cells(i, 6).Value = CxContaCaixa.Value

abaCaixa.Cells(i, 7).Value = CDbl(CxValorCaixa.Value)

abaCaixa.Cells(i, 8).Value = CxStatusCaixa.Value

abaCaixa.Range("A:H").Columns.AutoFit

End If

Next

'Limpar campos do formulário

Call limparCamposDoFormulario

'Atualizar Caixa de Listagem

Call atualizaCaixaDeListagemVendas

Call atualizaCaixaDeListagemCompras

Call atualizaCaixaDeListagemCaixa

Set abaVendas = Nothing

Set abaCompras = Nothing

Set abaCaixa = Nothing

End Sub

 

Private Sub BtAlterarCompras_Click()

Dim abaCompras As Object, abaCaixa As Object

Dim ultLin As Long, i As Long

'Validando os campos do formulário

If checarCamposVazios Then Exit Sub

'Checar se o ID está preenchido

If CxIDCompras.Value = "" Then

MsgBox "O ID a ser alterado não está preenchido. Dê um duplo clique na movimentação a ser alterada."

Exit Sub

End If

If MsgBox("Você realmente quer alterar essa movimentação?", vbYesNo) <> 6 Then Exit Sub

Set abaCompras = Sheets("Compras")

Set abaCaixa = Sheets("Caixa")

'Alterar na aba Compras

ultLin = abaCompras.Range("A1000000").End(xlUp).Row

For i = 2 To ultLin

If CLng(abaCompras.Cells(i, 1).Value) = CLng(CxIDCompras.Value) Then

abaCompras.Cells(i, 2).Value = CDate(CxDataPCompras.Value)

abaCompras.Cells(i, 3).Value = CDate(CxDataCCompras.Value)

abaCompras.Cells(i, 4).Value = CxFornecedorCompras.Value

abaCompras.Cells(i, 5).Value = CxProdutoCompras.Value

abaCompras.Cells(i, 6).Value = CLng(CxQuantidadeCompras.Value)

abaCompras.Cells(i, 7).Value = CDbl(CxCustoTotalCompras.Value)

abaCompras.Range("A:G").Columns.AutoFit

End If

Next

'Alterando na aba Caixa

ultLin = abaCaixa.Range("A1000000").End(xlUp).Row

For i = 2 To ultLin

If CLng(abaCaixa.Cells(i, 1).Value) = CLng(CxIDCompras.Value) Then

abaCaixa.Cells(i, 2).Value = CDate(CxDataPCompras.Value)

abaCaixa.Cells(i, 3).Value = CDate(CxDataCCompras.Value)

abaCaixa.Cells(i, 4).Value = CxProdutoCompras.Value

abaCaixa.Cells(i, 5).Value = "Compra"

abaCaixa.Cells(i, 6).Value = CxContaCompras.Value

abaCaixa.Cells(i, 7).Value = -CDbl(CxCustoTotalCompras.Value)

abaCaixa.Cells(i, 8).Value = CxStatusCompras.Value

abaCaixa.Range("A:H").Columns.AutoFit

End If

Next

'Limpar campos do formulário

Call limparCamposDoFormulario

'Atualizar Caixa de Listagem

Call atualizaCaixaDeListagemCompras

Call atualizaCaixaDeListagemCaixa

Set abaCompras = Nothing

Set abaCaixa = Nothing

End Sub

 

Private Sub BtAlterarVendas_Click()

Dim abaVendas As Object, abaCaixa As Object

Dim ultLin As Long, i As Long

'Validando os campos do formulário

If checarCamposVazios Then Exit Sub

'Checar se o ID está preenchido

If CxIDVendas.Value = "" Then

MsgBox "O ID a ser alterado não está preenchido. Dê um duplo clique na movimentação a ser alterada."

Exit Sub

End If

If MsgBox("Você realmente quer alterar essa movimentação?", vbYesNo) <> 6 Then Exit Sub

Set abaVendas = Sheets("Vendas")

Set abaCaixa = Sheets("Caixa")

'Alterar na aba Vendas

ultLin = abaVendas.Range("A1000000").End(xlUp).Row

For i = 2 To ultLin

If CLng(abaVendas.Cells(i, 1).Value) = CLng(CxIDVendas.Value) Then

abaVendas.Cells(i, 2).Value = CDate(CxDataPVendas.Value)

abaVendas.Cells(i, 3).Value = CDate(CxDataCVendas.Value)

abaVendas.Cells(i, 4).Value = CxClienteVendas.Value

abaVendas.Cells(i, 5).Value = CxProdutoVendas.Value

abaVendas.Cells(i, 6).Value = CLng(CxQuantidadeVendas.Value)

abaVendas.Cells(i, 7).Value = CDbl(CxValorVendaVendas.Value)

abaVendas.Cells(i, 8).Value = CDbl(CxCustoUVendas.Value)

abaVendas.Cells(i, 9).Value = CDbl(CxCustoVVendas.Value)

abaVendas.Range("A:I").Columns.AutoFit

End If

Next

'Alterando na aba Caixa

ultLin = abaCaixa.Range("A1000000").End(xlUp).Row

For i = 2 To ultLin

If CLng(abaCaixa.Cells(i, 1).Value) = CLng(CxIDVendas.Value) Then

abaCaixa.Cells(i, 2).Value = CDate(CxDataPVendas.Value)

abaCaixa.Cells(i, 3).Value = CDate(CxDataCVendas.Value)

abaCaixa.Cells(i, 4).Value = CxProdutoVendas.Value

abaCaixa.Cells(i, 5).Value = "Venda"

abaCaixa.Cells(i, 6).Value = CxContaVendas.Value

abaCaixa.Cells(i, 7).Value = CDbl(CxValorVendaVendas.Value)

abaCaixa.Cells(i, 8).Value = CxStatusVendas.Value

abaCaixa.Range("A:H").Columns.AutoFit

End If

Next

'Limpar campos do formulário

Call limparCamposDoFormulario

'Atualizar Caixa de Listagem

Call atualizaCaixaDeListagemVendas

Call atualizaCaixaDeListagemCaixa

Set abaVendas = Nothing

Set abaCaixa = Nothing

End Sub

Explicação das macros atreladas aos botões de Alterar, das abas respectivas de Caixa, Compras e Vendas:

  • Adicionamos uma linha que vai fazer aparecer uma caixa de mensagem no VBA perguntando se deseja alterar a movimentação dessas abas, com as opções de respostas sendo “Sim” ou “Não”.
  • Caso a resposta seja igual a “Sim” (equivalente ao número 6 no VBA), seguiremos com a macro, que irá alterar a movimentação normalmente
  • Caso a resposta seja diferente de “Sim” (ou seja, diferente de 6 no VBA e igual a “Não”), a macro vai ser abortada (instrução de saída Exit Sub)

2) Copiar botão de Nova Opção

Vamos simplesmente acessar o formulário, copiar o botão de Nova Opção criado nas aulas anteriores, e colar nas abas que acharmos necessário.

3) Inclusão de mês na aba DRE

Vamos acrescentar uma combobox, e uma label que representem o mês, na aba de DRE. Para isso poderemos copiar as que já existem lá apontando para o ano.

Ficará da seguinte forma:

DRE

Além disso, vamos incluir na aba “Cadastro” da planilha uma coluna representando os meses do ano, em números, com o adendo de uma célula em branco (opção que usaremos para pegar informação de todos os meses). Dessa forma:

Cadastro

Com isso, poderemos fazer as alterações no código para gerar o DRE incluindo o mês na análise, da seguinte forma:

Private Sub btCarregarDRE_Click()
Dim recBruta As Double, dedRec As Double, recLiq As Double, cmv As Double
Dim resBruto As Double, despOp As Double, resAntIR As Double
Dim impRenda As Double, resLiq As Double
Dim anoAnalise As Long, mesAnalise As Integer
Dim abaVendas As Object, abaCaixa As Object, abaDRE As Object

If cxAnoDRE.Value = "" Then

MsgBox "A caixa de ano está vazia. Favor preencher a caixa com o ano desejado."
Exit Sub

End If

Set abaVendas = Sheets("Vendas")
Set abaCaixa = Sheets("Caixa")
Set abaDRE = Sheets("DRE")

anoAnalise = CLng(cxAnoDRE.Value)

If cxMesDRE.Value = "" Then
   mesAnalise = 0

   recBruta = WorksheetFunction.SumIfs(abaVendas.Range("G:G"), abaVendas.Range("C:C"), ">=" & CLng(DateSerial(anoAnalise, 1, 1)), abaVendas.Range("C:C"), "<=" & CLng(DateSerial(anoAnalise, 12, 31)))
   dedRec = 0
   recLiq = recBruta - dedRec
   cmv = WorksheetFunction.SumIfs(abaVendas.Range("I:I"), abaVendas.Range("C:C"), ">=" & CLng(DateSerial(anoAnalise, 1, 1)), abaVendas.Range("C:C"), "<=" & CLng(DateSerial(anoAnalise, 12, 31)))
   resBruto = recLiq - cmv

    despOp = -WorksheetFunction.SumIfs(abaCaixa.Range("G:G"), abaCaixa.Range("C:C"), ">=" & CLng(DateSerial(anoAnalise, 1, 1)), abaCaixa.Range("C:C"), "<=" & CLng(DateSerial(anoAnalise, 12, 31)), abaCaixa.Range("E:E"), "Despesa")
   resAntIR = resBruto - despOp
 
  impRenda = recBruta * 0.06
   resLiq = resAntIR - impRenda

    abaDRE.Cells(1, 1).Value = "Ano"
   abaDRE.Cells(1, 2).Value = anoAnalise
   abaDRE.Cells(1, 2).NumberFormat = "General"

Else

    mesAnalise = CInt(cxMesDRE.Value)

   recBruta = WorksheetFunction.SumIfs(abaVendas.Range("G:G"), abaVendas.Range("C:C"), ">=" & CLng(DateSerial(anoAnalise, mesAnalise, 1)), abaVendas.Range("C:C"), "<=" & CLng(DateSerial(anoAnalise, mesAnalise + 1, 1)) - 1)
   dedRec = 0
   recLiq = recBruta - dedRec
   cmv = WorksheetFunction.SumIfs(abaVendas.Range("I:I"), abaVendas.Range("C:C"), ">=" & CLng(DateSerial(anoAnalise, mesAnalise, 1)), abaVendas.Range("C:C"), "<=" & CLng(DateSerial(anoAnalise, mesAnalise + 1, 1)) - 1)
   resBruto = recLiq - cmv

    despOp = -WorksheetFunction.SumIfs(abaCaixa.Range("G:G"), abaCaixa.Range("C:C"), ">=" & CLng(DateSerial(anoAnalise, mesAnalise, 1)), abaCaixa.Range("C:C"), "<=" & CLng(DateSerial(anoAnalise, mesAnalise + 1, 1)) - 1, abaCaixa.Range("E:E"), "Despesa")
   resAntIR = resBruto - despOp
  
  impRenda = recBruta * 0.06
   resLiq = resAntIR - impRenda

    abaDRE.Cells(1, 1).Value = "Mês"
   abaDRE.Cells(1, 2).Value = mesAnalise & "/" & anoAnalise
End If

abaDRE.Cells(2, 2).Value = recBruta
abaDRE.Cells(3, 2).Value = dedRec
abaDRE.Cells(4, 2).Value = recLiq
abaDRE.Cells(5, 2).Value = cmv
abaDRE.Cells(6, 2).Value = resBruto
abaDRE.Cells(7, 2).Value = despOp
abaDRE.Cells(8, 2).Value = resAntIR
abaDRE.Cells(9, 2).Value = impRenda
abaDRE.Cells(10, 2).Value = resLiq

abaDRE.Cells(4, 3).Value = ""

abaDRE.Cells(6, 3).Value = ""

abaDRE.Cells(8, 3).Value = ""

abaDRE.Cells(10, 3).Value = ""

On Error Resume Next

abaDRE.Cells(4, 3).Value = recLiq / recBruta

abaDRE.Cells(6, 3).Value = resBruto / recBruta

abaDRE.Cells(8, 3).Value = resAntIR / recBruta

abaDRE.Cells(10, 3).Value = resLiq / recBruta

On Error GoTo 0

'abaDRE.Range("A:C").Columns.AutoFit

'https://www.exceltrainingvideos.com/place-picture-excel-worksheet-range-into-user-form-with-vba/

abaDRE.Select

abaDRE.Range("A1:C10").Copy

abaDRE.Range("R2").Select

abaDRE.Pictures.Paste Link:=True

abaDRE.Pictures.Select

Application.CutCopyMode = False

Dim meuGrafico As String, minhaImagem As String, caminhoImagem As String

Dim larguraImg As Long, alturaImg As Long

Application.ScreenUpdating = False

minhaImagem = Selection.Name

alturaImg = Selection.ShapeRange.Height

larguraImg = Selection.ShapeRange.Width

Charts.Add

ActiveChart.Location Where:=xlLocationAsObject, Name:="DRE"

Selection.Border.LineStyle = 0

meuGrafico = Selection.Name & " " & Split(ActiveChart.Name, " ")(2)

abaDRE.Shapes(meuGrafico).Width = larguraImg

abaDRE.Shapes(meuGrafico).Height = alturaImg

abaDRE.Shapes(minhaImagem).Copy

ActiveChart.ChartArea.Select

ActiveChart.Paste

'caminhoImagem = ThisWorkbook.Path & "img.jpg"

caminhoImagem = "C:UsersdamorOneDriveÁrea de TrabalhoImagem DREimg.jpg"

abaDRE.ChartObjects(1).Chart.Export Filename:=caminhoImagem, FilterName:="jpg"

abaDRE.Shapes(meuGrafico).Delete

Application.ScreenUpdating = True

imgDRE.Picture = LoadPicture(caminhoImagem)

abaDRE.Pictures.Delete

abaDRE.Range("A1").Select

Set abaVendas = Nothing

Set abaCaixa = Nothing

Set abaDRE = Nothing

End Sub

Vamos focar aqui nas mudanças que aconteceram na aula, quando inserimos o mês de análise no DRE. Para conferir as explicações completas da macro “Private Sub btCarregarDRE_Click” recomendamos olhar as aulas anteriores (parte 1, parte 2, parte 3).

Explicação das mudanças na macro de Carregar o DRE (destacadas em negrito):

  • Se CxMesDRE (caixa em que preenchemos o número do mês na aba DRE) estiver vazia (opção vazia citada anteriormente), vamos:
    • Armazenar na variável/assumir que a variável mesAnalise é igual a 0 (porque nenhum mês foi selecionado), e vamos seguir para a análise anual, da forma habitual
    • Vamos armazenar na variável “anoAnalise” o número do ano (dado pela função de conversão CLng) do valor que estiver escrito na CxAnoDRE
    • Armazenar na variável “recBruta” o resultado da função SOMASES no VBA, que vai somar os valores da coluna G da aba Vendas, considerando o que na coluna C da aba Vendas for equivalente a uma data maior ou igual ao 1º dia do 1º mês do anoAnalise, e menor ou igual ao 31º dia do 12º mês do anoAnalise
    • Armazenar na variável “dedRec” valor zero (0)
    • Armazenar na variável “recLiq” o resultado da subtração entre “recBruta” e “dedRec”
    • Armazenar na variável “cmv” o resultado da função SOMASES no VBA, que vai somar os valores da coluna I da aba Vendas, considerando o que na coluna C da aba Vendas for equivalente a uma data maior ou igual ao 1º dia do 1º mês do anoAnalise, e menor ou igual ao 31º dia do 12º mês do anoAnalise
    • Armazenar na variável “resBruto” o resultado da subtração entre “recLiq” e “cmv”
    • Armazenar na variável “despOp” o resultado da função SOMASES no VBA, que vai somar os valores da coluna G da aba Caixa, considerando o que na coluna C da aba Caixa for equivalente a uma data maior ou igual ao 1º dia do 1º mês do anoAnalise, e menor ou igual ao 31º dia do 12º mês do anoAnalise. Multiplicaremos esse resultado por -1 para representar uma despesa (sinal negativo)
    • Armazenar na variável “resAntIR” o resultado da subtração entre “resBruto” e “despOP”
    • Armazenar na variável “impRenda” valor resultante da multiplicação entre a variável “recBruta” e 6% (0,06)
    • Armazenar na variável “resLiq” o resultado da subtração entre “resAntIR” e “impRenda”
    • Por fim armazenar na célula da 1ª linha e 1ª coluna (célula A1) da aba DRE a palavra “Ano”
    • Armazenar na célula da 1ª linha e 2ª coluna (célula B1) da aba DRE  o que estiver escrito na variável “anoAnalise”
    • Formatar a célula da 1ª linha e 2ª coluna (célula B1) da aba com o formato Geral (“General”, em inglês)

Exemplo de análise anual já foi visto nas aulas anteriores.

  • Se CxMesDRE (caixa em que preenchemos o número do mês na aba DRE) estiver preenchida com um número de 1 a 12, vamos:
    • Armazenar na variável “mesAnalise” o número que estiver na cxMesDRE (dado pela função de conversão CInt)
    • Vamos armazenar na variável “anoAnalise” o número do ano (dado pela função de conversão CLng) do valor que estiver escrito na CxAnoDRE
    • Armazenar na variável “recBruta” o resultado da função SOMASES no VBA, que vai somar os valores da coluna G da aba Vendas, considerando o que na coluna C da aba Vendas for equivalente a uma data maior ou igual ao 1º dia do mesAnalise, e menor ou igual ao último dia do mesAnalise (1º dia do mês seguinte – 1 dia)
    • Armazenar na variável “dedRec” valor zero (0)
    • Armazenar na variável “recLiq” o resultado da subtração entre “recBruta” e “dedRec”
    • Armazenar na variável “cmv” o resultado da função SOMASES no VBA, que vai somar os valores da coluna I da aba Vendas, considerando o que na coluna C da aba Vendas for equivalente a uma data maior ou igual ao 1º dia do mesAnalise, e menor ou igual ao último dia do mesAnalise (1º dia do mês seguinte – 1 dia)
    • Armazenar na variável “resBruto” o resultado da subtração entre “recLiq” e “cmv”
    • Armazenar na variável “despOp” o resultado da função SOMASES no VBA, que vai somar os valores da coluna G da aba Caixa, considerando o que na coluna C da aba Caixa for equivalente a uma data maior ou igual ao 1º dia do mesAnalise, e menor ou igual ao último dia do mesAnalise (1º dia do mês seguinte – 1 dia). Multiplicaremos esse resultado por -1 para representar uma despesa (sinal negativo)
    • Armazenar na variável “resAntIR” o resultado da subtração entre “resBruto” e “despOP”
    • Armazenar na variável “impRenda” valor resultante da multiplicação entre a variável “recBruta” e 6% (0,06)
    • Armazenar na variável “resLiq” o resultado da subtração entre “resAntIR” e “impRenda”
    • Por fim armazenar na célula da 1ª linha e 1ª coluna (célula A1) da aba DRE a palavra “Mês”
    • Armazenar na célula da 1ª linha e 2ª coluna (célula B1) da aba DRE o texto somado entre “mesAnalise”,  “/”  e “anoAnalise”, que dará o mês/ano escrito no DRE

Exemplo de DRE com mês de análise incluso:

Controle para Empresas Aula28

Nessa aula (Controle para Empresas Aula28) você lidou com:

  • Criando análise do DRE mensal
  • Estrutura condicional (If no VBA)
  • Msgbox
  • Confirmação para excluir um item no VBA
  • Validação para alterar um item no VBA

Voltar para o índice

Aula 29 – Controle para Empresas – Filtro de Estoque e Logo da Empresa

Hoje em Controle para Empresas Aula29 vamos criar um filtro para o estoque e vamos inserir a logo da empresa no formulário!

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo!

Controle para Empresas Aula29

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Essa é a vigésima nona aula da série, nessa aula vamos trabalhar com filtros no VBA e inserção de imagem no VBA.

Vamos fazer um filtro de estoque para que você consiga filtrar apenas os produtos que quiser e facilitar a sua busca.

Para isso vamos utilizar a estrutura condicional if no VBA e alguns códigos que já temos pronto dentro das macros no VBA.

E vamos atualizar a caixa de listagem no VBA com essas informações filtradas para que o usuário tenha uma visualização mais específica do que está buscando.

Boa parte do que vamos ver na aula vocês já sabem, vamos apenas fazer essas aplicações. Isso é bom para que vocês possam observar que mesmo com códigos que você já tem no seu próprio projeto, você pode criar ainda mais funcionalidades!

Acessando os códigos do formulário

Em primeiro lugar vamos incluir a imagem de logo da Hashtag no formulário, e depois incluir linhas de código específicas para filtrar um produto na aba Estoque..

Para fazer alterações no nosso formulário já criado, precisamos primeiramente abrir o ambiente de VBA, a partir do atalho do teclado Alt(+Fn)+F11. Assim poderemos continuar o nosso formulário de controle da empresa.

Mais uma vez lembrando que, para abrir o código do nosso formulário de interesse, devemos ir com o botão direito no formulário ControleDaEmpresa > exibir código.

Formulário VBA
Formulário VBA


Inserindo imagem no formulário

Para colocar a colocar a logo (imagem) da Hashtag no em qualquer aba do nosso formulário, precisamos:

  • Clicar no nosso formulário, para que a caixa de ferramentas se abra, e, a partir dela, procuraremos pela última opção (miniatura de uma imagem).
Imagem
  • Clicaremos dentro do Formulário e arrastaremos para redimensionar de acordo com que queiramos. Em seguida, clicando na imagem, iremos procurar pela propriedade (no menu à esquerda, da parte inferior) “Picture”.
  • Por padrão, nela está escrito “(Nenhum)”, mas clicaremos nos 3 pontinhos, e abrirá como opção uma caixa do Windows Explorer para você localizar a imagem (em que pasta está) que você quer usar dentro do formulário.
  • Inicialmente, o VBA não entende o tamanho da imagem, e tenta colocar uma parte dela para caber no tamanho inicial do “retângulo”, e não fica da forma que queremos. Então, para modificar isso, com a imagem clicada, precisamos ir na propriedadePictureSizeMode”, iremos nos 3 pontinhos dela, e mudaremos o que está nessa propriedade para o final Zoom, e após/ou Stretch, conforme você ache melhor, como demonstramos no vídeo.
  • Para tirar a borda da imagem, e ela ficar perfeita no nosso formulário, iremos na propriedade de BorderStyle, e procurar pela opção com final “None”, e pronto.

Filtrar produtos na aba Estoque

Para preparar a parte visual precisaremos incluir uma caixa de texto, e um botão de comando, que sirvam de entrada de dados e o clique que dispare ação de filtrar, respectivamente.

Vamos copiar formas já prontas de outras abas, mudar apenas os nomes dos objetos, e suas propriedades Caption, como mostrado na videoaula. Veja abaixo o resultado:

FiltrarProduto

Em seguida, criaremos uma aba auxiliar, a Estoque_Aux, que vai ser uma aba que vai participar da atualização da caixa de listagem da aba de estoque do formulário.

Para acessar o código do botão de filtragem, precisaremos modificar a sub respectiva criada que ele chama, ao ser clicado. A macro criada, no caso, é a atualizaCaixaDeListagemEstoque.

Sub atualizaCaixaDeListagemEstoque()
Dim abaEstoque As Object, abaEstoqueAux As Object, abaCompras As Object, abaVendas As Object
Dim ultLin As Long, linha As Long


Set abaEstoque = Sheets("Estoque")
Set abaEstoqueAux = Sheets("Estoque_Aux")
Set abaCompras = Sheets("Compras")
Set abaVendas = Sheets("Vendas")

ultLin = abaEstoque.Range("A1000000").End(xlUp).Row


If ultLin > 1 Then

For linha = 2 To ultLin
abaEstoque.Cells(linha, 2).Value = WorksheetFunction.SumIf(abaCompras.Range("E:E"), abaEstoque.Cells(linha, 1).Value, abaCompras.Range("F:F"))
abaEstoque.Cells(linha, 3).Value = WorksheetFunction.SumIf(abaVendas.Range("E:E"), abaEstoque.Cells(linha, 1).Value, abaVendas.Range("F:F"))
abaEstoque.Cells(linha, 4).Value = abaEstoque.Cells(linha, 2).Value - abaEstoque.Cells(linha, 3).Value
Next

End If

If ControleDaEmpresa.CxProcuraEstoque.Value = "" Then
   ControleDaEmpresa.CxListagemEstoque.ColumnCount = 4
   ControleDaEmpresa.CxListagemEstoque.ColumnHeads = True
   ControleDaEmpresa.CxListagemEstoque.ColumnWidths = "125;125;125;125"
   ControleDaEmpresa.CxListagemEstoque.RowSource = "Estoque!A2:D" & ultLin

Else

    abaEstoque.Range("A1").CurrentRegion.AutoFilter 1, "*" & ControleDaEmpresa.CxProcuraEstoque.Value & "*"
   abaEstoqueAux.UsedRange.Delete
   abaEstoque.Range("A1").CurrentRegion.Copy abaEstoqueAux.Range("A1")
   abaEstoque.AutoFilterMode = False
  
   ultLin = abaEstoqueAux.Range("A1000000").End(xlUp).Row
  
   If ultLin = 1 Then ultLin = 2
  
   ControleDaEmpresa.CxListagemEstoque.ColumnCount = 4
   ControleDaEmpresa.CxListagemEstoque.ColumnHeads = True
   ControleDaEmpresa.CxListagemEstoque.ColumnWidths = "125;125;125;125"
   ControleDaEmpresa.CxListagemEstoque.RowSource = "Estoque_Aux!A2:D" & ultLin

End If

End Sub

Explicação das mudanças da macro, em negrito:

  • Vamos utilizar de uma estrutura condicional que vai ler o valor que tem na CxProcuraEstoque, que criamos recentemente
  • Se não houver nada escrito, ou seja, o valor dela for vazio:
    • Vamos configurar a caixa de listagem contendo as informações de Estoque (CxListagemEstoque), que vai ter 4 colunas. Repare que essa caixa de listagem está no ControleDaEmpresa, por isso o comando começa com o nome do formulário
    • A próxima instrução irá dizer que a nossa caixa de listagem tem cabeçalho (Heads = True).
    • Em seguida iremos passar para o código a largura de cada coluna. Das 9 existentes, separadas por ponto e vírgula (;). Lembrando que isso é ajuste fino e cada usuário pode personalizar a largura como deseja.
    • A última linha do nosso código diz respeito ao carregamento de informações que a nossa caixa de listagem vai ter. A fonte de dados (RowSource) da nossa caixa de listagem será preenchida com as informações da aba “Estoque”, da 2ª linha da coluna A até a última linha da coluna D, dada pela variável “ultLin” descoberta no começo do nosso código.
  • Se houver algo escrito, vamos iniciar o processo de filtragem de fato:
    • Vamos pegar o conjunto de células que tem dados preenchidos, a partir da célula A1 da abaEstoque, e vamos filtrá-lo de acordo com o cabeçalho, mas olhando para a 1ª coluna, considerando: qualquer texto escrito (“*”), seguido do que estiver na CxProcuraEstoque, seguido de qualquer texto novamente (dessa forma, qualquer texto escrito antes ou depois vai levar em consideração sempre achar o texto procurado, independentemente do que estiver escrito antes ou depois)
    • Vamos limpar o que tem de células preenchidas na abaEstoqueAux
    • Copiaremos o que tem na abaEstoque e levaremos para a abaEstoqueAux
    • Vamos retirar o filtro aplicado anteriormente na abaEstoque, para as informações voltarem ao original (todas mostradas)
    • Vamos armazenar na variável “ultLin” o valor numérico que representa a última linha da coluna A da abaEstoqueAux
    • Se o valor de “ultLin” for igual a 1 (ou seja, nada preenchido na abaEstoqueAux), vamos mudar esse valor para 2
    • Vamos configurar a caixa de listagem contendo as informações de Estoque (CxListagemEstoque), que vai ter 4 colunas. Repare que essa caixa de listagem está no ControleDaEmpresa, por isso o comando começa com o nome do formulário
    • A próxima instrução irá dizer que a nossa caixa de listagem tem cabeçalho (Heads = True).
    • Em seguida iremos passar para o código a largura de cada coluna. Das 9 existentes, separadas por ponto e vírgula (;). Lembrando que isso é ajuste fino e cada usuário pode personalizar a largura como deseja.
    • A última linha do nosso código diz respeito ao carregamento de informações que a nossa caixa de listagem vai ter. A fonte de dados (RowSource) da nossa caixa de listagem será preenchida com as informações da aba “Estoque_Aux”, da 2ª linha da coluna A até a última linha da coluna D da aba “Estoque_Aux”, dada pela variável “ultLin” descoberta no começo do nosso código
  • Se encerra o código

Nessa aula (Controle para Empresas Aula29) você lidou com:

  • Logo dentro do VBA
  • Inserir imagem no VBA
  • Caixa de texto no VBA
  • Macros no VBA
  • Atualizar caixa de listagem no VBA
  • Como filtrar no VBA
  • Estrutura condicional

Voltar para o índice

Aula 30 – Controle para Empresas – Valor de Venda Automático

Hoje em Controle para Empresas Aula30 vamos fazer o cálculo automático do valor de venda para facilitar o preenchimento!

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo!

Controle para Empresas Aula30

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Essa é a trigésima aula da série, nessa aula nós vamos continuar com as sugestões de vocês!

Vamos fazer o preenchimento automático do valor de venda de um produto. A ideia é criar um preenchimento automático no VBA caso o produto já tenha sido vendido.

Assim vamos poder facilitar o preenchimento desse valor e agilizar o preenchimento das informações. Caso não o produto não tenha sido vendido não vamos fazer nenhum cálculo.

Outro ponto interessante é que se você quiser vender o mesmo produto, só que com um valor diferente ou desconto, vai poder alterar esse preenchimento de forma manual sem problema algum.

Para a construção da macro vamos utilizar a estrutura condicional if no VBA, a estrutura de repetição for no VBA e o CountIF (que é o CONT.SE no VBA).

Inserindo um módulo

Para criar um código dentro de um módulo, precisamos primeiramente abrir o ambiente de VBA, a partir do atalho do teclado Alt(+Fn)+F11. Assim poderemos de fato criar o nosso código a ser utilizado.

Como não temos nenhum módulo criado antes nessa planilha, vamos na guia Inserir > Módulo, e uma caixa branca se abrirá.
InserirModulo

Mudaremos a sua propriedade name para “modValorVenda” e colocaremos a seguinte sub dentro dele, que será um objeto de estudo da aula de hoje:

Sub calcularValorVenda()

If ControleDaEmpresa.CxProdutoVendas.Value = "" Or ControleDaEmpresa.CxQuantidadeVendas.Value = "" Then
    Exit Sub

End If

Dim abaVendas As Worksheet
Dim produto As String
Dim qtd As Integer
Dim i As Long, ultLin As Long
Dim valorVendaUnit As Double

Set abaVendas = ThisWorkbook.Worksheets("Vendas")

produto = ControleDaEmpresa.CxProdutoVendas.Value

qtd = WorksheetFunction.CountIf(abaVendas.Range("E:E"), produto)

If qtd = 0 Then Exit Sub

ultLin = abaVendas.Range("A1048576").End(xlUp).Row

For i = ultLin To 2 Step -1

    If abaVendas.Cells(i, 5).Value = produto Then
        valorVendaUnit = abaVendas.Cells(i, 7).Value / abaVendas.Cells(i, 6).Value
        Exit For
    End If

Next

ControleDaEmpresa.CxValorVendaVendas.Value = Format(valorVendaUnit * ControleDaEmpresa.CxQuantidadeVendas.Value, "#,##0.00")

Set abaVendas = Nothing 

End Sub

Explicação do código acima (calcularValorVenda):

  • Vamos utilizar de uma estrutura If para verificar se o valor da CxProdutoVendas for igual a vazio (nada preenchido) ou se o valor da CxQuantidadeVendas for igual a vazia (nada preenchido). Se uma condição ou outra ocorrerem, o código vai ser abortado (instrução de saída Exit Sub)
  • Vamos dimensionar:
    • a variável abaVendas como uma Worksheet (objeto de planilha)
    • a variável produto como uma String (texto)
    • a variável qtd como um Integer (número inteiro de módulo até 32.767)
    • as variáveis i e ultLin como Long (números inteiros de módulo até 2.147.483.647)
    • a variável valorVendaUnit como Double (número decimal)
    • Para entender melhor sobre os tipos de dados no VBA, visite esse link oficial
  • Vamos configurar a variável abaVendas para assumir um objeto específico, que nesse caso é a aba “Vendas” desse arquivo, através do comando Set
  • Armazenar na variável “produto” o valor que estiver escrito na CxProdutoVendas
  • Armazenar na variável “qtd” o valor resultante da função CONT.SE no VBA (CountIF) do produto na coluna E da abaVendas
  • Fazer a seguinte verificação: se essa quantidade (dada pela variável qtd) for igual a 0, a macro será abortada
  • Armazenar na variável “ultLin” a última linha preenchida da coluna A da abaVendas
  • Utilizar de uma estrutura de repetição que vai fazer ações repetidas, de baixo pra cima (instrução Step -1) da ultLin até a linha 2:
    • Vamos utilizar de uma estrutura If para verificar, linha a linha (i), se o valor da célula da coluna E (5ª coluna) for igual ao valor do que estiver armazenado na variável “produto”:
      • Vamos armazenar na variável valorVendaUnit o valor da divisão entre o que estiver na coluna G pelo que estiver na coluna F da abaVendas, naquela linha (i)
      • Também irá abortar a estrutura de repetição For no VBA criada, porque o valor já foi calculado para aquele produto, e não precisa de mais verificações
    • Vamos armazenar na CxValorVendaVendas o que for resultado da multiplicação entre a variável “valorVendaUnit” e o que tiver na CxQuantidadeVendas, formatado (função Format) número que tenha separador de milhar e mostre 2 casas decimais

Acessando os códigos do formulário

Já construímos o código necessário para o cálculo do valor de venda automático. Agora precisamos fazer o formulário interpretar e acionar esse cálculo.

Precisaremos, então, fazer uma modificação nos códigos das caixas de Produto e Quantidade da aba Vendas, para que elas ativem o cálculo, se necessário for.

Para fazer alterações no nosso formulário já criado, precisamos primeiramente abrir o ambiente de VBA, a partir do atalho do teclado Alt(+Fn)+F11. Assim poderemos continuar o nosso formulário de controle da empresa.

Mais uma vez lembrando que, para abrir o código do nosso formulário de interesse, devemos ir com o botão direito no formulário ControleDaEmpresa > exibir código. Quer aprender tudo sobre o VBA? Confira curso avançado de VBA da Hashtag.

Controle para Empresas Aula30
Formulário VBA

Macros a serem alteradas dentro do formulário:

Private Sub CxProdutoVendas_Change()

Call calcularCustoVenda
Call calcularValorVenda

End Sub

 
Private Sub CxQuantidadeVendas_Change()

Call calcularCustoVenda
Call calcularValorVenda

End Sub

Explicação dos códigos acima:

  • Vamos inserir uma linha que vai “ativar” ou chamar a macro criada acima, a calcularValorVenda, quando alterarmos o valor tanto da CxProdutoVendas quanto da CxQuantidadeVendas

Nessa aula você lidou com:

Voltar para o índice

Aula 31 – Controle para Empresas – Imprimir Relatório de Estoque a Comprar

Hoje em Controle para Empresas Aula31 vamos criar a parte de impressão automática do relatório de estoque a comprar!

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo!

Controle para Empresas Aula31

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Essa é a trigésima primeira aula da série, nessa aula nós vamos continuar com as sugestões de vocês!

Hoje nós vamos adicionar uma opção para imprimir relatório de estoque a comprar! Isso mesmo você vai poder imprimir relatório com VBA.

Dessa forma você já vai poder verificar quais produtos precisam ser comprados e vai poder imprimir essa lista para facilitar o seu trabalho.

A ideia é utilizar o estoque mínimo de produtos no VBA como base para imprimir esse relatório. Claro que nessa aula vamos criar essa coluna de estoque mínimo e inserir essa opção na hora de registrar um produto.

Outra opção vai ser gerar PDF de estoque, então você vai poder imprimir diretamente ou gerar PDF com VBA.

Uma última opção caso queira acrescentar é fazer uma pré-visualização de impressão antes de imprimir direto.

Esse último procedimento é interessante quando precisa confirmar se as informações estão de fato corretas.

Modificações na planilha

Para criar a impressão de um “relatório” para o estoque, precisaremos também de uma nova informação que não colocamos antes na planilha: estoque mínimo.

Para isso, precisaremos ir na abas “Estoque” e “Estoque_Aux” da nossa planilha, e criar uma coluna extra (na coluna E de ambas) a coluna que vai receber o Estoque Mínimo. Veja abaixo:

Aba “Estoque”

abaEstoque

Aba “Estoque_Aux”

Esse valor de estoque mínimo vai ser inserido na planilha através de uma InputBox dentro do código de adição de produtos na planilha, como foi pontuado no vídeo.

Para saber mais sobre como lidar com uma InputBox no VBA, visite esse link.

Vamos também inserir um botão com o texto “Relatório”, na aba/página Estoque do nosso formulário, para receber o código de formatação e impressão, ou salvamento de PDF que vamos ver a seguir. Veja:

Controle para Empresas Aula31

Acessando os códigos do formulário

Para fazer alterações no nosso formulário já criado, precisamos primeiramente abrir o ambiente de VBA, a partir do atalho do teclado Alt(+Fn)+F11. Assim poderemos continuar o nosso formulário de controle da empresa.

Mais uma vez lembrando que, para abrir o código do nosso formulário de interesse, devemos ir com o botão direito no formulário ControleDaEmpresa > exibir código.

Controle para Empresas Aula31
Formulário VBA

Macros a serem alteradas dentro do formulário:

Private Sub btRelatorioEstoque_Click()

Dim abaEstoque As Worksheet, abaEstoqueAux As Worksheet
Dim ultLin As Long, i As Long, priLin As Long
Dim caminhoPDF As String
Dim resp As Integer


Set abaEstoque = ThisWorkbook.Worksheets("Estoque")
Set abaEstoqueAux = ThisWorkbook.Worksheets("Estoque_Aux")


ultLin = abaEstoque.Range("A1048576").End(xlUp).Row

abaEstoqueAux.UsedRange.Clear

abaEstoque.Range("A1:E1").Copy abaEstoqueAux.Range("A1")

For i = 2 To ultLin

    If abaEstoque.Cells(i, 4).Value < abaEstoque.Cells(i, 5).Value Then
       priLin = abaEstoqueAux.Range("A1048576").End(xlUp).Row + 1

        abaEstoque.Range("A" & i & ":E" & i).Copy abaEstoqueAux.Cells(priLin, 1)

    End If

Next

abaEstoqueAux.UsedRange.Columns.AutoFit

resp = CInt(InputBox("Qual formato de relatório você quer? Prévia de Impressão/Impressão/PDF [1/2/3] - Digite o número correspondente"))

If resp = 1 Then
   '1ª Opção: exibir a tela de prévia de impressão e imprimir por lá
   ControleDaEmpresa.Hide
   abaEstoqueAux.PrintPreview
   Unload ControleDaEmpresa

ElseIf resp = 2 Then
   '2ª Opção: imprimir direto com as configurações padrão
   abaEstoqueAux.PrintOut

ElseIf resp = 3 Then
   '3ª Opção: gerar um PDF
   caminhoPDF = "C:UsersdamorOneDriveÁrea de TrabalhoRelatório de Estoque a Comprar.pdf"
   abaEstoqueAux.ExportAsFixedFormat Type:=xlTypePDF, Filename:=caminhoPDF, OpenAfterPublish:=True

End If

Set abaEstoque = Nothing
Set abaEstoqueAux = Nothing

End Sub

Explicação do código acima (btRelatorioEstoque_Click):

  • Vamos dimensionar:
    • as variáveis “abaEstoque” e “abaEstoqueAux” como Worksheets (objetos de planilha)
    • as variáveis “ultLin”, “i” e “priLin” como Long (números inteiros de módulo até 2.147.483.647)
    • a variável “caminhoPDF” como uma String (texto)
    • a variável “resp” como um Integer (número inteiro de módulo até 32.767)
    • Para entender melhor sobre os tipos de dados no VBA, visite esse link oficial
  • Vamos configurar a variável abaEstoque para assumir um objeto específico, que nesse caso é a aba “Estoque” desse arquivo, através do comando Set
  • Vamos configurar a variável abaEstoqueAux para assumir um objeto específico, que nesse caso é a aba “Estoque_Aux” desse arquivo, através do comando Set
  • Armazenar na variável “ultLin” a última linha preenchida da coluna A da abaEstoque
  • Limpar as informações da abaEstoqueAux, para que receba novas informações
  • Copiar as informações de A1 até E1 da abaEstoque e colar na célula A1 da abaEstoqueAux (cabeçalho)
  • Usar de uma estrutura de repetição For, indo de 2 até “ultLin”, onde:
    • Usar de uma verificação através de uma estrutura If de comparação para ver se o valor da célula da linha em questão (“i”), na coluna 4 da abaEstoque é menor do que o valor da célula da linha em questão (“i”), na coluna 5 da abaEstoque.
    • Se for menor, realmente:
      • Armazenar na variável “priLin” a última linha preenchida da coluna A da abaEstoqueAux
      • Copiar as informações daquela linha (“i”) colunas A até E da abaEstoque e colar na célula localizada na “priLin” e na coluna 1, da abaEstoqueAux (cabeçalho)
    • Se for maior ou igual, nada será feito e seguirá
  • Fazer o autoajuste das colunas dos valores preenchidos da abaEstoqueAux
  • Armazenar na variável “resp” o que for resultante da conversão do texto em número (do tipo Integer, pela função CInt) de resposta da InputBox chamada, que vai perguntar “Qual formato de relatório você quer? Prévia de Impressão/Impressão/PDF [1/2/3] – Digite o número correspondente”
  • Usar de uma verificação através de uma estrutura If de comparação para ver se o valor da variável “resp” for:
    • Igual a 1, entende-se que o usuário escolheu a 1ª Opção: exibir a tela de prévia de impressão e imprimir por lá. Então:
      • Vamos esconder o formulário, através do comando Hide
      • Vamos mostrar uma prévia de impressão da abaEstoqueAux
      • Descarregar/fechar o formulário, com o comando Unload
    • Igual a 2, entende-se que o usuário escolheu a 2ª Opção: imprimir direto com as configurações padrão. Então:
      • Vamos imprimir a abaEstoqueAux
    • o Igual a 2, entende-se que o usuário escolheu a 3ª Opção: gerar um PDF. Então:
      • Vamos armazenar na variável “caminhoPDF” o caminho do arquivo, contendo pasta, nome e extensão, de onde queremos que fique o PDF salvo fique
      • Exportar a abaEstoqueAux como um formato do tipo PDF, com o nome do arquivo dado pela variável “caminhoPDF”, abrindo o arquivo após sua elaboração
    • Por boas prática, esvaziar as variáveis “abaEstoque” e “abaEstoqueAux” (Nothing) para que elas não fiquem armazenadas o tempo inteiro na memória do computador enquanto o arquivo está aberto no Excel
    • Se encerra o código

Nessa aula você lidou com:

Voltar para o índice

Aula 32 – Controle para Empresas – Imprimir Relatório de Compras

Hoje em Controle para Empresas Aula32 vamos finalizar a nossa série de controle com a impressão do relatório de compras!

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo!

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Essa é a trigésima segunda aula (Controle para Empresas Aula32) da nossa Série de Controle para Empresas. Nessa aula nós vamos continuar com as sugestões de vocês!

Nessa aula vamos verificar como imprimir relatório de compras, então vamos adicionar um botão de impressão para que o usuário possa informar qual o tipo de impressão quer fazer.

A ideia é acrescentar a impressão desse relatório de compras no VBA para deixar tudo completo.

O mais interessante é que vamos imprimir relatório por datas no VBA, então você vai poder selecionar um período específico para tirar seu relatório e imprimir.

Além da impressão de relatório no VBA nós vamos fazer um tratamento de erro no VBA para ajustar um possível erro no código que temos na parte da mensagem de impressão.

Para isso vamos utilizar o On Error GoTo para evitar que o nosso código fique travado nessa parte.

Aba de Impressão

Será necessária a criação de uma aba a parte, de Impressão.

Ela será a aba auxiliar para levar as informações de Compras, Vendas ou Caixa, para a futura impressão.

Adicionaremos essa aba simplesmente clicando no ícone de “+” ao lado do nome das abas, no canto inferior do arquivo em Excel.

Botão de Impressão no Formulário

Será necessária a criação de um botão para disparar o código que criaremos a seguir, que vai gerar a impressão das abas Vendas, Compras ou Caixa.

Vamos aproveitar os botões já criados para copiar e fazer as devidas alterações. Veja o resultado:

Controle para Empresas Aula32


Código para ativar o botão

Para criar um código dentro de um módulo, precisamos primeiramente abrir o ambiente de VBA, a partir do atalho do teclado Alt(+Fn)+F11. Assim poderemos de fato criar o nosso código a ser utilizado.

Como não temos nenhum módulo destinado ao tema da aula de hoje, e por questão de organização, vamos criar um módulo à parte. Vamos na guia Inserir > Módulo, e uma caixa branca se abrirá.
2

Mudaremos a sua propriedade name para “modImprimirRelatorioAba” e colocaremos a seguinte sub dentro dele, que será um objeto de estudo da aula de hoje:

Option Explicit

Sub imprimirRelatorioAba()

Dim aba As String
Dim dataIni As Date, dataFim As Date
Dim abaImpressao As Worksheet
Dim resp As Integer
Dim nomePDF As String, caminhoPDF As String

Set abaImpressao = ThisWorkbook.Worksheets("Impressao")

aba = LCase(InputBox("De qual aba você quer extrair o relatório? [Compras/Vendas/Caixa]"))

If aba <> "compras" And aba <> "vendas" And aba <> "caixa" Then Exit Sub

dataIni = CDate(InputBox("Digite a data de competência da primeira movimentação a ser analisada"))
dataFim = CDate(InputBox("Digite a data de competência da última movimentação a ser analisada"))

abaImpressao.UsedRange.Clear

If aba = "compras" Then
   Dim abaCompras As Worksheet
    Set abaCompras = ThisWorkbook.Worksheets("Compras")

    abaCompras.UsedRange.AutoFilter 3, ">=" & CDbl(dataIni), xlAnd, "<=" & CDbl(dataFim)

   abaCompras.Range("A1").CurrentRegion.Copy abaImpressao.Range("A1")

   abaCompras.AutoFilterMode = False

    abaImpressao.UsedRange.Columns.AutoFit

ElseIf aba = "vendas" Then
   Dim abaVendas As Worksheet
   Set abaVendas = ThisWorkbook.Worksheets("Vendas")

    abaVendas.UsedRange.AutoFilter 3, ">=" & CDbl(dataIni), xlAnd, "<=" & CDbl(dataFim)

   abaVendas.Range("A1").CurrentRegion.Copy abaImpressao.Range("A1")


    abaVendas.AutoFilterMode = False

    abaImpressao.UsedRange.Columns.AutoFit

Else

    Dim abaCaixa As Worksheet
  Set abaCaixa = ThisWorkbook.Worksheets("Caixa")

   abaCaixa.UsedRange.AutoFilter 3, ">=" & CDbl(dataIni), xlAnd, "<=" & CDbl(dataFim)


   abaCaixa.Range("A1").CurrentRegion.Copy abaImpressao.Range("A1")

    abaCaixa.AutoFilterMode = False

    abaImpressao.UsedRange.Columns.AutoFit

End If

On Error GoTo Fim
resp = CInt(InputBox("Qual formato de relatório você quer? Prévia de Impressão/Impressão/PDF [1/2/3] - Digite o número correspondente"))


If resp = 1 Then

    '1ª Opção: exibir a tela de prévia de impressão e imprimir por lá
   ControleDaEmpresa.Hide
   abaImpressao.PrintPreview
   Unload ControleDaEmpresa

ElseIf resp = 2 Then

    '2ª Opção: imprimir direto com as configurações padrão
   abaImpressao.PrintOut

ElseIf resp = 3 Then

    '3ª Opção: gerar um PDF
   nomePDF = Replace("Relatório de " & StrConv(aba, vbProperCase) & " - " & dataIni & " a " & dataFim & ".pdf", "/", "-")
   caminhoPDF = "C:UsersdamorOneDriveÁrea de Trabalho" & nomePDF
   abaImpressao.ExportAsFixedFormat Type:=xlTypePDF, Filename:=caminhoPDF, OpenAfterPublish:=True

End If

Fim:
End Sub

Explicação do código acima:

  • A primeira linha diz que que todas as variáveis utilizadas no código serão obrigatoriamente declaradas. Observe que isso é algo que é colocado fora da estrutura das nossas subs.
  • Vamos dimensionar:
    • a variável “aba” como como uma String (texto)
    • as variáveis “dataIni” e “dataFim” como Date (data)
    • a variável “abaImpressao” como uma Worksheet (planilha)
    • a variável “resp” como um Integer (número inteiro de módulo até 32.767)
    • As variáveis “nomePDF” e “caminhoPDF” como String (texto)
    • Para entender melhor sobre os tipos de dados no VBA, visite esse link oficial
  • Vamos configurar a variável abaImpressao para representar um objeto inteiro, que será nesse caso a aba do nosso arquivo em Excel “Impressao” (criada no começo da aula)
  • Armazenar na variável “aba” o que for resultante da resposta dada pelo usuário na InputBox, convertido para todas as letras em minúsculo pela função LCase
  • Fazer uma verificação através de uma estrutura If, e se a variável “resp” contiver algo diferente de “compras”, “vendas” ou “caixa”. Caso haja, o código será abortado
  • Armazenar na variável “dataIni” o que for resultante da resposta dada pelo usuário na InputBox, convertida para uma data pela função CDate
  • Armazenar na variável “dataFim” o que for resultante da resposta dada pelo usuário na InputBox, convertida para uma data pela função CDate
  • Fazer uma limpeza (clear, em inglês) na “abaImpressao”, para receber os novos dados, garantindo que ela estará sempre limpa antes de entrarem novos dados a serem impressos
  • Fazer uma verificação através de uma estrutura If para ver em qual aba faremos a busca de dados para alimentar a aba de Impressao. Caso seja a:
    • Aba Compras:
      • Vamos dimensionar uma variável chamada abaCompras como um objeto
      • Vamos configurar a variável abaCompras para representar um objeto inteiro, que será nesse caso a aba do nosso arquivo em Excel “Compras”
      • Olhar para o intervalo de células preenchidas a partir da célula A1 da abaCompras, e fazer um filtro a partir da 3ª coluna. O filtro será feito considerando as datas iguais ou posteriores à “dataIni” e iguais ou anteriores à “dataFim”
      • Após o filtro feito, copiar os dados resultantes do filtro
      • Colar os dados filtrados da análise desejada na célula A1 da abaImpressao
      • Retirar o filtro aplicado na abaCompras
      • Fazer o autoajuste de colunas na abaImpressao, para preparar os dados para serem impressos com tudo “aparecendo” e nada oculto
    • Aba Vendas:
      • Vamos dimensionar uma variável chamada abaVendas como um objeto
      • Vamos configurar a variável abaVendas para representar um objeto inteiro, que será nesse caso a aba do nosso arquivo em Excel “Vendas”
      • Olhar para o intervalo de células preenchidas a partir da célula A1 da abaVendas, e fazer um filtro a partir da 3ª coluna. O filtro será feito considerando as datas iguais ou posteriores à “dataIni” e iguais ou anteriores à “dataFim”
      • Após o filtro feito, copiar os dados resultantes do filtro
      • Colar os dados filtrados da análise desejada na célula A1 da abaImpressao
      • Retirar o filtro aplicado na abaVendas
      • Fazer o autoajuste de colunas na abaImpressao, para preparar os dados para serem impressos com tudo “aparecendo” e nada oculto
  • Aba Caixa:
    • Vamos dimensionar uma variável chamada abaCaixa como um objeto
    • Vamos configurar a variável abaCaixa para representar um objeto inteiro, que será nesse caso a aba do nosso arquivo em Excel “Caixa”
    • Olhar para o intervalo de células preenchidas a partir da célula A1 da abaCaixa, e fazer um filtro a partir da 3ª coluna. O filtro será feito considerando as datas iguais ou posteriores à “dataIni” e iguais ou anteriores à “dataFim”
    • Após o filtro feito, copiar os dados resultantes do filtro
    • Colar os dados filtrados da análise desejada na célula A1 da abaImpressao
    • Retirar o filtro aplicado na abaCaixa
    • Fazer o autoajuste de colunas na abaImpressao, para preparar os dados para serem impressos com tudo “aparecendo” e nada oculto
  • Usar uma estrutura de verificação/tratamento de erros (On Error GoTo) para, se algo digitado a seguir for diferente do esperado (1,2,3), ir para o final do código e não fazer nada referente à impressão que programamos.
  • Armazenar na variável “resp” o que for resultante da conversão do texto em número (do tipo Integer, pela função CInt) de resposta da InputBox chamada, que vai perguntar “Qual formato de relatório você quer? Prévia de Impressão/Impressão/PDF [1/2/3] – Digite o número correspondente”
  • Usar de uma verificação através de uma estrutura If de comparação para ver se o valor da variável “resp” for:
    • Igual a 1, entende-se que o usuário escolheu a 1ª Opção: exibir a tela de prévia de impressão e imprimir por lá. Então:
      • Vamos esconder o formulário, através do comando Hide
      • Vamos mostrar uma prévia de impressão da abaImpressao
      • Descarregar/fechar o formulário, com o comando Unload
    • Igual a 2, entende-se que o usuário escolheu a 2ª Opção: imprimir direto com as configurações padrão. Então:
      • Vamos imprimir a abaImpressao
    • o Igual a 2, entende-se que o usuário escolheu a 3ª Opção: gerar um PDF. Então:
      • Vamos armazenar na variável “caminhoPDF” o que for resultante da substituição (função Replace) de “-“ por “/” no texto: “Relatório de ” & StrConv(aba, vbProperCase) & ” – ” & dataIni & ” a ” & dataFim & “.pdf”. Isso vai nos resultar em algo como: “Relatório de Compras – DD-MM-AAAA a DD-MM-AAAA.pdf”. Além da substituição, vamos usar a função StrConv para colocar a aba digitada com a 1ª letra em maiúsculo.
      • Vamos armazenar na variável “caminhoPDF” o caminho do arquivo, contendo a pasta de onde queremos que fique o PDF salvo, e o texto resultante da variável “nomePDF”
      • Exportar a abaImpressao como um formato do tipo PDF, com o nome do arquivo dado pela variável “caminhoPDF”, abrindo o arquivo após sua elaboração
    • Se encerra o código

Acessando os códigos do formulário

Para fazer alterações no nosso formulário já criado, precisamos primeiramente abrir o ambiente de VBA, a partir do atalho do teclado Alt(+Fn)+F11. Assim poderemos continuar o nosso formulário de controle da empresa.

Mais uma vez lembrando que, para abrir o código do nosso formulário de interesse, devemos ir com o botão direito no formulário ControleDaEmpresa > exibir código.

Controle para Empresas Aula32
Controle para Empresas Aula32

Macros a serem alteradas dentro do formulário:

Private Sub btImpressaoMenu_Click()

Call imprimirRelatorioAba

End Sub

Explicação do código acima:

  • Essa macro vai ser acionada com o clique do botão de Impressão, na aba inicial do formulário
  • Vai chamar a macro imprimirRelatorioAba, explicada anteriormente, para fazer a impressão de Compras, Vendas ou Caixa
  • Se encerra o código

Nessa aula (Controle para Empresas Aula32) você lidou com:

Voltar para o índice

Sistema de Controle para Empresas em VBA

Hoje eu quero apresentar o Sistema de Controle para Empresas em VBA para você ter um controle completo na sua empresa!

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo!

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Fala, Impressionadores! Hoje queremos apresentar para você o Sistema de Controle para Empresas em VBA que construímos ao longo dessa série.

Foi uma série bem completa para construir do zero um formulário em VBA com tudo o que você precisa para fazer o controle da sua empresa.

Então você vai verificar a parte compras, vendas, estoque, caixa, DRE e até mesmo a parte de impressão dessas informações de forma automática.

Esse formulário para controle de empresas em VBA é uma excelente maneira de fazer esse controle principalmente para quem não tem conhecimento em Excel.

Pois ao usar o formulário em VBA você deixa todos os comandos e ações muito mais fáceis de utilizar, então o usuário final não vai ter problemas em utilizar esse sistema.

Agora bora pra aula que eu quero te mostrar esse controle completo para empresas em VBA!

Menu

Abaixo temos o nosso menu de botões, que vai acessar as “páginas” que preparamos, com funções específicas: Compras, Vendas, Estoque, Caixa, DRE.

De bônus temos um botão a parte para fazer a Impressão de algumas abas específicas: Compras, Vendas ou Caixa. Veja abaixo:

1 1

Compras

A página de compras vai nos proporcionar cadastrar e ter uma lista de produtos que pretendemos comprar ou de fato compramos de diversos fornecedores.

Nela teremos ID do produto, Data de Pagamento, Data de Competência, Fornecedor (nome), Produto (nome), Quantidade, Custo Total, Conta e Status.
2 1

Controlando as compras, saberemos as quantidades que já temos compradas, histórico, fornecedores mais frequentes, por exemplo.

Vendas

A página de vendas vai nos proporcionar cadastrar e ter uma lista de produtos que vendemos para diversos clientes.

Nela teremos ID do produto, Data de Pagamento, Data de Competência, Cliente (nome), Produto (nome), Quantidade, Valor de Venda, Conta, Status, Custo Unitário e Custo da Venda.
3 1

Controlando as vendas, saberemos as quantidades que já temos vendidas, histórico dessas operações, clientes mais frequentes, por exemplo.

Estoque

A página de estoque vai nos proporcionar o resumo entre as operações de compra e venda das páginas anteriores, onde cadastramos essas compras e vendas, respectivamente.

Nela teremos o resumo de cada produto individualmente: quantidade comprada, vendida, e o que ficou em estoque daquele produto específico após essas operações. Além disso, temos o estoque mínimo por produto.
4

Importantíssimo controle da empresa, para poder fazer futuras vendas, futuras compras e controlar o estoque perante os fornecedores e clientes. Suporta a decisão de quando comprar, se pode vender e a quantidade que pode vender.

Caixa

A página do caixa vai conter todas as movimentações feitas na nossa planilha/sistema. Todo registro de vendas e compras, além de algumas despesas do dia a dia da sua empresa.

Assim, tem em um local, tudo que aconteceu na sua empresa.

Sistema de Controle para Empresas

DRE

A página da DRE (Demonstração do Resultado de Exercício) vai conter um resumo-resultado contendo o que sua empresa gastou e recebeu proveniente das atividades da empresa.

Assim, representa um resultado final das operações da sua empresa.

Você tem a opção de fazer o levantamento do DRE por Ano, deixando o Mês em branco, ou preenchendo Ano e Mês.

Te dará, ao final do processo, o lucro/prejuízo líquido das atividades. Observe como é composto:

Sistema de Controle para Empresas

Voltar para o índice

Conclusão – Sistema de Controle para Empresas

É isso mesmo que você está vendo! Estamos disponibilizando para os alunos de forma gratuita um sistema completo para fazer controle de sua empresa!

Poderá controlar facilmente suas compras, vendas, estoque, caixa e DRE!

Então é um sistema que fica muito fácil de utilizar, e já tem uma cara de sistema. Isso quer dizer que mesmo que você forneça o sistema para quem não sabe nada de Excel vai ser muito fácil e intuitivo de usar.

Até o próximo post, pessoal! Fique ligado no nosso canal do YouTube para mais conteúdo de Excel e VBA toda semana! Um abraço,

Hashtag Treinamentos

Para acessar outras publicações de VBA, clique aqui!


Quer aprender mais sobre VBA com um minicurso básico gratuito?

Quer ter acesso a um Minicurso de Finanças no Excel de forma 100% gratuita? Preencha seu e-mail abaixo!