260 - Excel VBA - Criar relatórios com distribuição de registros da planilha

260 - Excel VBA - Criar relatórios com distribuição de registros da planilha Olá seja bem-vindo a mais uma aula do meu canal de vídeos YouTube Meu nome é Alexandro trovato e na aula de hoje vamos falar sobre VBA mais uma vez Dessa vez vou tirar a dúvida de um aluno que mandou mensagem num grupo específico no grupo do telegram que eu tenho e a dúvida dele era justamente como fazer a distribuição de valores utilizando VBA eu vou mostrar a planilha vou mostrar qual é a técnica que eu vou ensinar nesse cóigo para que você já possa ver a partir de uma lista única de valores de funcionários os valores inclusive foram anonimizados aqui para evitar qualquer.

260 - Excel VBA - Criar relatórios com distribuição de registros da planilha

Identificação nós vamos transferir isso seguindo um critério e você vai perceber como o código É bem interessante Então a dúvida está respondida o aluno é o cesanildo então ele vai agora aprender junto com você como fazer a ação de transferir registros com critérios criando o relatório no Excel Aqui está a planilha que nós vamos utilizar Observe ele tem uma lista de funcionários com ano mês a matrícula de cada funcionário o nome dele o código do evento da folha.

O prazo e o valor do evento esses valores são aleatórios eu anonimizar a identificação a primeira coisa que nós temos que fazer quando vamos criar relatórios e o que basicamente vamos fazer nesse código é segmentar dessa forma os elementos então por exemplo eu tenho três linhas para o silvi Né o funcionário silvi quando termina e muda o funcionário automaticamente o cabeçário tem que ser colocado aqui na lista para que eu possa.

Trazer os dados deste funcionário para cá também trocou o funcionário novamente Então nós vamos ter que colocar o título e depois copiar os registros daquele funcionário e isso para todos eles a macro que eu criei faz Exatamente isso de forma automática veja só vou clicar so sobre o botão executar e vou aguardar o que a macro está fazendo Está percorrendo toda a minha lista de valores na planilha original o cesanildo me mandou mais de 3.800 registros então a macro vai percorrer cada uma delas.

Verificar se há diferenças entre o nome do funcionário ou não e vai montar o meu relatório como você pode perceber eu desativei a atualização de tela para que nós não ficássemos vendo os refreshes e na sequência quando ele terminar de executar esse código ele vai mostrar uma mensagem pro usuário e na sequência O resultado vai aparecer aqui nas colunas J em diante um detalhe importante desse código É que eu usei de uma forma bem didática a uma maneira mais eficiente de.

Menos eficiente de fazer isso pois eu percorro linha a linha existem formas mais eficientes como por exemplo utilizar objetos de memória para facilitar com que os registros sejam percorridos de forma mais rápida o código concluiu agora quando ele terminar de executar ele vai liberar uma mensagem usuário informando que o código terminou a minha máquina ela tá com algum probleminha na na exibição dessa mensagem final por isso o código já terminou mas ele ainda não alertou vou fazer uma pausa ele liberou automaticamente assim.

Que eu fiz a interrupção da gravação Então tudo bem Quando eu der um ok no processo concluído Observe ele gerou cada grupinho Deste aqui é um funcionário separado por um título fazendo então aquilo que o cesanildo precisa só tem um detalhe muito importante nesse processo para que isso funcione os dados TM que estar classificados e o agrupamento ele é essencial quando você precisa fazer esse tipo de distribuição se eu tivesse colocado funcionários aqui em ordens aleatórias sem que eles estivessem agrupados por exemplo pelo seu número de.

Matrícula e depois em ordem de mês essa listagem sairia completamente bagunçada porque a cada troca de nome de funcionário ele colocaria em uma ordem diferente como você pode perceber aqui tem 1000 registros e eu posso até diminuir um pouco mais esse registros para que a nossa ação e a nossa execução funcione mais rápido eu não vou fornecer essa planilha não há possibilidade de fazer download dela você pode construir uma planilha similar a essa com dados aleatórios ou usando dados da sua.

Empresa e a rotina eu estou fazendo com que essa esse direcionamento ocorra para a mesma planilha de onde os dados estão Mas você pode criar uma variação de código e adicionar o resultado para uma planilha complementar adapte o código às suas necessidades Então vamos começar eu vou clicar aqui em desenvolvedor e nós vamos inserir um botão aqui na parte de baixo e é esse botão que eu vou utilizar para fazer com que o código seja executado o.

Nome desse botão vai ser BT abreviação de Botão Executar a propriedade caption que é o texto que aparece para usuário eu vou colocar aqui executar relatório ou criar relatório e aqui dá para você fazer muitas alterações no código dá para programar a área de impressão dá para ajustar preenchendo os títulos com alguma cor usando a propriedade color index que nós usamos anteriormente em outra aula então você pode fazer várias modificações diferentes para que o.

Resultado seja o melhor possível vou começar clicando duas vezes sobre o botão criar relatório e abrindo o VBA nessa rotina do VBA que nós vamos criar eu vou conseguir fazer o uso do código ele abriu aqui no meu segundo monitor vamos lá eu vou conseguir então criar esse meu código clicando duas vezes uma subrotina vai ser desenvolvida para o nosso botão executar eu vou começar essa nossa macro criando dentro dessa Nossa desse nosso código as.

Variáveis então Vamos definir as variáveis eu estou tentando digitar devagar para o som não vazar no microfone mas eu gosto muito desse som do teclado nas minhas gravações Então me perdoem mas eu vou continuar usando esta este teclado pois esse barulhinho de fundo ele é muito agradável aí nesse caso gosto bastante vamos começar usando o application P screenupdating ig a false lembre-se que o application ele faz o desligamento da atualização de.

Veja Mais Aqui:

    $ads={1}

    Tela e logo na sequência eu já vou colocar a propriedade true no final para que ele possa Executar a atualização da

    Tela novamente um do para que ele possa executar qualquer ação de atualização de tela que tenha pendente e uma message box de processo concluído essa rotina ela simplesmente vai executar esse código né quando terminar a nossa rotina que nós vamos escrever na parte superior da tela din É o comando para dimensionamento de.

    Variáveis a primeira vai ser a variável w do tipo worksheet nós vamos manipular a nossa planilha com essa variável w vou criar aqui um Array uma variável especial para que possamos armazenar os nossos itens de cabeçário ela vai ter vai ser uma variável de seis posições onde nós vamos guardar os títulos das seis colunas que possuem dados se eu alternar pra nossa planilha Vamos pensar.

    Na ação como eu quero duplicar o meu cabeçário a cada funcionário eu vou precisar ter um objeto que armazene esse cabeçalho ou eu posso vir e colá-lo a qualquer momento a partir desta célula eu preferi criar um objeto de memória adicionar os valores desse cabeçário esse objeto de memória por isso a nossa variável do tipo Array cabeçário que vai do número um do índice um até a posição número seis última Cell vai ser a minha.

    Variável do tipo Range para mapear a última célula com registros a minha variável a vai ser do tipo integer Pois ela vai ser usada no controle de loop que você vai ver o for para preenchimento justamente do cabeçário nós vamos usar uma variável chamada linha do tipo long porque eu não sei quantas linhas que a sua planilha pode ter você pode fazer isso 100.000 200.000 vezes então a variável lin não pode ser do tipo integer ela tem que ser do tipo long para poder dar conta do que vai ser.

    Necessário basicamente nós vamos percorrer linha a linha dessa nossa fonte de dados por isso eu preciso desta variável que vai controlar a linha dos registros principais temos uma outra variável chamada LN destino que é do tipo long também que é a variável que vai medir a linha da posição onde eu estou copiando e colando os meus registros no nosso código quando eu faço a cópia de uma linha dos dados de um.

    Funcionário eu copio e na sequência colo aqui nesta região de destino por isso eu preciso saber qual é a linha exata da minha região de destino que eu preciso fazer a cópia acabei pressionando a tecla de atalho errado Ele abriu uma planilha de macros não há problema então é só pressionar Alt f11 de novo eu vou criar uma variável chamada Call do tipo integer para que eu possa Navegar pelas Colunas da minha planilha e uma variável chamada Call destino para fazer a mesma coisa eu vou precisar percorrer as colunas dos nossos.

    Dados basicamente eu tenho uma coluna de onde está a informação original e eu tenho uma coluna para onde eu quero gravar os nossos dados se eu pegar essa coluna quiser mudar no futuro eu posso fazer isso através da numeração desta variável qual destina uma vez declaradas as variáveis nós podemos inicializar as variáveis e nós vamos inicializar primeira a variável w setw igual a nossa sheets.

    Resultado se você observar eu tenho esta minha planilha chamada de resultado e é aqui que nós vamos trabalhar eu vou copiar os dados e colar nesta região da coluna J na sequência eu vou usar a minha variável última Cell e vou mapá também usando a técnica de w. cells eu quero manipular a quantidade de células da minha planilha w.r. count esse resultado esse instrução.

    Retorna 1.576 vírgula coluna 1 XL para quem não lembra ou há muito tempo não assiste as minhas aulas de VBA Esse comando faz isto aqui é como se eu posicionasse o meu cursor aqui na linha 8.576 da coluna 1 coluna A aquele comando end entre parênteses XL app nada mais é do que o control setinha para cima e ele vai sempre parar na última célula preenchida com os dados então.

    Pode ser uma planilha de 10 reg como uma planilha de dois registros eu sempre vou conseguir mapear a última célula

    Corretamente a nossa coluna original dos dados de origem vai ser igual a um a nossa linha vai ser igual a 1 a coluna de destino vai ser igual a coluna 10 e a linha de destino vai ser igual a linha 1 nós vamos começar a nossa rotina pegando o cabeçalho que está aqui e colocando esse.

    Cabeçalho na coluna 10 coluna 6 F 7 8 9 10 então coluna 10 é a coluna J por isso mapeei esta minha instrução agora nós vamos fazer a limpeza dos resultados Então vou limpar extração anterior se eu já tiver executado o meu código já vai estar mostrando aqui para a nossa planilha como eu troquei de teclado recentemente ele a tecla control está meio fora de posição por isso que eu estou apertando a tecla errada Então como você pode.

    Perceber lá no nosso comando se eu já fiz a extração anterior ele já colocou dados aqui nas minhas colunas Então eu preciso limpá-los por isso eu vou usar o comando w. Range vou pegar da coluna J até a coluna z p entire colum p delete ao invés de percorrer as células e limpar uma a uma eu vou deletar as colunas que é um processo muito mais rápido e eficiente Agora eu preciso criar uma rotina para ler o cabe Então vou ler o cabeçalho atual e.

    Armazenar os valores no Array na nossa variável cabeçário para isso eu vou usar a instrução for for a É iG a 1 6 eu vou pedir para que esse for ele Execute seis vezes para que cada vez ele capture um trecho do meu cabeçário como a minha linha 1 e a coluna 1 se refere a cé 1 eu vou então capturar o título ano mês folha para fazer isso nós vamos usar a.

    Variável cabeçalho vou passar a posição da memória que é o a e vou pedir para que ele armazene o valor da minha célula da linha e da coluna atual no próximo ciclo do for se eu manter o o comando deste jeito ele vai copiar o mesmo valor da célula um por isso eu tenho que pegar a minha variável Call e e adicionar mais um para que no segundo ciclo do for ele consiga pegar a coluna B depois a coluna C coluna d e e f Vamos fazer uma experiência eu vou.

    Clicar em editar ah ou melhor deixa pegar aqui uma nós vamos exibir a janela de inspeção de variáveis e eu vou arrastar a nossa variável cabeçário para cá você está vendo que ela está vazia se eu executar o nosso código pressionando F8 ela foi criada já se eu pressionar aqui o F8 você vai ver que ao expandir a expressão que eu tenho a posição 1 2 3 4 5 e 6 que é o índice dessa minha variável do tipo Array e ela está em branco.

    Ainda após mapear as variáveis Observe limpou o conteúdo e no primeiro ciclo dos do for o cabeçário da posição um vai ser igual ao qu ano mês folha incremento um coluna e vou capturar agora o segundo valor que é matrícula repare na inspeção de variáveis como ele vai conseguindo pegar corretamente cada título da nossa coluna como eu é um objeto de memória eu não preciso mais me preocupar e manipular esse resultado o valor dessa vari ela.

    Vai fic ela vai existir enquanto o meu código es executando com isso eu consigo replicar esse cabeçário quantas vezes forem necessários dentro do meu código só que agora que nós manipulamos a coluna nós incrementamos um a cada ciclo eu não tenho mais a coluna um como referência por isso eu preciso redefinir os valores das variáveis de controle nesse caso qual variável que eu alterei a minha variável Call vai voltar.

    A ter o valor 1 e agora a minha variável vai ser da linha do a minha coluna de destino vai continuar sendo a 10 porque ela já está definida lá e a minha linha de destino a um eu não preciso incas por enquanto agora está na hora de criar a nossa rotina de repetição para fazer a separação dos valores É nesse ponto que nós vamos usar a instrução do while faça enquanto a minha variável LN ou seja minha linha atual seja menor ou igual a minha linha.

    Da última célula loop e aqui dentro nós vamos criar a nossa instrução de repetição Vamos então começar a nossa estrutura como eu vou percorrer cada linha desta aqui eu tenho que colocar os títulos aqui em cima então eu já vou começar colocando o primeiro título que é igual o anterior que nós temos nas colunas de A até F for a ig a 1 se então eu vou fazer de novo um ciclo com o for de seis vezes para.

    Poder escrever você deve ter visto nas aulas de VBA que eu tenho no meu canal que a instrução with ela permite economizar digitação ela permite estruturar melhor os nossos comandos então agora nós vamos manipular aqui a nossa variável de linha de destino e Call destino para que a nossa célula de destino ela receba o que eu preciso os valores que eu preciso então o ponto value que é a propriedade de valor da célula vai ser igual ao cabeçário que é minha variável do array da posição a que.

    Está sendo dado pelo for e eu vou pegar a minha fonte pon bold ig a true eu vou definir que quero a minha fonte do cabeçalho como feito isso eu posso então agora aqui debaixo do Wind Wi colocar o comando Call destino é igual a call destino mais 1 porque lembre-se como eu tenho seis títulos de coluna eu preciso fazer essa ação seis vezes trocando o número da coluna logo no término desse.

    For eu já tenho que pegar a minha variável Call destino e volt para o valor 10 para que sempre no meu ciclo ele vá colocar o próximo registro na coluna 10 se nós não fizermos isso ele vai sempre colocar os seis valores aqui do título depois ele vai começar mais se mais se e vai criar uma escada de valores que não é o que nós queremos perfeito vamos ver se isso aqui está certo então eu eu vou agora pegar esse nosso incremento veja que se eu.

    Executar agora eu vou criar um Loop Infinito por causa dessa nossa variável eu vou colocar um ponto de parada aqui e agora vou executar o meu código pressionando F5 uma vez repare que ele fez toda a estrutura do do do e do Wi e já colocou os títulos que eu precisava na parte superior Quanto que vale a minha linha ela vale dois se eu der um F8 veja só a linha é menor do que a última célula é então ele vai fazer de novo e de novo e de novo então ele vai criar uma.

    Estrutura de repetição infinita não posso deixá-lo fazer isso por isso eu vou interromper o meu código mas já Vimos que ele está conseguindo reproduzir corretamente o cabeçário aqui nas minhas colunas de J até a coluna o como eu interrompi o meu código eu não consigo clicar mais na tela e ver as atualizações por isso é importante você na janela de verificação imediata digitar o application P screen update igual a true dessa forma você retoma o controle da sua tela e pode fazer as alterações necessárias vamos lá Esse.

    Comando de cima lembre-se ele apaga os resultados anteriores Então não preciso me preocupar com o que foi escrito lá como eu já fiz o uso de uma linha para o título eu preciso incrementar a nossa variável de destino veja só linha de destino é igual a linha de destino mais 1 e a partir desse ponto eu já consigo começar a analisar os meus códigos como eu já fiz a inserção e a minha linha é a linha dois significa que.

    Eu tenho que transferir esse funcionário para lá como ele é o primeiro funcionário eu posso usar o comando que eu quero já de transferência wcs lnc P resize linha vale dois Call vale um é como se nós estivéssemos aqui com o curso na célula A2 e ele vai dar um resize que é selecionar seis células a partir desse ponto por isso que o.

    Comando resize é interessante vou usar o comando então aqui ponto resize 1 V6 Porque a partir da célula atual ele vai pular seis colunas para o lado Ponto select eu vou clicar sobre essa linha e vou pressionar cont F8 Olha o que acontece quando eu der um F8 aqui você vai ver que ele selecionou essa linha eu vou tirar a seleção e vou voltar o meu ponto de depuração para trás repare aqui na tela vou pressionar F8 e ele.

    Selecionou então até onde eu queria Como eu já fiz o resize então aqui eu selecionei os dados para copiar o que eu preciso fazer usar o comando de cópia selection como eu tenho uma seleção feita eu posso usar o comando selection selection P copy espacinho Destination Então agora eu já vou dizer aonde eu quero colar wcs linha de destino que vale 2 vírgula Call de destino que vale 10 só isso LN igual a LN + 1 porque eu tenho.

    Que pular para a próxima linha e vou dizer que a linha de destino é igual a linha de destino mais um também olha que interessante esse código eu vou colocar Break Point aqui e vou executar o meu código nesse ponto ele já colocou o título ele já selecionou os dados Então veja só F8 selecionou a linha de baixo selection P copy ele acabou de copiar o que está selecionado para a coluna 10.

    Então aqui estão as seis células com os dados F8 para a próxima linha F8 para que a linha de destino Agora seja linha três na próxima colagem o que que ele vai fazer ele vai colar os dados aqui embaixo Então vou dar um loop ele vai começar de novo a linha 3 é menor do que a última célula é então o que que ele vai fazer ele vai trazer o título para cá Mas aqui tem um problema né eu não posso colocar a linha de título para cada linha do funcionário o.

    Meu código ainda não terminou nós temos que fazer então com que essa nossa rotina ela percorra o mesmo até mudar é onde Nós entramos com a estrutura de repetição do novamente então aqui nesse dile eu vou pedir para que ele faça enquanto wcs a linha atual virg Call mais 1 pon value seja igual a wcs linha men1 que é a linha de cima vía.

    Qu mais 1 Ok nessa instrução específica eu estou falando para ele olha vamos puxar aqui um pouquinho para o lado eu estou dizendo que enquanto esta matrícula for igual a de cima a matrícula atual ela é dada por esse comando da linha e da coluna mais um lembre-se coluna vale um esse mais um faz com que ele Olhe Pra matrícula Então quando eu dou um LN né que é minha variável de linha men1 Ele olha pra linha de cima E se for igual o que que eu quero que.

    Ele faça que ele continue copiando os dados por isso eu vou usar o comando wcs LN Call P resize 1,6 select selection copy Destination o comando exatamente igual de cima dois pontos igual wcs LN destino Porque nós já Inc amos e o Call destino também LN destino é igual a LN destino.

    Mais um para que ele possa copiar o próximo na linha de baixo e a linha do registro que eu vou percorrer também tem que ser incrementada e eu posso falar que o nosso código está pronto só esse código já é o suficiente para fazer com que os dados sejam preenchidos adequadamente eu vou fechar eu vou Minimizar aqui na verdade e vamos executar esse código no modo de depuração Veja só eu vou trazer para cá vou colocar o meu cursor aqui nesse doile e vou pressionar o executar você vai ver que a primeira.

    Linha Foi copiada porque ele fez isso aqui na parte superior ele está perguntando o valor desta célula lembre-se que agora nós estamos na linha três ó o valor da coluna 2 da linha 3 é igual ao valor da coluna 2 da linha 2 é então o que que ele faz ele já vai selecionar os dados da linha TR vai colar na linha de destino incrementando mais um para cada aí ele verifica de novo Agora nós.

    Estamos na linha 4 a matrícula da linha 4ro é igual a matrícula da linha 3 Sim então ele seleciona copia e vai de novo nesse agora caso na linha C ele tá perguntando 00777 É iG a 027 483 não então ele pula ele sai desse loop e volta pro loop anterior a linha c é menor que a última célula é então o que que ele vai fazer aqui lembre-se que ele coloca o cabeçário olha o que acontece aqui eu.

    Vou dar um F8 e ele vai preencher o cabeçário com todas as seis células aqui lembre-se esse não é o método mais eficiente mas didaticamente é o mais fácil de entender defino a minha variável como coluna 10 a linha agora de destino é a lha mais um que é a linha 6 ele vai fazer tudo de novo ó ele vai copiar os dados do primeira linha do orak e ele vai fazendo ISO Enquanto houver o mesmo nome Olha que interessante eu vou clicar neste loop vou pressionar cont F8 a cada vez que eu.

    Pressiono cont control F8 o ciclo completo de um funcionário é feito repare cont contr F8 cont F8 cont F8 então está pronto ele está percorrendo as minhas células antes de terminar que que nós vamos fazer depois que ele terminar esse loop nós vamos formatar o resultado eu vou pegar aqui o comando w Range de J até Z entire Fit Esse comando é exatamente o mesmo de.

    AVISO LEGAL: Toda a responsabilidade do conteúdo deste vídeo transcrito é do produtor do canal.
    CLique no Link do Vídeo: https://www.youtube.com/watch?v=YRWW2ruXc40
Wesdigital

Postar um comentário

Postagem Anterior Próxima Postagem