Notifications
Clear all

Procv Multiplo com validação condicional de data (Reabrindo)

6 Posts
4 Usuários
0 Reactions
1,828 Visualizações
(@vainer)
Posts: 0
New Member
Topic starter
 

A necessidade de um procv com retorno de todas as referências, a função do Benzadeus e uma função de Adilson Soledade, trabalhando em conjunto atendem isso.
Tenho tentado turbinar uma função Procv que me retorne todas as ocorrências (separadas por vígula em uma mesma célula) de modo que haja um condicional para retornar somente de uma dado intervalo de tempo. Tenho as colunas: Cliente, Pedido, Data.
Ou seja, a fórmula que imagino deveria me fornecer todos os pedidos de um Cliente (escrito em uma célula de referência) em um intervalo de datas em uma coluna (não necessariamente ordenada sendo: datamin em uma célula e datamax em outra uma célula). Informo a data min, a data máxima, e o sistema busca todos os pedidos de um determinado cliente neste periodo e concatena separando por virgula.

No topico antigo:
viewtopic.php?f=10&t=5300

O Andre informou o seguinte:
"Já corrigi onde havia o erro:
If varTemp(l, 1) = sProcura And varTemp(l, lngColunaData) <= dtMin And varTemp(l, lngColunaData) >= dtMax Then

neste And o certo seria um Then If e após o primeiro End If emendar mais um End If.

A resolução foi dada pelo próprio Benzadeus a quem agradeço!
Vlw."

Fiz o ajuste conforme descrito, porém a função apresenta erro. Segue a função já ajustada

Function PROCVCONDATA(sProcura As String, vBD As Variant, lngOffset As Long, lngColunaData As Long, dtMin As Date, dtMax As Date)

'Altere essa constante se quiser utilizar outro caractere como dígito separador.
Const strSeparador As String = "; "

Dim l As Long
Dim lngTotal As Long
Dim strTemp() As String
Dim varTemp As Variant

'Transformo o parâmetro de entrada (que pode ser uma matriz ou uma Range) para trabalhar
'apenas com uma Variant:
varTemp = CVar(vBD)

For l = LBound(varTemp, 1) To UBound(varTemp, 1)

' o problema esta nesta linha
If varTemp(l, 1) = sProcura Then If varTemp(l, lngColunaData) <= dtMin And varTemp(l, lngColunaData) >= dtMax Then

'Foi encontrada uma correspondência na primeira coluna do vetor de varTemp.
lngTotal = lngTotal + 1
ReDim Preserve strTemp(1 To lngTotal)
strTemp(lngTotal) = varTemp(l, lngOffset)
End If
End If
Next l

If IsArrayEmpty(strTemp) Then
'Caso não seja encontrada nenhuma correspondência, a função retornará uma mensagem.
PROCVCONDATA = "não encontrado"
Exit Function
Else
'Join concatena todas as correspondências encontradas do vetor strTemp:
PROCVCONDATA = Join(strTemp, strSeparador)
End If

End Function

End Function

Alguma luz de onde esta o erro ??? :evil: :evil: :evil:

 
Postado : 20/04/2015 2:49 pm
(@luizhcosta)
Posts: 0
New Member
 

Olá, vi seu post e me recordou 2 códigos que consegui na Net. Eles se completam e fazem algo parecido ao que você colocou.

Este faz uma busca e retornar todas as ocorrências no intervalo. Ocorre que ele lista tudo numa única célula. Adaptando tem como inserir um separador de acordo com sua necessidade.

sintaxe: Sintaxe: =procvmúltiplo(intervalo_de_comparação;intervalo de retorno)

Function PROCVMÚLTIPLO(NomePesquisa As String, IntervaloPesquisa As Range, IntervaloRetorno As Range) As String
Dim Valor, Nome
Dim k As Integer
Application.Volatile
k = 1
For Each Nome In IntervaloPesquisa
If Nome = NomePesquisa Then
Valor = IntervaloRetorno(k, 1)
PROCVMÚLTIPLO = PROCVMÚLTIPLO & Valor & " "
End If
k = k + 1
Next Nome
PROCVMÚLTIPLO = Left(PROCVMÚLTIPLO, Len(PROCVMÚLTIPLO) - 2)
End Function

Este retira elementos de uma lista, útil para colocar o resultado do primeiro código em linhas separadas.

sintase: =elemento(célula_com_o_resultado_do_código_anterior;" ";1)

O 1 na ´formula refere-se ao 1º elemento.

Function PROCVMÚLTIPLO(NomePesquisa As String, IntervaloPesquisa As Range, IntervaloRetorno As Range) As String
Dim Valor, Nome
Dim k As Integer
Application.Volatile
k = 1
For Each Nome In IntervaloPesquisa
If Nome = NomePesquisa Then
Valor = IntervaloRetorno(k, 1)
PROCVMÚLTIPLO = PROCVMÚLTIPLO & Valor & " "
End If
k = k + 1
Next Nome
PROCVMÚLTIPLO = Left(PROCVMÚLTIPLO, Len(PROCVMÚLTIPLO) - 2)
End Function






Public Function Elemento(ByRef Texto As Variant, _
                         Optional ByVal Delimitador As String = " ", _
                         Optional ByVal Indice As Long = 1) As Variant
On Error GoTo TratarErro
    Elemento = VBA.Split(Application.WorksheetFunction.Trim(Texto), Delimitador)(Indice - 1)
On Error GoTo 0
Exit Function
TratarErro:
    Elemento = ""
End Function

Ambos devem ser inseridos na planilha em um módulo.
Boa sorte

 
Postado : 20/04/2015 4:11 pm
(@vainer)
Posts: 0
New Member
Topic starter
 

Prezado Luiz,

Seus codigos são interessantes, agradeço o retorno. Mas numa solução "ideal" eu precisaria ajustar esse codigo de procmultiplo. Acredito que o ajuste a ser feito seja algo simples, porém ainda não consegui visualizar.

De qualquer forma, agradeço a ajuda.

 
Postado : 23/04/2015 1:37 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Vainer, seria melhor anexar um modelo reduzido com alguns dados e como deveria ficar o resultado, assim fica melhor analisar uma vez que os tópicos que indicou não tem nenhum exemplo.

[]s

 
Postado : 23/04/2015 5:25 pm
(@vainer)
Posts: 0
New Member
Topic starter
 

Prezado Mauro Coutinho.

Coloquei em anexo uma "Planilha com o modelo de busca a ser feito".

A ideia é Criar uma Função para Buscar a "Produção" de Cada Atividade dentro de um intervalo de tempo e concatenar essa informação. Ex: Buscar pelas "Torres que foram Montadas" entre "20/04/15" e "26/04/15" e "concatenar o resultado". Resultado final ficará conforme a tabela em anexo. Dados estão sendo buscados da Planilha "torres".

Acredito que a função que eu coloquei nessa mensagem atenda isto, mas esta faltando algum ajuste.

Grato desde já.

 
Postado : 27/04/2015 9:00 am
(@jrneto-sp)
Posts: 0
New Member
 

Boa noite!

As duas funções resolveram um grande problema meu...em partes.
O problema é que a planilha que estou tentando usá-las tem 80 mil linhas...e aparentemente com mais de 30 mil as funções dão erro.

Alguma sugestão que possa me ajudar, por favor?

Abs

 
Postado : 04/06/2015 12:59 am