Depois de muito me debruçar sobre o problema acabei desenvolvendo uma pequena SUB que fornece o resultado desejado.
Posto a solução para servir de ajuda a outros que precisem de algo semelhante.
Eis a MACRO, que denominei CONGLOB()
A minha intenção era aplicá-la como um FUNÇãO na planilha, que pudesse ser chamada de uma determinada célula mediante a fórmula =CONGLOB( I1 , I2 , I3 , Cel), onde:
i1 - seja o intervalo principal da fonte de dados (C3:Q3)
i2 - o intervalo secundário (do cruzamento dos dados) - C4:Q4
i3 - o intervalo complementar (informações secundárias do registro)
Cel - Endereço de destino para o texto resultante.
REM BASIC
rem Faz o Cruzamento de dois dados interligados, associando a outras duas informações
' referentes ao mesmo registro, e produz um texto descritivo concatenado, devidamente
' pontuado
' No exemplo, organiza vários réus segundo seus crimes, relacionando a data de nascimento
' e idade da data dos fatos.
' Autor Jédison Maidana
'
sub CONGLOB
Para transformar em Função, substituir por:
` ' function CONGLOB (Byval Interv1 as string, interv2 as string, interv3 as string, Dest as string) as string
' (Veja alterações no final do código) `
Dim oSheet, oCelReus, oCelCrims
Dim oCelDNs, oCelIds
Dim oReu(), oReus(), oCrim(), oCrims() as string
Dim oDN(), oDNs() as integer
Dim oId(), oIds() as integer
Dim Lista as String
Dim oEvent(15) as integer
Dim NCr(15) as integer
Dim Col , xx, yy , Li , LS , NR As Integer
'print interv1 , interv2 , Dest
'Definição dos parâmetros de pesquisa
' SE usada como função, retirar o bloco abaixo
Interv1 = "C2:Q2" ' Intervalo da primeira referência (Linha Réus)
interv2 = "C7:Q7" ' Intervalo da segunda referência (Linha Crimes)
interv3 = "C3:Q3" ' Intervalo da Terceira referência (Linha D.Nascimento)
interv4 = "C4:Q4" ' intervalo da quarta referência (Idade)
Dest = "L32" ' Célula onde o texto final será inserido
Tx0$ = "(Nascido em "
Tx1$ = "anos de idade na data do fato), foi denunciado Pelo Ministério Público por incurso nas sanções do "
Tx2$ = "("
Tx3$ = "anos), por violação do"
' Define o documento ativo como fonte dos dados
oSheet = ThisComponent.CurrentController.ActiveSheet
' Armazena os dados de Interv1 na matriz oReu()
oCelReus = oSheet.getCellRangeByName( Interv1 )
oReus() = oCelReus.getDataArray()
oReu() = oReus(0)
' Armazena os dados de Interv2 na matriz oCrime()
oCelCrims = oSheet.getCellRangeByName( interv2 )
oCrims() = oCelCrims.getDataArray()
oCrim() = oCrims(0)
' Armazena os dados de Interv3 na matriz oDNasc()
oCelDNs = oSheet.getCellRangeByName( interv3 )
oDNs() = oCelDNs.getDataArray()
oDN() = oDNs(0)
' Armazena os dados de Interv4 na matriz oIdade()
oCelIds = oSheet.getCellRangeByName( interv4 )
oIds() = oCelIds.getDataArray()
oId() = oIds(0)
Rem Vincula os Réus aos Eventos - Evento(x) cometido pelo mesmo réu do evento X
For Col = LBound(oReu()) To UBound(oReu())
oEvent(Col) = Col
For xx = 0 to Col
if UCase(oReu(Col)) = UCase(oReu(xx)) then
' Caixa alta pra não separar iguais
oEvent(Col) = xx
exit for
end if
Next
Next
' Montagem da lista conglobante
Lista =
Li = LBound(oReu())
LS = UBound(oReu())
' Pesquisa quantos crimes (total) cada reu cometeu
For Col = Li to LS
For xx = Col to LS
if Col = oEvent(xx) then
NCR(Col) = NCR(Col) + 1
End if
Next
Next
For Col = Li to LS
Reu$ = oReu(Col)
if Reu$ = Then
Exit for
Elseif Col = oEvent(Col) then
Lista = Lista & Reu$
if Col = 0 then
Lista = Lista & Tx0$ & Format(oDN(Col), ddmmyyyy) & , & oId(Col) & Tx1$
Else Lista = Lista & Tx2$ & Format(oDN(Col), ddmmyyyy) & , & oId(Col) & Tx3$
End if
For xx = Col to LS
if oEvent(xx) = Col then
Lista = Lista & & oCrim(xx)
NR = 0
For yy = xx to LS
if UCase(oCrim(xx))= UCase(oCrim(yy)) and oEvent(yy) = Col then
' Caixa Alta pra não separar iguais
NR = NR + 1
oEvent(yy) = LS + 1
end if
Next
if NR 1 then
Lista = Lista & ( & NR & x)
end if
NCR(Col) = NCR(Col) - NR ' Retira da contagem os delitos duplicados
If NCR(Col) 1 then
Lista = Lista & ,
Else if NCR(Col) 0 then
Lista = Lista & e
Else Lista = Lista & ;
End if
End if
end if
Next
Lista = Lista & chr$(10)
Else
End if
Next
ThisComponent.Sheets(0).getCellRangebyName(Dest).string = Lista
'MsgBox Lista
' Se usada como function, trocar End Sub por:
' CONGOB = "Concatenado"
' End Function
End sub