ASimoes7 Posted May 12, 2012 at 05:29 PM Report #454884 Posted May 12, 2012 at 05:29 PM Boas tarde, será que alguém me pode ajudar aqui numa questão, estou a fazer um trabalho em excel, mas preciso de criar um comando em “vba” e não tenho praticamente nenhuma experiencia em programação. Tenho uma tabela onde insiro alguns dados e numa folha diferente tenho uma espécie de contadores, o que eu preciso é um comando para criar um novo contador mas com objectivos diferentes. Vou tentar exemplificar: Quando A1 tem o valor 1 e a seguir passa para 0 -> B1 = 1 Quando A1 tem o valor 2 e passa para 0 -> B2 = 1 Quando A1 tem o valor 4 e passa para 0 -> B4 = 1 Quando A1 tem o valor 1 e passa para 0 -> B1 = 2 Quando A1 tem o valor 1 e passa para 0 -> B1 = 3 Neste caso a tabela que pretendo criar seria de B1 a B4 e no fim deste exemplo estaria B1 =3 ; B2 = 1; B3 = 0; B4 = 1 O que tentei fazer mas o comando n funciona foi algo do género: If Active.cell(“A1”) = 1 and after Active.cell(“A1”) = 0 then B1 = +1 End if If Active.cell(“A1”) = 2 and after Active.cell(“A1”) = 0 then B2 = +1 End if Sei que o comando está mal feito, mas como não percebo muito de vba foi o que me veio à cabeça, e já dei voltas nisso e nada. Se alguém me conseguir ajudar agradeço, já fiz bastante pesquisa e não consigo meter isto a funcionar. Obrigado Cumps, ASimões
Gnrtuga Posted May 12, 2012 at 07:20 PM Report #454894 Posted May 12, 2012 at 07:20 PM Boas, em principio tens de criar o código no evento change da célula, e criar contadores para ir somando o valor. Andava à procura de mais para te ajudar, mas estou com umas dúvidas (também percebo pouco disto). Vou continuar à procura a ver se descubro, entretanto pode ser que alguém que perceba mais consiga ajudar mais.. Férias! Estou por aqui: http://maps.google.p...001549&t=h&z=20 (a bulir claro está!) Nunca mais é verão outra vez.. :)
FreiNando Posted May 13, 2012 at 08:42 AM Report #454920 Posted May 13, 2012 at 08:42 AM (edited) O que queres fazer é um pouco confuso, penso ter percebido. Falta saber como é alterado o valor da célula A1, se manualmente ou por fórmula. O evento Change da folha só é chamado depois do valor alterado. E o evento Calculate depois das formulas na folha serem calculadas, caso existam. Então usando uma variável para guardar o valor de A1 depois de alterada caso não seja zero, caso contrario usar o ultimo valor da A1 para incrementar a célula B(A1 -1) ... Em código fica assim para A1 com fórmula: Dim ValorA1 As Integer Private Sub Worksheet_Calculate() If Range("A1").Value = 0 Then If ValorA1 > 0 Then Range("B1").Offset(ValorA1 - 1, 0).Value = 1 + Range("B1").Offset(ValorA1 - 1, 0).Value End If Else ValorA1 = Range("A1").Value End If End Sub Ou assim, quando A1 é alterado manualmente: Dim ValorA1 As Integer Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" Then If Target.Value = 0 Then If ValorA1 > 0 Then Range("B1").Offset(ValorA1 - 1, 0).Value = 1 + Range("B1").Offset(ValorA1 - 1, 0).Value End If Else ValorA1 = Target.Value End If End If End Sub Edited May 13, 2012 at 02:39 PM by FreiNando O caminho mais curto para conseguir fazer muitas coisas é fazer uma de cada vez. Samuel Smiles
ASimoes7 Posted May 13, 2012 at 11:05 AM Author Report #454935 Posted May 13, 2012 at 11:05 AM Obrigado pela ajuda, julgo que é mesmo isso que eu precisava, já estive a testar e realmente funciona como eu pretendia, agr vou tentar implementar no meu projecto, e sim não foi explicito em relação à chegada de informação à coluna, mas era realmente através de uma formula, logo a célula nunca é activada. Cumps, ASimoes
Gnrtuga Posted May 13, 2012 at 11:35 AM Report #454942 Posted May 13, 2012 at 11:35 AM FreiNando uma dúvida, o código é colocado onde? O código que colocaste é parecido ao que eu encontrei nas minhas pesquisas, mas não o consigo por a funcionar..pelo menos sem botão nenhum.. 😞 Férias! Estou por aqui: http://maps.google.p...001549&t=h&z=20 (a bulir claro está!) Nunca mais é verão outra vez.. :)
FreiNando Posted May 13, 2012 at 11:56 AM Report #454952 Posted May 13, 2012 at 11:56 AM FreiNando uma dúvida, o código é colocado onde? O código que colocaste é parecido ao que eu encontrei nas minhas pesquisas, mas não o consigo por a funcionar..pelo menos sem botão nenhum.. 😞 No IDE do VBA (Alt + F11) Escolhes a folha que pretendes no Project Explorer, e colas o código. Verifica no topo da janela do código se à esquerda está Worksheet e à direita o Evento pretendido. O caminho mais curto para conseguir fazer muitas coisas é fazer uma de cada vez. Samuel Smiles
Gnrtuga Posted May 13, 2012 at 12:14 PM Report #454959 Posted May 13, 2012 at 12:14 PM Pois já experimentei, tanto com o change, como com o calculate, e ainda experientei no change com Worksheet, em vez de iWorksheet (cada um na sua folha) e mesmo assim nada.. experimentei alterar a célula A1, guardar alterações e voltar a abrir, para ver se ocorria alguma mudança, e mesmo assim nada.. Tou a usar o Ofice2010.. será por ai? Se não for muito incomodo será que podias fazer o upload de uma exemplo funcional? Obrigado! Férias! Estou por aqui: http://maps.google.p...001549&t=h&z=20 (a bulir claro está!) Nunca mais é verão outra vez.. :)
FreiNando Posted May 13, 2012 at 02:37 PM Report #455005 Posted May 13, 2012 at 02:37 PM Realmente foi lapso meu aquele 'i' antes Worksheet. Peço desculpa. É que pus os dois eventos e tive de desligar um para testar o outro. Fica um exemplo em ficheiro. Sabes que a partir da versão 2007 os ficheiros de excel contendo macros tem uma extensão diferente (.xlsm). O caminho mais curto para conseguir fazer muitas coisas é fazer uma de cada vez. Samuel Smiles
Gnrtuga Posted May 13, 2012 at 03:20 PM Report #455019 Posted May 13, 2012 at 03:20 PM Pois deve de ser alguma coisa nas minhas configurações que faz com que não funcione..aqui não funciona 😞 tanto no manual como no da formúla, tenho que introduzir valores no A1, não é isso? e devia actualizar sozinho? Já esperimentei fazer alterações, guardar e voltar a abrir, e mesmo assim nada..lol Férias! Estou por aqui: http://maps.google.p...001549&t=h&z=20 (a bulir claro está!) Nunca mais é verão outra vez.. :)
FreiNando Posted May 13, 2012 at 04:01 PM Report #455043 Posted May 13, 2012 at 04:01 PM Introduz valores no A1, por exemplo 1 Depois introduz 0 para o contador incrementar o valor de B1 depois tenta com o valor 2, etc... Só irá incrementar a coluna B quando A1 for colocado a 0, e vai fazer de acordo com o ultimo valor de A1 antes de ser posto a 0. Eu fiz conforme ASimoes7 queria. O caminho mais curto para conseguir fazer muitas coisas é fazer uma de cada vez. Samuel Smiles
Gnrtuga Posted May 13, 2012 at 04:54 PM Report #455073 Posted May 13, 2012 at 04:54 PM Pronto já funciona, pensava que o evento era ao mudar de célula, e não ao mudar o valor..🙂 por isso não funcionava. Obrigado pela ajuda e pelo ficheiro! Férias! Estou por aqui: http://maps.google.p...001549&t=h&z=20 (a bulir claro está!) Nunca mais é verão outra vez.. :)
ASimoes7 Posted May 18, 2012 at 05:04 PM Author Report #456717 Posted May 18, 2012 at 05:04 PM Boas novamente. Tou aqui com um novo problema, e não estou a conseguir resolver. Queria meter mais células onde vou adicionar valores, e que fosse possível fazer a mesma contagem, mas o que está a acontecer é que sempre que o valor volta a 0 na célula A1, se estiver o valor 5 na célula A2, a contagem parece que é iniciada, isto é, se logo de seguida meter o valor 0 na célula A2, o contador incrementa na célula C1 e não na C5 como pretendo. Tá um pouco confuso, mas deixo aqui o código que meti e não está a funcionar. Dim ValorA1 As Integer Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" Then If Target.Value = 0 Then If ValorA1 > 0 Then Range("B1").Offset(ValorA1 - 1, 0).Value = 1 + Range("B1").Offset(ValorA1 - 1, 0).Value End If Else ValorA1 = Target.Value End If ElseIf Target.Address = "$A$2" Then If Target.Value = 0 Then If ValorA1 > 0 Then Range("C1").Offset(ValorA1 - 1, 0).Value = 1 + Range("C1").Offset(ValorA1 - 1, 0).Value End If Else ValorA1 = Target.Value End If End If End Sub Se alguém me conseguir explicar como resolvo isto agradeço. Obrigado Cumps, ASimões
ASimoes7 Posted May 19, 2012 at 03:19 AM Author Report #456812 Posted May 19, 2012 at 03:19 AM Resolvido, bastou criar uma variável diferente.
ASimoes7 Posted May 24, 2012 at 01:31 PM Author Report #457855 Posted May 24, 2012 at 01:31 PM Boas novamente, Ainda estou aqui com um problema, será que alguém me pode ajudar a resolver isto? É o seguinte, tenho este código: Dim Verde As Integer Dim Vermelho As Integer Dim Azul As Integer Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" Then If Target.Value = 0 Then If Verde > 0 Then Range("B1").Offset(Verde - 1, 0).Value = 1 + Range("B1").Offset(Verde - 1, 0).Value End If Else Verde = Target.Value End If End If If Target.Address = "$A$2" Then If Target.Value = 0 Then If Vermelho > 0 Then Range("C1").Offset(Vermelho - 1, 0).Value = 1 + Range("C1").Offset(Vermelho - 1, 0).Value End If Else Vermelho = Target.Value End If End If If Target.Address = "$A$3" Then If Target.Value = 0 Then If Azul > 0 Then Range("D1").Offset(Azul - 1, 0).Value = 1 + Range("D1").Offset(Azul - 1, 0).Value End If Else Azul = Target.Value End If End If End Sub O que acontece é que vou aumentando os valores na coluna A1 para o verde, A2 para o vermelho e A3 para o Azul, e com este contadores fico a saber quantas vezes vi cada cor... tenho uns botões correspondentes e cada vez que carrego por exemplo no verde, mete o valor de A1 a zero e aumenta o valor de A2 e A3 em 1. Agora o problema está a ser que se tiver de carregar 2x seguidas no Verde, ele não assume como 0, mas sim adiciona 1 valor ao ultimo antes de ter saido o primeiro 0. Vou tentar dar um exemplo:(inicialmente) A1 = 2 ||||| B1 = 0 || C1 = 0 || D1 = 0 A2 = 2 ||||| B2 = 0 || C2 = 0 || D2 = 0 A3 = 2 ||||| B3 = 0 || C3 = 0 || D3 = 0 se de seguida carregar em Verde (A1), fica: A1 = 0 ||||| B1 = 0 || C1 = 0 || D1 = 0 A2 = 3 ||||| B2 = 1 || C2 = 0 || D2 = 0 A3 = 3 ||||| B3 = 0 || C3 = 0 || D3 = 0 Se carregar em Vermelho (A2) A1 = 1 ||||| B1 = 0 || C1 = 0 || D1 = 0 A2 = 0 ||||| B2 = 1 || C2 = 0 || D2 = 0 A3 = 4 ||||| B3 = 0 || C3 = 1 || D3 = 0 E se carregar novamente na mesma, VErmelho(A2) A1 = 2 ||||| B1 = 0 || C1 = 0 || D1 = 0 A2 = 0 ||||| B2 = 1 || C2 = 0 || D2 = 0 A3 = 5 ||||| B3 = 0 || C3 = 2 || D3 = 0 Quando o que pretendia é que nesta situação de repetição nada fosse alterado, e fica-se exactamente como a anterior, basicamente preciso que sempre que volte a ficar 0 quando essa mesma célula já tem o valor 0 tudo se mantenha igual. Se alguém me conseguir ajudar a resolver isto agradeço. cumprimentos, ASimões
FreiNando Posted May 24, 2012 at 08:47 PM Report #457974 Posted May 24, 2012 at 08:47 PM Não indicaste as instruções que alteram os valores da coluna A. O queres resolver está nessas instruções. O código acima mostrado apenas verifica os valores da coluna A, não os altera. O caminho mais curto para conseguir fazer muitas coisas é fazer uma de cada vez. Samuel Smiles
ASimoes7 Posted May 24, 2012 at 09:01 PM Author Report #457980 Posted May 24, 2012 at 09:01 PM (edited) Pois, mas o que está a acontecer é que quando ele verifica 2 ou mais vezes seguidas que o valor"0" (por exemplo de A1) se mantém, ele aumenta +1 no ultimo valor que contou na coluna "B", por exemplo, se em A1 tiver 4 --> e passar para 0, ele aumenta 1 em B4, mas se de seguida meter novamente 0 em A1, ele aumenta novamente em B4... O que eu pretendia aqui é que sempre que o zero acontecer 2 ou mais vezes seguidas que nenhum valor fosse alterado... É possível fazer isso? E os valores de A1 são alterados através de um botão, em que sempre que carrego no Botão verde, o valor de A1 volta a zero, logo se carregar mais do que uma vez seguida ele mantém o valor zero, e só aumenta quando carrego em qq um dos outros botões. Edited May 24, 2012 at 09:11 PM by ASimoes7
FreiNando Posted May 24, 2012 at 09:28 PM Report #457991 Posted May 24, 2012 at 09:28 PM Tens razão! Falta colocar as variáveis a 0 depois de incrementar os contadores. Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" Then If Target.Value = 0 Then If Verde > 0 Then Range("B1").Offset(Verde - 1, 0).Value = 1 + Range("B1").Offset(Verde - 1, 0).Value Verde = 0 End If Else Verde = Target.Value End If End If If Target.Address = "$A$2" Then If Target.Value = 0 Then If Vermelho > 0 Then Range("C1").Offset(Vermelho - 1, 0).Value = 1 + Range("C1").Offset(Vermelho - 1, 0).Value Vermelho = 0 End If Else Vermelho = Target.Value End If End If If Target.Address = "$A$3" Then If Target.Value = 0 Then If Azul > 0 Then Range("D1").Offset(Azul - 1, 0).Value = 1 + Range("D1").Offset(Azul - 1, 0).Value Azul = 0 End If Else Azul = Target.Value End If End If End Sub O caminho mais curto para conseguir fazer muitas coisas é fazer uma de cada vez. Samuel Smiles
ASimoes7 Posted May 24, 2012 at 11:10 PM Author Report #458011 Posted May 24, 2012 at 11:10 PM Obrigado..fartei-me de dar voltas e só compliquei uma coisa tão simples 🙂
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now