Notifications
Clear all

VBA = LOOP ( INDEX + MATCH) = TRAZER VÁRIOS RESULTADOD

5 Posts
3 Usuários
0 Reactions
1,287 Visualizações
(@ericsson)
Posts: 54
Trusted Member
Topic starter
 

Pessoal, Olá!!

Faz tempo que não posto aqui, mas eis que surge uma dúvida, esta até então parecida com uma que tive outro tempo atrás!!

Utilizando INDEX + MATCH dentro de um Loop eu consigo obter as linhas de um mesmo critério tantas vezes quanto ele conste na pesquisa?

Exemplo:

Do While CONT < QUANT_MARCADOR

LINHA_MARCADOR = WorksheetFunction.Index([H1:H50000], _
WorksheetFunction.Match(MARCADOR, [H1:H50000&AH1:AH50000&G1:G50000], 0), 0).Row

CONT = CONT + 1
loop

Na planilha existem 1000 dados onde somente 10 possuem os critérios necessários para a pesquisa.

Dados = JONATHAS CERQUEIRA DOS SANTOS + 201412 + 1

Gostaria que no loop trouxesse as linhas onde constam estes dados.

Neste modelo que eu fiz somente traz a primeira linha...

 
Postado : 18/06/2015 9:25 pm
Wagner Morel
(@wagner-morel-vidal-nobre)
Posts: 0
Illustrious Member
 

ericsson,

Bom dia!

O que você está querendo fazer com essa macro? Eu não entendo, não sei e nem gosto de utilizar funções da interface do Excel dentro do VBA. Sei que deve ter outras formas de fazer o que você quer com código. Todavia, é preciso entender o que você quer...

Desenvolvo pequenas soluções em VBA Excel a valores que variam entre R$ 50,00 a R$ 200,00. Se te interessar, entre no meu instagran (vba_excel_desenvolvimento)

Atenciosamente
Wagner Morel

 
Postado : 19/06/2015 8:23 am
(@ericsson)
Posts: 54
Trusted Member
Topic starter
 

Bom, a iteração tem que ser por código, visto que, o procedimento visa faz o seguinte:

Por meio do MARCADOR = JONATHAS CERQUEIRA DOS SANTOS + 201412 + 1, realizar uma busca em 3 colunas (H-AH-G) contendo os respectivos dados na sequência e por meio de um loop trazer a posição (número) linha a linha de cada dado.

Não posso passar a planilha porque possui dados de vendas específicos do Grupo em que trabalho.

E o fato de ter o seguinte código [H1:H50000&AH1:AH50000&G1:G50000] é porque este foi o único jeito que encontrei de declarar uma Matriz para pesquisa.

'CONTA QUANTOS DADOS EXISTEM REFERENTE AO MÊS SELECIONADO__________________________________________________________
QUANT_MARCADOR = _
WorksheetFunction.CountIfs( _
Sheets("BANCO").Columns("H"), Sheets("COMISSÃO_VENDEDOR").Cells(7 + L, 3), _
Sheets("BANCO").Columns("AA"), 201412, _
Sheets("BANCO").Columns("G"), 1)


MARCADOR = Sheets("COMISSÃO_VENDEDOR").Cells(7 + L, 3) & 201412 & 1
Sheets("BANCO").Select

'LOOP PARA TRAZER AS LINHAS ONDE CONSTA AS INFORMAÇÕES DO VENDEDOR SELECIONADO__________________________
Do While CONT < QUANT_MARCADOR

LINHA_MARCADOR = 0
On Error Resume Next
LINHA_MARCADOR = WorksheetFunction.Index([H1:H50000], _
WorksheetFunction.Match(MARCADOR, [H1:H50000&AH1:AH50000&G1:G50000], 0), 0).Row

CONT = CONT + 1
loop

Então na minha planilha existem 4 dados onde o vendedor JONATHAS CERQUEIRA DOS SANTOS vendeu consórcio no mês 12/2014 (201412) e recebeu a primeira cota.

Tenho que saber por meio deste loop quais são as linhas onde o nome JONATHAS CERQUEIRA DOS SANTOS possui estes critérios.

Acho que fui mais claro...

 
Postado : 19/06/2015 3:34 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

As funções Indice/Corresp (Index/Match) retornam todas as ocorrências basicamente quando em matricial. Utiliza-las matricialmente em VBA não tentei, e como disse o colega Morel, eu também não sou muito adepto a tal.
Creio que o que deseja pode ser obtido por um loop + If ... and ... and.. ou ainda Tabela Dinâmica.
Também creio que o que deseja poderá ser obtido utilizando o VBA em conjunto com autofiltro do Excel.
Veja no modelo se lhe auxilia.
Se não lhe auxiliar, poste um modelo; dados reais/confidenciais devem ser substituidos por dados/valores fictícios; porem que seja fiel ao layout de sua planilha real, demostrando manualmente como é e como deseja que retorne.

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 20/06/2015 7:17 am
(@ericsson)
Posts: 54
Trusted Member
Topic starter
 

Agradeço as respostas do Reinaldo e do Wagner!!

Reinaldo olhei o arquivo enviado e agradeço o seu exemplo porque vai me ajudar muito em outro trabalho no qual utilizo um loop para trazer as informações de certos períodos.

Quanto a minha dúvida, a questão é que eu preciso saber as linhas onde consta cada informação para poder incluir novos dados e também carregá-las em determinada parte do meu relatório (neste caso passarei a utilizar o seu exemplo).

Bom, de qualquer forma após muita dor de cabeça e pesquisa encontrei a solução que me atende, e vou deixar o código aqui para quem um dia possa ter o mesmo problema.

Sub REGISTRO_METAS_ATINGIDAS()
Dim QUANT_MARCADOR, L, LIN, LIN2, LINHA_MARCADOR As Integer
Dim MARCADOR As String

'CONTA QUANTOS DADOS EXISTEM REFERENTE AO MÊS SELECIONADO__________________________________________________________
QUANT_MARCADOR = _
WorksheetFunction.CountIfs( _
Sheets("BANCO").Columns("B"), "JONATHAS CERQUEIRA DOS SANTOS", _
Sheets("BANCO").Columns("C"), 201412, _
Sheets("BANCO").Columns("A"), 1)

MARCADOR = "JONATHAS CERQUEIRA DOS SANTOS" & "201412" & 1

LIN2 = 0
LIN = 0

Do While L < 3

LIN = WorksheetFunction.Match(MARCADOR, _
Sheets("BANCO").Evaluate("B" & LIN2 + 1 & ":B65535&C" & LIN2 + 1 & ":C65535&A" & LIN2 + 1 & ":A65535"), 0) + LIN
LIN2 = LIN

L = L + 1
Loop

End Sub

O método Evaluate permite que eu altere em tempo de execução a matricial assim eu consigo ir diretamente para o dado que eu necessito. Desta forma, eu posso incluir ou alterar todos os dados dentro de uma série de critério.

O limite de linhas no modelo matricial é de 65535 linhas, o que pode ser ajustado da forma que o usuário desejar também.

Vlw Pessoal!!!

 
Postado : 20/06/2015 9:24 am