Ir ao conteúdo
  • Cadastre-se

Alexandre José Costa

Membros Plenos
  • Total de itens

    21
  • Registro em

  • Última visita

  • Qualificações

    N/D
  1. Aos interessados, eu resolvi como segue: https://gurudoexcel.com/forum/viewtopic.php?f=12&t=6839&p=32832#p32832
  2. Prezados, Boa tarde. No código VBA abaixo eu tento validar duas condições na aba Saldos (que acontecerão na coluna D e G). Estas condições são lançadas manualmente linha a linha. Quando as duas condições ocorrerem juntas, então a planilha copia o conteúdo da célula F10 na aba Cálculos e a cola na na célula AD26 da aba Saldos. Meu código VBA não funciona. Poderiam, por favor, analisar meu código VBA? SE FOSSE uma fórmula ficaria assim: =SE(E(G25="Ativa";D25="MBT");Cálculos!F6; SE(E(G25="Ativa";D25="Falou(A)");Cálculos!J6; SE(E(G25="Ativa";D25="Falou(B)");Cálculos!N6; SE(E(G25="Ativa";D25="BTD");Cálculos!N6; SE(E(G25="Ativa";D25="BRZ");Cálculos!R6; SE(E(G25="Ativa";D25="FBT");Cálculos!V6; SE(E(G25="Ativa";D25="ARN");Cálculos!Z6; SE(E(G25="Ativa";D25="B2U");Cálculos!AH6; SE(E(G25="Ativa";D25="NEG");Cálculos!AL6; SE(E(G25="Ativa";D25="FOX");Cálculos!AP6; SE(E(G25="Ativa";D25="WAL");Cálculos!AT6; SE(E(G25="Ativa";D25="TEM");Cálculos!AX6; SE(E(G25="Ativa";D25="MBT Dentro");Cálculos!BB6; )))))))))))))) Acontece que a aba Saldos é uma aba de lançamentos, isto é, o VBA tem que reconhecer os lançamentos manuais, linha a linha, nas colunas D e G da aba Saldos. NOTA: Seria interessando que usássemos o Seletc Case porque serão muitas condições para validar. **************************************** esta é minha tentativa de código **************************************** Private Sub Worksheet_OrdemAtiva(ByVal Target As Range) 'Determina a coluna G como a linha ativa da planilha If Target.Column = 7 Then Application.EnableEvents = False 'Variável da linha ativa OrdemAtiva = Target.Row 'Identifica a Exchange lançada na coluna D e identifica se a ordem na coluna G é Ativa Select Case Range("D").Value = "D25" And Range("G" & OrdemAtiva).Value = "Ativa" 'Busca na aba Cálculos, da Exchange lançada, o resultado do cálculo feito para uma Ordem Ativa Case Is = Sheets("Cálculos").Cells(10, 6).Value 'Inputa o resultado (acima) do cálculo feito na aba Cálculos, da Exchange lançada para uma Ordem Ativa Range("AD" & OrdemAtiva).Value = Sheets("Cálculos").Cells(10, 6).Value 'Elimina a fórmula e deixa o seu resultado na célula Range("AD" & OrdemAtiva).Value = Range("AD" & OrdemAtiva).Value End Select Application.EnableEvents = True End If ********************************************************************************************************************** Desde já fico muito agradecido.
  3. Caro @deciog, Obrigado! Não é a primeira vez que você me ajuda aqui. Com sua ajuda eu aprendo dia-a-dia. Muito obrigado! Você é o cara. ;-)
  4. Caro @deciog, Obrigado pelo retorno. Apliquei a sua solução na planilha real e não consigo descobrir o motivo, mas ela não funcionou. A planilha que enviei para o fórum foi fictícia para facilitar as coisas. Usei o mesmo racional. Será que é porque a planilha é .xlsm? Por favor, você poderia ver a aplicação da fórmula nesta nova planilha anexa? A fórmula SOMARPRODUTO está indicada na aba SALDO, célula O2. OBS: existe algum modo de executar esta fórmula sem o CTRL+SHIFT+ENTER? Explico: este recurso "matricial" consome bastante processamento e a pasta de trabalho de onde estas planilhas pertencem já é bem carregada de cálculo, então, sempre tento evitar recursos matriciais. Mais uma vez muito obrigado pela incrível ajuda. Somarproduto com números e textos Real.rar
  5. Caros, Bom dia. Eu gostaria de contar com a ajuda de vocês na seguinte questão (ver planilha anexa): Como fazer para a função SOMARPRODUTO conseguir executar a fórmula sendo que a tabela tem números e textos? OBS1: Devemos manter a função SOMARPRODUTO. OBS2: Os textos devem permanecer na tabela. OBS3: Se substituirmos os textos digitados da tabela por seus respectivos números, a fórmula funciona perfeitamente. OBS4: As soluções não devem conter matrizes (ÍNDICE, PROCV, CORRESP, etc). Desde já agradeço! Somarproduto com números e textos.xlsx
  6. Tentei mudar o objeto para Worksheet e tipo Change mas não funciona. Alguém pode me ajudar com isso, por favor?
  7. Caro @Patropi, Boa noite. Estou recorrendo a você para tentar resolver um código VBA aqui. Por favor, poderia dar uma olhada? Explicando: Segue anexo (no primeiro post) uma planilha de lançamentos. A cada linha lançada, a coluna F pode conter, entre outras, as palavras "Compra" ou "Venda". Toda vez que aparecer "Compra" ou "Venda" na coluna F, as fórmulas da planilha preenchem a linha imediatamente abaixo da linha lançada, que aqui chamo de linha gerada. Até aqui tudo funciona. Na linha gerada, na coluna O, tem uma fórmula que resulta em um número. Exatamente neste ponto, eu preciso que a fórmula deixe de existir e permaneça apenas o resultado da fórmula. Depois de horas de tentativas e erros eu consegui um resultado parcial com este código: Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False If Range("F25").Value = "Compra" Or Range("F25").Value = "Venda" Then Range("O26").Select 'Chama Macro1_EliminaFormula_DeixaResultado() Call Macro1_EliminaFormula_DeixaResultado End If Application.EnableEvents = True End Sub O que fiz até aqui foi um código que chama uma macro e transforma uma formula em seu resultado. Agora eu preciso que a cada linha lançada, isto seja verificado. Assim: - A cada linha lançada o código verifique se na coluna F existe as palavras "Compra" ou "Venda". Em caso positivo, o código precisa ir até a coluna O, imediatamente abaixo da linha lançada, e executar a macro contida no código acima (que transforma uma formula em seu resultado). A inteligência esperada aqui é justamente reconhecer, a cada linha lançada, os lançamentos de "Compra" ou "Venda" na coluna F e que estes dois lançamentos representem a condição para executar a macro na coluna O da linha gerada. Isso deve resolver o problema. Como pode ver pelo histórico dos posts eu estou há dias tentando resolver isso. Espero que possa me ajudar e desde já eu lhe agraço imensamente! ***** Ola! Boa noite. Avancei um pouco mais na resolução do problema. Mas ainda não está legal. Segue o que fiz: Sub ProcCompraVenda() Dim i As Long Dim LastLine As String 'Localiza a última linha preenchida da planilha na coluna F 'LastLine = Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row LastLine = Plan1.Cells(Rows.Count, 6).End(xlUp).Row 'Determina onde inicia-se a localização na coluna F For i = 3 To LastLine 'Procura por Compra ou Venda na coluna F If Plan1.Cells(i, 6) = "Compra" Or Plan1.Cells(i, 6) = "Venda" Then 'Seleciona célula que receberá a macro Plan1.Cells(i + 1, 17).Select 'Executa a macro que elimina a fórmula de deixa o seu resultado Call Macro1_EliminarFormula End If Next i End Sub O código acima quando executado de dentro do Editor VBA funciona. Ele percorre a condição por toda a planilha e executa a macro nas células corretas, MAS quando lanço uma nova linha, a macro/código (ainda não sei o que acontece) não é acionada. A condição para a macro ser acionada deveria ser orgânica, transparente para o usuário, sem eu precisar entrar no Editor VBA para disparar a macro. NOTA1: Para não perder as fórmulas da planilha eu repiquei a coluna O na coluna Q e apliquei o código acima na coluna repicada (Q). NOTA2: eu também gostaria de acrescentar uma tarefa a mais no código antes dele executar a macro. Hoje quando existe o lançamento de uma Compra ou Venda na coluna F, a planilha, por fórmula, multiplica, na mesma linha as células O por k (quantidade x Cotação), só depois a planilha chama a execução da macro. Eu gostaria que o código passasse a fazer esta conta antes de chamar a macro e não mais as fórmulas da planilha. Alguém pode ajudar, por favor? Obrigado.
  8. Caro @Patropi, Boa noite. Estou recorrendo a você para tentar resolver um código VBA aqui. Por favor, poderia dar uma olhada? Explicando: Segue anexo (no primeiro post) uma planilha de lançamentos. A cada linha lançada, a coluna F pode conter, entre outras, as palavras "Compra" ou "Venda". Toda vez que aparecer "Compra" ou "Venda" na coluna F, as fórmulas da planilha preenchem a linha imediatamente abaixo da linha lançada, que aqui chamo de linha gerada. Até aqui tudo funciona. Na linha gerada, na coluna O, tem uma fórmula que resulta em um número. Exatamente neste ponto, eu preciso que a fórmula deixe de existir e permaneça apenas o resultado da fórmula. Depois de horas de tentativas e erros eu consegui um resultado parcial com este código: Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False If Range("F25").Value = "Compra" Or Range("F25").Value = "Venda" Then Range("O26").Select 'Chama Macro1_EliminaFormula_DeixaResultado() Call Macro1_EliminaFormula_DeixaResultado End If Application.EnableEvents = True End Sub O que fiz até aqui foi um código que chama uma macro e transforma uma formula em seu resultado. Agora eu preciso que a cada linha lançada, isto seja verificado. Assim: - A cada linha lançada o código verifique se na coluna F existe as palavras "Compra" ou "Venda". Em caso positivo, o código precisa ir até a coluna O, imediatamente abaixo da linha lançada, e executar a macro contida no código acima (que transforma uma formula em seu resultado). A inteligência esperada aqui é justamente reconhecer, a cada linha lançada, os lançamentos de "Compra" ou "Venda" na coluna F e que estes dois lançamentos representem a condição para executar a macro na coluna O da linha gerada. Isso deve resolver o problema. Como pode ver pelo histórico dos posts eu estou há dias tentando resolver isso. Espero que possa me ajudar e desde já eu lhe agraço imensamente!
  9. Depois de horas de tentativas e erros eu consegui um resultado parcial. Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False If Range("F25").Value = "Compra" Or Range("F25").Value = "Venda" Then Range("O26").Select 'Chama Macro1_EliminaFormula_DeixaResultado() Call Macro1_EliminaFormula_DeixaResultado End If Application.EnableEvents = True End Sub Agora preciso de ajuda para que a CONDIÇÃO da célula F se estenda sobre a coluna F e o RESULTADO esperado se estenda sobre a coluna O. Sendo mais específico, não é sobre TODA a coluna F ou TODA a coluna O. A condição aplica-se na coluna F da linha lançada e o resultado aplica-se na coluna O, abaixo da linha lançada. Veja o abaixo: Exemplo: A B C D E F G H I J K L M N O Linha lançada ----------------------------------> (1) Linha gerada pela condição* --------------------------------------------------------------> (2) A B C D E F G H I J K L M N O Linha lançada ----------------------------------> (1) Linha gerada pela condição* --------------------------------------------------------------> (2) (1) Lugar da coluna F que ao se lançar a "Compra" ou "Venda" aciona as fórmulas geram a linha de baixo. (2) Lugar da coluna O (abaixo da linha lançada) em que o código VBA se aplica, eliminando a fórmula e deixando o resultado. * Os dados da linha gerada aparecem quando as as fórmulas da planilha atendem a condição da linha lançada. Toda vez que no lançamento da coluna F aparece "Compra" ou "Venda", a condição é acionada e a linha abaixo apresenta seus dados. Esta sequência vai se repetindo ao longo da planilha. Alguém pode dar uma força, por favor?
  10. Pessoal, eu acredito que tudo pode ficar mais simples se eu conseguir chamar uma macro a partir de uma fórmula. Exemplo: =SE(OU(F23="Compra";F23="Venda");E(O23*K23;MINHAFUNC);"") *MINHAFUNC = o nome da Macro que criei. Se alguém puder me ajudar, eu agradeço.
  11. Olá Pessoal, Boa tarde a todos. Por favor, vejam se podem me ajudar com este código. Segue anexo uma planilha de lançamentos. Abaixo de cada linha lançada há uma outra linha com fórmulas que são acionadas sempre que o lançamento (na coluna F) for "Compra" ou "Venda". A saber, sempre que se lança uma Compra a linha de baixo calcula o Débito. Sempre que se lança uma Venda a linha de baixo calcula o Crédito. Simples assim. O eu que preciso: toda vez que a "linha de baixo" do lançamento for acionada, isto é, que o lançamento (na coluna F) for "Compra" ou "Venda", que o resultado da linha de abaixo, EXATAMENTE NA COLUNA O, elimine a fórmula e mantenha o resultado da fórmula. Isso deve ocorrer organicamente, isto é, disparar o VBA por botão e sim quando determinado evento ocorre na planilha, em nosso caso, o lançamento (na coluna F) de "Compra" ou "Venda". OBS: A planilha anexa já traz uma sequência de lançamentos, mas observe que novas linhas serão lançadas, logo, a solução deve considerar isso. O eu que já fiz: Infelizmente não entendo nada de macros e VBA, mas tentei, sem sucesso, adequar um código VBA para solucionar o problema. Segue abaixo o que fiz: - RODAR MACRO QUANDO O CONTEÚDO DA CÉLULA É ALTERADO (VIA FÓRMULA OU MANUALMENTE) Abri o editor VBA (Alt + F11) e na aba Plan1(Saldos) digitei o seguinte código: Private Sub Worksheet_Calculate() If Plan1(Saldos).Range("O24").Value <> PrevVal Then Call Macro1_EliminaFormula_DeixaResultado PrevVal = Plan1(Saldos).Range("O24").Value End If End Sub Porém, segundo a fonte da web onde eu peguei o código, diz que para o código funcionar corretamente outras duas etapas devem ser feitas. No menu à esquerda onde diz EstaPasta_de_trabalho fui orientado a inserir outro código (ele já segue com minhas adaptações): Private Sub Workbook_Open() PrevVal = Plan1(Saldos).Range("O24").Value End Sub O objetivo do código acima é garantir que no momento em que o arquivo for aberto, a variável verifique e guarde as células da coluna O, imediatamente abaixo linha lançada, assim, quando ela for alterada o código conseguirá fazer a comparação e detectar a mudança. Por fim, a segunda e última etapa sugerida pela fonte da web é criar a variável PrevVal que fará todo este controle. Para tanto, eu deveria criar um módulo (ou utilizar um já existente) e inserir o seguinte código. Fiz assim: Public PrevVal As Variant Bem, como eu disse anteriormente, o código VBA acima não funcionou. Por favor, alguém pode me ajudar a chegar no resultado desejado? Desde já agradeço! Macro para eliminar fórmula e deixar resultado.rar
  12. Caro @deciog, Obrigado pelo retorno. Vi que você simplificou ainda mais a fórmula. Eu imaginei que para termos um saldo acumulado por corretora, por moeda e até o último lançamento (até a última linha lançada), eu deveria incluir, na fórmula, uma matriz com as datas de cada lançamento. Mas pelo que vi em sua fórmula, isso não é necessário! Pelo que entendi, não adianta eu colocar, na fórmula, a matriz com as datas porque a fórmula simplesmente vai incluir no cálculo uma informação que não interfere no resultado, isto é, qualquer valor que seja >=a data lançada, é o mesmo que dizer "qualquer data acima do último lançamento que estou fazendo". Como as outras matrizes iniciam-se e terminam no mesmo ponto (mesma quantidade de linhas) ($D$4:$D11=D11)*($H$4:$H11=H11), a fórmula sempre fará a soma do produto dessas matrizes. Pelo que me parece, uma boa analogia é dizer que cada matriz funciona como um filtro do Excel. Uma tabela qualquer com muitas colunas, vai se limitando (ficando cada vez menor) a cada filtro que aplicamos. É isso mesmo?
  13. Deciog, Com sua alteração na fórmula, nós podemos reduzir um argumento simplificando a fórmula assim: =SOMARPRODUTO(($D$4:$D5=D5)*(($C$4:$C5>=VALOR($C$5))-($C$4:$C5>VALOR(C5)))*($P$4:$Q5)) =SOMARPRODUTO(($D$4:$D5=D5)*(($C$4:$C5>=VALOR($C$5))*($P$4:$Q5))) O argumento que exclui, antes existia porque eu delimitava o range para cerca de 700 linhas depois. Com sua alteração na fórmula, simplesmente aumentando o range linha a linha, este argumento perdeu o sentido. :-) Antes era: =SOMARPRODUTO(($D$5:$D719=D5)*(($C$5:$C719>=VALOR($C$5))-($C$5:$C719>VALOR(C5)))*($P$5:$Q719)) Você mudou para: =SOMARPRODUTO(($D$4:$D5=D5)*(($C$4:$C5>=VALOR($C$5))-($C$4:$C5>VALOR(C5)))*($P$4:$Q5)) E agora com a exclusão do argumento, eu deixei assim: =SOMARPRODUTO(($D$4:$D5=D5)*(($C$4:$C5>=VALOR($C$5))*($P$4:$Q5))) Estamos progredindo. Cheguei no resultado desejado! Eis a fórmula: =SOMARPRODUTO(($D$4:$D9=D9)*($H$4:$H9=H9)*(($C$4:$C9>=VALOR($C$5))*($P$4:$Q9))) Com a diminuição de um argumento, a fórmula ficou mais simple e pude acrescentar o argumento correto. ;-) OBS: estou chamando a sentença da fórmula de argumento, mas neste caso o correto é dizer "matriz". Obrigado a todos pela colaboração, especialmente ao @deciog que com uma simples alteração na fórmula me permitiu desenvolvê-la melhor. :-)
  14. Olá deciog, Sua interação gerou avanços. Vamos lá. O que preciso é do saldo acumulado por corretora, por moeda, a cada nova linha/lançamento. Ex: Enquanto temos apenas uma moeda, os saldos acumulados para diferentes corretoras funcionam, mas quando entra uma nova moeda, para a mesma corretora e diferente de reais, ela continua somando esta nova moeda aos saldos acumulados em reais. Isso não pode acontecer. Cada corretora deveria ser o saldo acumulado em reais e também o saldo acumulado em outra moeda qualquer que fosse lançada. Os resultados esperados são: Observe a linha 9 da planilha. Este é o primeiro caso onde aparece uma nova moeda diferente do real para a corretora MBT. Portanto, o resultado esperado para esta corretora, para esta nova moeda, até esta data deveria ser 0,17136436. Na sequência, o resultado esperado para a linha 10 é 0,00026436, porque quase a totalidade da moeda comprada/adquirida pela corretora MBT foi transferida para a outra corretora, a ARN. Então, temos 0,17136436 - 0,17110000 = 0,00026436. Curiosidade: A linha 11 mostra a fórmula funcionando corretamente, porque é a primeira vez que a corretora ARN aparece, isto é, é o primeiro depósito para a ARN. Logo, o saldo acumulado para a ARN, nesta moeda, até esta data é de 0,17110000. O que está correto. Em sua fórmula, vi que você mudou a célula que origina os cálculos, ou seja, era $D$5 você mudou para $D$4, era $C$5 você mudou para $C$4, era $P$5 você mudou para $P$4. Veja: Antes era: =SOMARPRODUTO(($D$5:$D719=D5)*(($C$5:$C719>=VALOR($C$5))-($C$5:$C719>VALOR(C5)))*($P$5:$Q719)) Você mudou para: =SOMARPRODUTO(($D$4:$D5=D5)*(($C$4:$C5>=VALOR($C$5))-($C$4:$C5>VALOR(C5)))*($P$4:$Q5)) Eu não entendi o motivo, da alteração citada acima, já que as novas células de referência que colocou caem sobre os rótulos das colunas. Outra alteração - muito boa - que você fez foi reduzir o range de $D$5:$D719 para $D$4:$D5, de $C$5:$C719 para $C$4:$C5, de $P$5:$Q719 para $P$4:$Q5. Isso me parece mais inteligente, uma vez que apenas a próxima linha entrará os cálculos, aumentando o range, automaticamente, linha a linha. Isso é um avanço considerável. Por hora, ainda falta a última coluna dar o saldo acumulado, por corretora, por moeda, a cada nova data lançada (em cada linha).
  15. Olá Casa do Hardware, Sim, a coluna descrevendo as moedas faz parte da planilha. É mais um quebra-cabeça com a fórmula mesmo. Acha que pode ajudar? adicionado 58 minutos depois O melhor é ver a planilha anexa,mas para ajudar eu detalho o que fiz na fórmula que funcionaria bem se tivéssemos apenas uma moeda: =SOMARPRODUTO(($D$5:$D719=D5)*(($C$5:$C719>=VALOR($C$5))-($C$5:$C719>VALOR(C5)))*($P$5:$Q719)) ($D$5:$D719=D5) -------------------> indica a corretora ($C$5:$C719>=VALOR($C$5)) --> indica a coluda de datas (desde a primeira data até a linha atual) ($C$5:$C719>VALOR(C5)) -------> indica a coluna de datas (que são superiores a data da linha atual) ($P$5:$Q719) -------------------------> indica as duas colunas onde temos os saldos parciais de cada lançamento)

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×