• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

joseA

[Resolvido] Soma Condicional

16 mensagens neste tópico

Olá,

E é preciso ser feito em VBA ? Não podes utilizar fórmulas ?

Se colocares em B3 (e copiares para a direita)

=SUMIF(Folha1!$B$2:$B$18;Folha2!B$2;Folha1!$H$2:$H$18)

Depois, nas outras linhas só tens de aumentar a ultima condição de H para I, I para J, etc. Ou seja em B4 ficava

=SUMIF(Folha1!$B$2:$B$18;Folha2!B$2;Folha1!$I$2:$I$18)

depois:

=SUMIF(Folha1!$B$2:$B$18;Folha2!B$2;Folha1!$J$2:$J$18)

=SUMIF(Folha1!$B$2:$B$18;Folha2!B$2;Folha1!$K$2:$K$18)

...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estou com o Paulino.

Ele não precisa de apoio porque sabe muito bem o que diz mas... Basta apenas fazer o soma.se(...).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Antes de tudo, obrigado pela atenção.

Olha, preciso de apoio sim. É que o ficheiro original tem bastante dados, este anexado é apenas um esboço. O original fica bastante lento com excesso de fórmulas. Agora se não tiver como orientar-me em VBA, tudo bem, agradeço.

Abraços a todos,

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas através de VBA querias como ... um botão para actualizar ou quando alteravas uma célula ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olá Paulino,

Mas uma vez obrigado pela atenção. Pode ser ao alterar uma célula.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Paulino,

Delculpe-me pela indecisão, mas estive a analizar e conluí que seria melhor um botão para actualizar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vê este exemplo:

Sub ActualizaValores()
Dim x As Long
Dim m As Byte
Dim wsRelat As Worksheet, wsDados As Worksheet
Dim profissional As String, mes As String

Dim rg As Range
Dim result As Long

Set wsRelat = Worksheets("Folha2")
Set wsDados = Worksheets("Folha1")

Application.ScreenUpdating = False

' Ciclo na tabela de resultados
For x = 3 To wsRelat.Cells(wsRelat.Cells.Rows.Count, 2).End(xlUp).Row - 1

' Verifica qual o nome a pesquisar
profissional = wsRelat.Cells(x, 1).Value

Set rg = wsDados.Cells.Find(profissional)

' Ciclo nos meses
For m = 2 To 13

	' Caso não tenha encontrado o nome coloca tudo a zero
	If rg Is Nothing Then
		Cells(x, m).Value = 0
	Else

		' Calcula o valor e mostra-o na respectiva célula
		mes = Cells(2, m).Value
		result = Application.WorksheetFunction.SumIf(wsDados.Columns(2), mes, wsDados.Columns(rg.Column))
		Cells(x, m).Value = result

	End If
Next
Next

Application.ScreenUpdating = True

End Sub

Ficheiro para Download

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boa noite Jorge Paulino,

Mas uma vez muito obrigado, pela atenção dispensada.

Quase perfeito, falta apenas um detalhe. Quando deleto a última linha "Total Geral" da Folha2 a actualização não é realizada, tem como corrigir para que funcione independente desta linha 13 esteja em branco? Se tiver ficarei muito grato.

Abraços a todos!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A ultima linha é para ficar com formula, uma vez que não é necessária automação ... acho desnecessário!

O que achas ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Minha idéia seria que, assim como a última linha e coluna também seriam preenchidas automáticas. Ficaria perfeito.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem, realmente não vejo necessidade nenhuma, embora faltasse a fórmula no ficheiro, mas aqui vai ... podes colocar no final da função:

Dim lastRow As Long
lastRow = wsRelat.Cells(wsRelat.Cells.Rows.Count, 1).End(xlUp).Row

' Preenche a linha de totais
For m = 2 To 13
     wsRelat.Cells(lastRow, m).FormulaR1C1 = "=SUM(R[-" & lastRow - 3 & "]C:R[-1]C)"
Next

' Preenche a coluna de totais
For x = 3 To lastRow
    wsRelat.Cells(x, 14).FormulaR1C1 = "=SUM(RC[-12]:RC[-1])"
Next x

Altera também esta linha:

For x = 3 To wsRelat.Cells(wsRelat.Cells.Rows.Count, 2).End(xlUp).Row - 1

Para:

For x = 3 To wsRelat.Cells(wsRelat.Cells.Rows.Count, 1).End(xlUp).Row - 1

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Jorge Paulino e demais amigos,

Problema solucionado. Para vc's terem uma idéia, posto o ficheiro com a rotina que estava a usar com um contador (35 segundos para rodar), enquanto que a elaborada pelo Paulino é instantânea. Este ficheiro tem vários relatórios verifique as minhas rotinas - verdadeiros "mostros" - folha2 e folha3, apenas dois exemplos. Se tiver como simplificar esta da folha3, ficarei grato.

http://www.4shared.com/file/89886122/333523fa/A_PROGRAMAR_TREINO_II.html

:cheesygrin:

Abraços a todos!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olha realmente,

Fiz alguns testes e algumas adaptações para meu ficheiro original e ficou perfeito. Fico muito agradecido ao Jorge Paulino e aos demais amigos pela atenção dispensada. ;D

:bye2:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora