Notifications
Clear all

Macro - Multicriterio

9 Posts
4 Usuários
0 Reactions
1,332 Visualizações
(@arycar)
Posts: 4
New Member
Topic starter
 

Pessoal, boa noite.

Estou com dificuldades para desenvolver um código na planilha em anexo que atenda as especificações abaixo:

Na planilha em anexo vcs podem ver que há uma tabela com "Número do comunicado" e "Tipo". Há alguns casos de comunicados com o mesmo número com mais de 1 tipo.
Eu gostaria de criar uma macro que, ao selecionar 2 ou mais critérios, ela me dissesse na celula G3 quantos comunicados respeitam os critérios selecionados.

Ex1:
Criterio = Tipo 1 ; Criterio 2 = Tipo 2 ; Critério 3 = Tipo 3
Nesse caso haveria apenas 1 comunicado que respeitaria esses 3 criterios...seria o comunicado 3.

Ex2:
Criterio 1 = Tipo 2 ; Criterio 2 = Tipo 5 ; Criterio 3 = vazio
Nesse caso haveria apenas 1 comunicado que respeitaria esses dois critérios...seria o comunicado 8. Apesar dele ter 3 tipos, dentre esses 3, há os 2 tipos selecionados no critério.

Abraço e agradeço desde já qualquer ajuda.

 
Postado : 27/01/2018 6:29 pm
(@mprudencio)
Posts: 2749
Famed Member
 

Nao precisa de macros!

Pesquise sobre a função Cont.ses.

Use o assistente de função para inserir a funcção corretamente na celula G3.

Marcelo Prudencio
Microsoft Excel Brasil no Facebook

"Começar já é a metade do caminho."
Autor Desconhecido

Simplifica que simples fica.
Nicole Tomazella.

"O Simples é Sempre Melhor Que o Complicado"
Jorge Paulo Lemann.

 
Postado : 27/01/2018 7:52 pm
(@arycar)
Posts: 4
New Member
Topic starter
 

Caro MPrudencio, a função Cont.ses não se aplica a esse caso. Ela funcionaria se eu colocasse nos argumentos da função o número do comunicado.

Eu quero apenas que a função me diga quantos comunicados respeitam os critérios que eu selecionei.

Nao sei se consegui ser claro na explicação.

 
Postado : 27/01/2018 8:15 pm
(@osvaldomp)
Posts: 858
Prominent Member
 

Experimente:

Sub ContaRegistros()
 Dim d As Long, c As Long, m As Range, nc As Long
  With Sheets("Plan1")
   .AutoFilterMode = False
   .[A:F] = ""
   Range("A3:B" & Cells(Rows.Count, 1).End(3).Row).Copy .[A10]
    For d = 3 To Cells(Rows.Count, 4).End(3).Row
     For c = 4 To 6
      If Cells(d, c) <> "" Then
       .Range("A10:B" & .Cells(Rows.Count, 1).End(xlUp).Row).AutoFilter 2, Cells(d, c)
       .Range("A11:A" & .Cells(Rows.Count, 1).End(xlUp).Row).Copy .Cells(1, c)
       .AutoFilterMode = False
      End If
    Next c
     For Each m In .Range("D1:D" & .Cells(Rows.Count, 4).End(3).Row)
      If Application.CountIf(.[E:F], m.Value) = Application.CountA(Cells(d, 5).Resize(, 2)) Then nc = nc + 1
     Next m
    Cells(d, 7) = nc: nc = 0: .[D:F] = ""
   Next d
  End With
End Sub

obs. antes de rodar o código:
1. corrija o conteúdo de B5 ~~~> de Tipo2 ~~~> para Tipo 2
2. insira uma planilha vazia e mantenha seu nome como Plan1 (será utilizada como auxiliar; você pode ocultá-la, se desejar)

Osvaldo

 
Postado : 28/01/2018 7:49 am
(@klarc28)
Posts: 971
Prominent Member
 

Seria interessante chamar a macro sempre que mudasse de célula:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Call ContaRegistros
End Sub

 
Postado : 28/01/2018 9:29 am
(@arycar)
Posts: 4
New Member
Topic starter
 

Klarc28, ta funcionando sim. Observe que, na celula G3 da planilha "Planilha1" há o numero de comunicados que atendem aos criterios estabelecidos. A "Plan1" serve apenas de auxilio para a macro, podendo ser ocultada se desejar.

 
Postado : 28/01/2018 10:33 am
(@klarc28)
Posts: 971
Prominent Member
 

Se resolveu, marque como resolvido na parte que te ajudou.

 
Postado : 28/01/2018 10:47 am
(@arycar)
Posts: 4
New Member
Topic starter
 

Osvaldo: Perfeito! Era exatamente isso que eu queria! Muito Obrigado!
Obs: vc se importaria de ajustar o código para que, sempre que ele identificasse um comunicado que atenda aos critérios, fizesse uma marcação na coluna C na mesma linha do comunicado? Pode ser um " * ". Isso me permitiria identificar os comunicados que atendem ao critério.

Muito obrigado a todos pela ajuda!

 
Postado : 28/01/2018 12:12 pm
(@klarc28)
Posts: 971
Prominent Member
 
Sub marcar()

Dim numero, numero2 As Long
Dim linha As Long

linha = 4

While Planilha1.Cells(linha, 1).Value <> ""

If Planilha1.Cells(linha, 2).Value = Planilha1.Range("D3").Value Or Planilha1.Cells(linha, 2).Value = Planilha1.Range("E3").Value Or Planilha1.Cells(linha, 2).Value = Planilha1.Range("F3").Value Then

Planilha1.Cells(linha, 3).Value = "*"

End If
linha = linha + 1
Wend

Dim vezes As Integer
Dim linha2 As Long
linha = 4
Dim achou As Boolean
achou = False

While Planilha1.Cells(linha, 1).Value <> "" And achou = False

If Planilha1.Cells(linha, 3).Value = "*" Then
vezes = 1
For linha2 = linha + 1 To Planilha1.UsedRange.Rows.Count

If Planilha1.Cells(linha, 1).Value = Planilha1.Cells(linha2, 1).Value Then
vezes = vezes + 1
If vezes = 3 Then
numero = Planilha1.Cells(linha, 1).Value
achou = True
Exit For
End If

End If
Next linha2
End If
linha = linha + 1
Wend

linha = 4

While Planilha1.Cells(linha, 1).Value <> ""

If Planilha1.Cells(linha, 1).Value = numero Then

Planilha1.Cells(linha, 3).Value = "*"

Else

Planilha1.Cells(linha, 3).Value = ""


End If
linha = linha + 1
Wend




End Sub
 
Postado : 28/01/2018 5:26 pm