Jump to content

Recommended Posts

Posted

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

Posted

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.. :)

Posted (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 by FreiNando

O caminho mais curto para conseguir fazer muitas coisas é fazer uma de cada vez. Samuel Smiles

Posted

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

Posted

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

Posted

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.. :)

Posted

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

Posted

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.. :)

Posted

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

Posted

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

Posted

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

Posted

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

Posted (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 by ASimoes7
Posted

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.