Ordenar uma listbox via macro

Boa noite, é possível classificar um listbox via macro sem que seja vinculado a intervalo de célula, mas sim direto no objeto com os dados já inseridos. Desde já agradeço.

Oi @RonaldoElias, tudo bem?

Voce consegue colocar aqui a versão do seu sistema operacional, a versão do seu LibreOffice (Ajuda > Sobre o LibreOffice > Informações da Versão (clica nas 2 folhas e depois vem aqui, por favor, e cola a informação).

@RonaldoElias , acredito que a classificação só é possível utilizando Controle de Tabelas, pois pesquisei bastante e até agora não encontrei nenhuma referência, mas vamos esperar o posicionamento do @elmau , pois ele conhece os objetos como a palma da mão :smile:.

O que “exactamente” devemos entender por classificar?

Um exemplo claro do que deseja ajudará quem o quiser ajudar.

Ordenar em forma crescente ou decrescente.

@WBastos @RonaldoElias Como a caixa de listas é preenchida? É apenas uma lista de itens de texto? Deseja capturar a lista de itens de texto, colocá-los em uma matriz, classificá-los e colocar a lista classificada de volta na caixa de listas? Precisamos de muito mais informações antes de podermos ajudá-lo.

@James_Zimmerman , A dúvida inicialmente era do @RonaldoElias , mas como o tópico estava aberto resolvi tentar entender também, mas vamos lá…

Podemos tomar como base o preenchimento através de uma matriz capturada de uma lista de uma planilha e posteriormente coloca-la na caixa de listas, como na planilha exemplo abaixo e utilizando o seguinte código:

Option Explicit
'========================================================== 
Dim oDlg as Object
Dim lstHerst As Object
Dim mlstHerst As Object  
Dim wb As Object 
Dim ws As Object
Dim Lin As Long
Dim Arr As Object
Dim i As Long
Dim tmp As Object 
'==========================================================
Sub Dlg_Hersteller_bearbeiten
	DialogLibraries.loadLibrary("Standard") 
	oForm = DialogLibraries.Standard.Dlg_Hersteller
	oDlg = CreateUnoDialog(oForm)
	oDlg.title = "Hersteller bearbeiten" 
   
	lstHerst = oDlg.getControl("lstHerst")
	mlstHerst = lstHerst.Model
 
	wb = ThisComponent.Sheets()
	ws = wb.getByName("Tabelle1")
	Call EntradaDados 

	oDlg.Execute
	oDlg.Dispose    
End Sub
'==========================================================
Sub EntradaDados
	Lin = 1	
	Do Until ws.getCellByPosition( 0 , Lin ).String = Empty
		Lin = Lin + 1 
	Loop
		
   Arr = ws.getCellRangeByName("A2:D" & Lin ).getDataArray()
   
   Dim liste(UBOUND(Arr()))
   
   For i = 0 To UBOUND(Arr())
      tmp = Arr(i)
      liste(i) = EspCol(tmp(0) , 20) & EspCol(tmp(1) , 10)
   Next i
   
   mlstHerst.StringItemList = liste()   
End Sub
'==========================================================
Function EspCol ( iCol , nTam )
	EspCol = Left ( iCol & String ( nTam , " " ) , nTam ) & "| "
End Function

Hersteller3c.ods (34.9 KB)

Se disser “ligado a uma série de células”, está a utilizar formulários e não caixas de diálogo.

Será isso correcto?

Como eu disse, um ficheiro de amostra irá ajudar todos nós que tentamos ajudá-lo.

Ei @elmau , disponibilizei a planilha no comentário acima.

sim, eu vi-o… mas como o colega falou em “ligar células”, fiquei com a dúvida se está a usar formulários.

Por que você está indo com tanto trabalho para escrever uma macro que lança uma janela de diálogo, para que você possa classificar a planilha? Isso pode ser facilmente feito com o botão [Classificar] na barra de ferramentas Calc.

1 Like

Boa pergunta @James_Zimmerman

Entendido senhores,

Agora as dúvidas foram esclarecidas, pelo menos para minha pessoa:

Sub EncerramentoDoTopico
	Dim sInfo As String 

	sInfo = MsgBox("Os dados são inseridos diretamente no controle ListBox?" , MB_YESNO , "Prezado usuário" )
	
	If sInfo = 6 Then
		MsgBox "Ordene os dados antes de inseri-los no controle" , 64 , "Prezado usuário"
	Else 
		MsgBox "Ordene os dados na tabela" , 64 , "Prezado usuário"
	End If
	
	MsgBox "Obrigado a todos pelas contribuições" , 64 , "Agradecimento"
End Sub