Muito show essa aula prof. Trovato, formidavel como o sr. consegue nos repassar a linguagem VBA de forma facil e descomplicada. Grato pelo sr. compartilhar seu conhecimento conosco. Att, Gledson
Grato pela mensagem Wallace! Fico feliz que tenha gostado da aula. Realmente tive que queimar alguns neurônios para montar uma estrutura enxuta. Até a próxima!
Excelente Aula Alessandro. Para esse método funcionar corretamente, as rotas terão de estar ordenadas. Não pode ter por exemplo não pode ter rota 1,2,3,2,4,5,3....
Boa tarde Alessandro, primeiramente quero parabenizar pelas ótimas aulas, desenvolvi muita macro VBA no meu trabalho aprendendo com suas aulas. Queria que me tira-se uma dúvida, pois não achei em lugar algum o código onde em uma planilha filtrada, e minha célula ativa está na primeira linha, ou seja o cabeçalho, quero que meu cursor desça a próxima linha visível, utilizando o comando activecell.offset, ele desce para uma célula não visível. A única maneira que conseguimos para resolver esse problema, foi fazendo um do do while, offset.set. queria saber se existe uma maneira mais simples. abs.
Amigo tudo bem? Poderia me ajudar? Quero somar entre um intervalo de datas ou apenas uma data da minha listbox apenas os valores correspondente a Palavra Dinheiro(coluna E) valor(F), ou seja, ele tem que somar apenas os valores correspondente a Dinheiro dentro desta data. Se dentro do intervalo de data escolhido aparece 3 valores que foram pagos em Dinheiro, preciso que ele some estes valores dentro de uma textbox. Eu sei que deve usar a função soma-se, mas não estou conseguindo colocar os critérios, ou também se houver outra forma de fazer isso. Minha Listbox exibi os pagamentos lançados durante o dia dos meus clientes. Tenho textbox de pesquisa de datas inicial e final, e ele exibi os clientes, a forma de pagamento, o valor bruto, o valor líquido, seja em Dinheiro, débito, crédito ou PIX. Consegui apenas quando eu defino uma data inicial ele me mostra o total em reais da coluna valor bruto e valor líquido. Mas preciso somar separadamente nesta pesquisa os valor em Dinheiro, débito, crédito e PIX em uma textbox para cada. Ficando assim na tela como um fechamento de caixa. Poderia me ajudar?
aula muito boa, mas gostaria que vossa maestria recaptulasse tudo isso, mas ao invés de contar elementos repetidos pós o outro em uma mesma coluna, contasse elementos repetidos aleatoriamente nessa mesma coluna.
Bom demais, excel é meu Hobby. Refiz o código pensando em fazer a mesma coisa com um código diferente e que fizesse mesmo que as rotas não estivessem ordenadas de "A a Z". O código fica um pouco problemático quando colamos aqui mas... o que vale é partilhar o conhecimento adquirido. Public Sub distribuicao() Dim sRota As String ' Variável para armazenar a rota analisada Dim i As Integer 'Variável para o for Dim j As Integer 'Variável para o for Dim lFor As Integer 'Variável para limitar o primeiro for Dim lLin As Integer 'Variável que servirá como parâmetro para localização das ' células avaliadas Dim lCol As Integer 'Variável que servirá como parametro para localização das 'células avaliadas Dim Ativo As Integer 'Variável que servirar para inserir os títulos na planilha PColar Dim dCronometro As Date 'Variável que irá armazenar o tempo de execução da macro Application.ScreenUpdating = False lLin = 1 lCol = 2 Ativo = 1 dCronometro = Now '#### Note que para o processo foram utilizados os nomes VBA's das planilhas que 'são: ''Pbase e PColar PColar.Range("A1").CurrentRegion.Clear 'Limpa a planilha que irá colar os dados posteriormente PBase.Range("A:A").Copy 'Copia a coluna que contém as rotas da planilha PBase PColar.Range("A:A").PasteSpecial xlPasteAll 'Cola os valores copiados na planilha PColar Application.CutCopyMode = False 'Exclui da area de transferência os valores copiados PColar.Range("A:A").RemoveDuplicates Columns:=1, Header:=xlYes 'Remove da planilha PColar os valores duplicados PColar.Range("A1").Select lFor = PColar.Cells(PColar.Rows.Count, 1).End(xlUp).Row 'Atribui o número da linha da ultima rota For i = 2 To lFor Step 1 sRota = PColar.Cells(i, 1).Value 'Atribui a variável o valor da primeira rota a ser analisado Do While PBase.Cells(lLin, 1) "" 'Irá percorer a coluna 1 da PBase enquanto ela tiver valores If PBase.Cells(lLin, 1).Value = sRota Then 'Se o valor percorrido for igual a variavel sRota Do While PColar.Cells(i, lCol) "" ' lCol = lCol + 1 'Esse Do While é para encontrar a proxima coluna a inserir o valor If Ativo < lCol Then Ativo = lCol 'Este if é para durante o processo encontrar o maior valor armazenado em lCol e inserir em Ativo End If Loop PColar.Cells(i, lCol).Value = PBase.Cells(lLin, 3) 'Insere o valor do ativo correspondente a rota no devido lugar da PColar End If lCol = 2 'Restaura a variavel lCol lLin = lLin + 1 Loop lLin = 1 ' Restaura a váriavel depois que o Do While terminar Next For j = 2 To Ativo Step 1 'For para lançar o nome de ativo de acordo com a necessidade PColar.Cells(1, j).Value = "Ativo_" & j - 1 Next dCronometro = Now - dCronometro 'Váriável que diz o tempo de execução da macro Application.ScreenUpdating = True 'Exibe a mensagem de finalização junto com o tempo de execução da macro MsgBox "Processo finalizado, tempo de execução: " & Format(dCronometro, "hh:mm:ss"), vbInformation End Sub
Por uma outra perspectiva. Espero que ajude: Application.ScreenUpdating = False Dim Matriz As Range Dim Plan2_Ulticell As Range Dim Codigo As String Dim Ultima_Linha As Long Dim Linha As Long Dim Contador As Integer Dim Titulos As Integer 'Esta parte do código põe todos os titulos na plan2 (Artigo1 ,2, 3 etc) Titulos = Application.WorksheetFunction.Max(Plan1.Range("F:F")) For t = 1 To Titulos Plan2.Range(Cells(1, t + 1).Address).Value = "Artigo " & t Next t Plan1.Range("A2").Select Do While ActiveCell.Value "" Set Plan2_Ulticell = Plan2.Range("A1048576").End(xlUp).Offset(1, 0) Contador = Application.WorksheetFunction.CountIf(Plan1.Range("A:A"), ActiveCell.Value) If Contador > 1 Then Linha = ActiveCell.Row Plan2_Ulticell.Value = ActiveCell.Value For a = 0 To Contador - 1 Codigo = Cells(Linha, 3).Value Plan2_Ulticell.Offset(0, a + 1).Value = Codigo Plan2.Range(Cells(1, Contador + 1).Address).Value = "Artigo " & Contador Linha = Linha + 1 Next a Plan1.Range(Cells(Linha, 1).Address).Select Else Plan2_Ulticell.Value = ActiveCell.Value Codigo = ActiveCell.Offset(0, 2).Value Plan2_Ulticell.Offset(0, 1).Value = Codigo ActiveCell.Offset(1, 0).Select End If Loop Application.ScreenUpdating = True
Trovato, cria uma escala de folga automática. Algo que só insira o funcionário, o dia que ele vai folgar e em qual domingo ele folga e a planilha gera a folga automaticamente para qualquer outro mês.
Sensacional, ganhou mais um inscrito!!!! Parabens!
Seja bem vindo Will! Grato espero que goste e encontre muito material ainda nas mais de 500 aulas de Excel que tenho no canal. Bons estudos!
Muito show essa aula prof. Trovato, formidavel como o sr. consegue nos repassar a linguagem VBA de forma facil e descomplicada.
Grato pelo sr. compartilhar seu conhecimento conosco.
Att, Gledson
Parece Fácil vendo você criar esse código.......raciocínio bem interessante!! Parabéns pela aula!
Grato pela mensagem Wallace! Fico feliz que tenha gostado da aula. Realmente tive que queimar alguns neurônios para montar uma estrutura enxuta. Até a próxima!
Prof. Trovato. mas, um show de VBA. Um forte abraco.
Vamos trovatar no domingão!! Excelente aula!
Aula show!! Obrigado Mestre Trovato!
Excelente Aula Alessandro.
Para esse método funcionar corretamente, as rotas terão de estar ordenadas.
Não pode ter por exemplo não pode ter rota 1,2,3,2,4,5,3....
Muito bom Alessandro! Seus vídeos são excelentes.
Boa tarde Alessandro, primeiramente quero parabenizar pelas ótimas aulas, desenvolvi muita macro VBA no meu trabalho aprendendo com suas aulas. Queria que me tira-se uma dúvida, pois não achei em lugar algum o código onde em uma planilha filtrada, e minha célula ativa está na primeira linha, ou seja o cabeçalho, quero que meu cursor desça a próxima linha visível, utilizando o comando activecell.offset, ele desce para uma célula não visível. A única maneira que conseguimos para resolver esse problema, foi fazendo um do do while, offset.set.
queria saber se existe uma maneira mais simples. abs.
Amigo tudo bem? Poderia me ajudar?
Quero somar entre um intervalo de datas ou apenas uma data da minha listbox apenas os valores correspondente a Palavra Dinheiro(coluna E) valor(F), ou seja, ele tem que somar apenas os valores correspondente a Dinheiro dentro desta data. Se dentro do intervalo de data escolhido aparece 3 valores que foram pagos em Dinheiro, preciso que ele some estes valores dentro de uma textbox. Eu sei que deve usar a função soma-se, mas não estou conseguindo colocar os critérios, ou também se houver outra forma de fazer isso.
Minha Listbox exibi os pagamentos lançados durante o dia dos meus clientes. Tenho textbox de pesquisa de datas inicial e final, e ele exibi os clientes, a forma de pagamento, o valor bruto, o valor líquido, seja em Dinheiro, débito, crédito ou PIX. Consegui apenas quando eu defino uma data inicial ele me mostra o total em reais da coluna valor bruto e valor líquido. Mas preciso somar separadamente nesta pesquisa os valor em Dinheiro, débito, crédito e PIX em uma textbox para cada. Ficando assim na tela como um fechamento de caixa. Poderia me ajudar?
aula muito boa, mas gostaria que vossa maestria recaptulasse tudo isso, mas ao invés de contar elementos repetidos pós o outro em uma mesma coluna, contasse elementos repetidos aleatoriamente nessa mesma coluna.
E como fica o código se fosse o contrário? Transformar várias colunas em uma
Bom demais, excel é meu Hobby.
Refiz o código pensando em fazer a mesma coisa com um código diferente e que fizesse mesmo que as rotas não estivessem ordenadas de "A a Z".
O código fica um pouco problemático quando colamos aqui mas... o que vale é partilhar o conhecimento adquirido.
Public Sub distribuicao()
Dim sRota As String ' Variável para armazenar a rota analisada
Dim i As Integer 'Variável para o for
Dim j As Integer 'Variável para o for
Dim lFor As Integer 'Variável para limitar o primeiro for
Dim lLin As Integer 'Variável que servirá como parâmetro para localização das
' células avaliadas
Dim lCol As Integer 'Variável que servirá como parametro para localização das
'células avaliadas
Dim Ativo As Integer 'Variável que servirar para inserir os títulos na planilha PColar
Dim dCronometro As Date 'Variável que irá armazenar o tempo de execução da macro
Application.ScreenUpdating = False
lLin = 1
lCol = 2
Ativo = 1
dCronometro = Now
'#### Note que para o processo foram utilizados os nomes VBA's das planilhas que
'são:
''Pbase e PColar
PColar.Range("A1").CurrentRegion.Clear 'Limpa a planilha que irá colar os dados posteriormente
PBase.Range("A:A").Copy 'Copia a coluna que contém as rotas da planilha PBase
PColar.Range("A:A").PasteSpecial xlPasteAll 'Cola os valores copiados na planilha PColar
Application.CutCopyMode = False 'Exclui da area de transferência os valores copiados
PColar.Range("A:A").RemoveDuplicates Columns:=1, Header:=xlYes 'Remove da planilha PColar os valores duplicados
PColar.Range("A1").Select
lFor = PColar.Cells(PColar.Rows.Count, 1).End(xlUp).Row 'Atribui o número da linha da ultima rota
For i = 2 To lFor Step 1
sRota = PColar.Cells(i, 1).Value 'Atribui a variável o valor da primeira rota a ser analisado
Do While PBase.Cells(lLin, 1) "" 'Irá percorer a coluna 1 da PBase enquanto ela tiver valores
If PBase.Cells(lLin, 1).Value = sRota Then 'Se o valor percorrido for igual a variavel sRota
Do While PColar.Cells(i, lCol) "" '
lCol = lCol + 1 'Esse Do While é para encontrar a proxima coluna a inserir o valor
If Ativo < lCol Then
Ativo = lCol 'Este if é para durante o processo encontrar o maior valor armazenado em lCol e inserir em Ativo
End If
Loop
PColar.Cells(i, lCol).Value = PBase.Cells(lLin, 3) 'Insere o valor do ativo correspondente a rota no devido lugar da PColar
End If
lCol = 2 'Restaura a variavel lCol
lLin = lLin + 1
Loop
lLin = 1 ' Restaura a váriavel depois que o Do While terminar
Next
For j = 2 To Ativo Step 1 'For para lançar o nome de ativo de acordo com a necessidade
PColar.Cells(1, j).Value = "Ativo_" & j - 1
Next
dCronometro = Now - dCronometro 'Váriável que diz o tempo de execução da macro
Application.ScreenUpdating = True
'Exibe a mensagem de finalização junto com o tempo de execução da macro
MsgBox "Processo finalizado, tempo de execução: " & Format(dCronometro, "hh:mm:ss"), vbInformation
End Sub
Por uma outra perspectiva. Espero que ajude:
Application.ScreenUpdating = False
Dim Matriz As Range
Dim Plan2_Ulticell As Range
Dim Codigo As String
Dim Ultima_Linha As Long
Dim Linha As Long
Dim Contador As Integer
Dim Titulos As Integer
'Esta parte do código põe todos os titulos na plan2 (Artigo1 ,2, 3 etc)
Titulos = Application.WorksheetFunction.Max(Plan1.Range("F:F"))
For t = 1 To Titulos
Plan2.Range(Cells(1, t + 1).Address).Value = "Artigo " & t
Next t
Plan1.Range("A2").Select
Do While ActiveCell.Value ""
Set Plan2_Ulticell = Plan2.Range("A1048576").End(xlUp).Offset(1, 0)
Contador = Application.WorksheetFunction.CountIf(Plan1.Range("A:A"), ActiveCell.Value)
If Contador > 1 Then
Linha = ActiveCell.Row
Plan2_Ulticell.Value = ActiveCell.Value
For a = 0 To Contador - 1
Codigo = Cells(Linha, 3).Value
Plan2_Ulticell.Offset(0, a + 1).Value = Codigo
Plan2.Range(Cells(1, Contador + 1).Address).Value = "Artigo " & Contador
Linha = Linha + 1
Next a
Plan1.Range(Cells(Linha, 1).Address).Select
Else
Plan2_Ulticell.Value = ActiveCell.Value
Codigo = ActiveCell.Offset(0, 2).Value
Plan2_Ulticell.Offset(0, 1).Value = Codigo
ActiveCell.Offset(1, 0).Select
End If
Loop
Application.ScreenUpdating = True
Trovato, cria uma escala de folga automática. Algo que só insira o funcionário, o dia que ele vai folgar e em qual domingo ele folga e a planilha gera a folga automaticamente para qualquer outro mês.