Segue arquivo com possível solução:
Ask_AlimentarCaixaListaComCriterio.ods (73,0,KB)
.
Macro utilizada:
Sub CarregarCidades(oEvent, Optional evento)
Dim oPlan As Object ' Planilha ativa
Dim oIntervalo As Object
Dim clEstado As Object
Dim clCidade As Object
Dim colecaoCidade As New Collection 'Objeto Collection - https://helponline.libreoffice.org/latest/pt-BR/text/sbasic/shared/collection.html?DbPAR=BASIC#bm_id3149205
Dim i&
Dim j%
Dim uf$, cidade$
REM Obtem os controles pelo evento
evento = oEvent.Source.Context
For i = 0 To Ubound(evento.controls())
Select Case evento.controls(i).Model.Name
Case "clEstado" : clEstado = evento.controls(i)
Case "clCidade" : clCidade = evento.controls(i)
End Select
Next i
REM Planilha ativa
oPlan = ThisComponent.CurrentController.ActiveSheet
REM Obtem o intervalo de dados em matriz (LEITURA MAIS RÁPIDA DE DADOS)
i = 0
j = 0
Do Until oPlan.getCellByPosition(0, i).String = Empty
i = i+1
Do Until oPlan.getCellByPosition(j, 0).String = Empty
j = j+1
Loop
Loop
oIntervalo = oPlan.getCellRangeByPosition(0, 0, j, i).DataArray
REM Obtem o Estado da Caixa de Lista
uf = clEstado.SelectedItem
REM Cria a coleção com elementos usando como chave o próprio item
REM Repetir uma chave gera um erro, pois o índice deve ser único
REM Usamos o tratamento de erro para pular o item que gerou o erro
REM Isso faz com que os itens não se repitam no controle
For i = 1 To UBound(oIntervalo())
If oIntervalo(i)(1) = uf Then
On Error Resume Next
cidade = oIntervalo(i)(0)
colecaoCidade.add (cidade, cidade)
End If
Next i
REM Limpa a Caixa de Lista Cidades
clCidade.Model.removeAllItems()
REM Alimenta a Caixa de Lista Cidades
For Each cidade In colecaoCidade
clCidade.addItem( cidade, colecaoCidade.count )
Next
MsgBox "Cidades atualizadas!"
End Sub
----COMPLEMENTO-----
Arquivo com base na descrição abaixo:
Ask_ListBoxValidacao.ods (17,7,KB)
.
Código usado:
Sub AlimentarCaixaDeLista(oEvent, Optional oCtrl)
Dim oListBox1 As Object
Dim oListBox2 As Object
Dim oNamedRange As Object
Dim sItem As Variant
Dim sCriterio$
Dim i%, j%
REM Obtem as Caixas de Lista por meio de evento
oCtrl = oEvent.Source.Context.Controls
For i = 0 To UBound( oCtrl() )
Select Case oCtrl(i).Model.Name
Case "Caixa de lista 1" : oListBox1 = oCtrl(i)
Case "Caixa de lista 2" : oListBox2 = oCtrl(i)
End Select
Next i
REM Obtem o texto/item
sCriterio = oListBox1.SelectedItem
REM Limpa a Caixa de Lista 2
oListBox2.Model.removeAllItems()
REM Obtem os intevalos nomeados
oNamedRange = ThisComponent.NamedRanges
REM Compara o intervalo nomeado com o criterio
REM Se corresponder, obtem os dados em matriz
REM Alimenta a Caixa de Lista
For i = 0 To oNamedRange.Count-1
If oNamedRange.ElementNames(i) = sCriterio Then
sItem = oNamedRange.getByName(sCriterio).getReferredCells(i).DataArray
For j = 0 To UBound(sItem())
REM Dificuldade em ordenar crescente.
rem Solução: valor do parâmetro posição alto (A CAIXA PARA DE PREENCHER QUANDO ACABA OS ITENS)
oListBox2.addItem(sItem(j)(0), 50)
Next j
End If
Next i
End Sub