Macro para Colocar dados Em forma Crescente.

Olá, estou com uma dificuldade em criar um macro para um botão, onde ele faz a ordenação para crescente.

1 Like

É uma coluna única ou tabela ?

Poste um exemplo do arquivo, editando sua pergunta e com o ícone clipe anexe o arquivo.

Após criar o botão na planilha, clique com o botão direito no botão e selecione Propriedades do Controle
.
Vincule sua macro no evento desejado. Sugiro o evento Botão do mouse pressionado ou Aprovar ação.

.
–EDITADO–
Segue macro para ordenar

REM -----------------------------------------------------------------------------
Sub OrdenarDados (Optional pPlanilha as Variant, pIntervalo as String, _
									pColuna1 as Integer, pCrescente1 as Boolean, _
										Optional pColuna2 as Integer, Optional pCrescente2 as Boolean, _
											Optional pColuna3 as Integer, Optional pCrescente3 as Boolean) as Variant

''' Parâmetros: Nome da Planilha, Intervalo a ordenar, 1ª coluna (Col. A = 0, B = 1, etc), Verdadeiro ou Falso (em inglês).
''' 	Pode usar até 3 colunas, sendo 2 opcionais. Definir sempre se verdadeiro ou falso após a coluna.
''' 	Subrotina feita para ser chamada na macro principal.
''' Exemplo de uso:
''' 	Sub MacroPrincipal()
''' 		MinhaPlanilha = ThisComponent.Sheets().getByName( "NOME DA PLANILHA" )
''' 		Call OrdenarDados ( MinhaPlanilha, "A2:G100", 0, true )
''' 	End Sub

'Para obter o intervalo
Dim oIntervalo as Object
'Define 3 campos/colunas para ordenação
Dim Campos(2) as New com.sun.star.util.SortField
'Define quais campos ordenar por meio da variável campos, leia-se colunas
Dim Descritor(0) as New com.sun.star.beans.PropertyValue
	
	'Obtem a planilha onde quer ordenar
	If isMissing( pPlanilha ) then pPlanilha = ThisComponent.CurrentController.getActiveSheet()
	'Obtem o intervalo a ordenar
	oIntervalo = pPlanilha.getCellRangeByName( pIntervalo )
	'Define as propriedades da ordenação
	Campos(0).Field = pColuna1						'1ª Coluna a ordenar
	Campos(0).SortAscending = pCrescente1	'Crescente = True, Decrescente = False
	
	If isMissing( pColuna2 ) then
		pColuna2 = ""
	Else
		Campos(1).Field = pColuna2						'2ª Coluna a ordenar
		Campos(1).SortAscending = pCrescente2	'Crescente? True or False
	End If
	
	If isMissing( pColuna3 ) then
		pColuna3 = ""
	Else	
		Campos(2).Field = pColuna3						'3ª Coluna a ordenar
		Campos(2).SortAscending = pCrescente2	'Crescente? True or False
	End If
	
	'Descritor a aplicar
	Descritor(0).Name = "SortFields"		'Fixo (NÃO SE ALTERA)
	Descritor(0).Value = Campos()			'Fixo (SEMPRE IGUAL A VARIÁVEL USADA PARA CAMPOS)
	
	'Ordena o intervalo definido
	oIntervalo.Sort( Descritor() )
	
End Sub

Olá @FelipeAle, é possível postar um exemplo simples,usando esta macro.
Não consegui fazer funcionar.
Trava no final “oIntervalo.Sort( Campos() )
Estou executando para uma coluna.

Grato

1 Like

Desculpe. Esqueci de testar adequadamente antes.

Esta linha estava errada:

.
O correto é:

oIntervalo.Sort( Descritor() )

.
De qualquer forma, alterei a macro para melhor funcionamento.

Dei uma quebrada no código de acordo com meu entendimento, mas permanecendo a base que o @FelipeAle disponibilizou.

Option Explicit 
'=================================================================
Dim ws 		As Object 
Dim sh		As String
Dim dw 		As Object  
Dim col1	As Long, col2 As Long, col3	As Long 
Dim Ordem1	As Boolean, Ordem2 As Boolean, Ordem3 As Boolean
Dim btnEditar As Object
'=================================================================
''' Parâmetros: 
''' ws = Nome da Planilha, 
'''	sh = Intervalo a ordenar, 
'''	col = 1ª coluna (Col. A = 0, B = 1, etc), 
'''	Verdadeiro ou Falso (em inglês).
'=================================================================
Sub OrdenarCrescente()
	ws = ThisComponent.Sheets().getByName( "Plano de Contas" )
	sh = "A2:D100"
	col1 = 0
	Ordem1 = 1 '1=Crescente | 0=Decrescente
	Call OrdenarDados ( ws, sh , col1 , Ordem1 , col2 , Ordem2 , col3 , Ordem3 )
End Sub
'=================================================================
Sub OrdenarDecrescente()
	ws = ThisComponent.Sheets().getByName( "Plano de Contas" )
	sh = "A2:D100"
	col1 = 0
	Ordem1 = 0 '1=Crescente | 0=Decrescente
	Call OrdenarDados ( ws, sh , col1 , Ordem1 , col2 , Ordem2 , col3 , Ordem3 )
End Sub
'=================================================================
Sub OrdenarDados(	Optional ws as Variant, sh as String, _
					col1 as Integer, Ordem1 as Boolean, _
					Optional col2 as Integer, Optional Ordem2 as Boolean, _
					Optional col3 as Integer, Optional Ordem3 as Boolean) as Variant

''' Pode usar até 3 colunas, sendo 2 opcionais. 
'''	Definir sempre se verdadeiro ou falso após a coluna.

	'Para obter o intervalo
	Dim oIntervalo As Object
	'Define 3 campos/colunas para ordenação
	Dim Campos(2) As New com.sun.star.util.SortField
	'Define quais campos ordenar por meio da variável campos, leia-se colunas
	Dim Descritor(0) As New com.sun.star.beans.PropertyValue
		
	'Obtem a planilha onde quer ordenar
	If isMissing( ws ) Then ws = ThisComponent.CurrentController.getActiveSheet()
		'Obtem o intervalo a ordenar
		oIntervalo = ws.getCellRangeByName( sh )
		'Define as propriedades da ordenação
		Campos(0).Field = col1				'1ª Coluna a ordenar
		Campos(0).SortAscending = Ordem1	'Crescente = True, Decrescente = False
		
		If isMissing( col2 ) Then 
			col2 = ""
		Else
			Campos(1).Field = col2				'2ª Coluna a ordenar
			Campos(1).SortAscending = Ordem2	'Crescente? True or False
		End If
		
		If isMissing( col3 ) Then 
			col3 = ""
		Else	
			Campos(2).Field = col3				'3ª Coluna a ordenar
			Campos(2).SortAscending = Ordem2	'Crescente? True or False
	End If
		
		'Descritor a aplicar
		Descritor(0).Name = "SortFields"		'Fixo (NÃO SE ALTERA)
		Descritor(0).Value = Campos()			'Fixo (SEMPRE IGUAL A VARIÁVEL USADA PARA CAMPOS)
		
		'Ordena o intervalo definido
		oIntervalo.Sort( Descritor() )
End Sub
'=================================================================
Sub HabilitaToggle
	ws = ThisComponent.Sheets().getByName( "Plano de Contas" )
	dw = ws.getDrawPage()
	dw = ws.DrawPage.Forms.getByName( "Formulário" )
	btnEditar = dw.getByName("btnEditar") 
 
	btnEditar.ImageAlign = 3
	
	If 	btnEditar.State = 1 Then  
		btnEditar.BackGroundColor = 16640250
		btnEditar.Label = "Crescente"
		Call OrdenarCrescente 
	Else 	
		btnEditar.BackGroundColor = 12381134
		btnEditar.Label = "Decrescente"
		Call OrdenarDecrescente 
	End If		 
End Sub 
'=================================================================

Segue planilha com os códigos para ordenação crescente e decrescente utilizando a propriedade
> Toggle do botão de comando.
macro-ordenar-wb.ods (55.1 KB)

1 Like

Código inserindo a macro crescente/decrescente diretamente na macro do botão de comando.

Option Explicit 
'=================================================================
Dim ws 		As Object 
Dim sh		As String
Dim dw 		As Object  
Dim col1	As Long, col2 As Long, col3	As Long 
Dim Ordem1	As Boolean, Ordem2 As Boolean, Ordem3 As Boolean
Dim btnEditar As Object
'=================================================================
''' Parâmetros: 
''' ws = Nome da Planilha, 
'''	sh = Intervalo a ordenar, 
'''	col = 1ª coluna (Col. A = 0, B = 1, etc), 
'''	Verdadeiro ou Falso (em inglês).
'=================================================================
Sub DadosPlanilha
	ws = ThisComponent.Sheets().getByName( "Plano de Contas" )

	dw = ws.getDrawPage()
	dw = ws.DrawPage.Forms.getByName( "Formulário" )
	btnEditar = dw.getByName("btnEditar")
	btnEditar.ImageAlign = 3
	
	sh = "A2:D100"
	col1 = 0
End Sub
'=================================================================
Sub OrdenarDados(	Optional ws as Variant, sh as String, _
					col1 as Integer, Ordem1 as Boolean, _
					Optional col2 as Integer, Optional Ordem2 as Boolean, _
					Optional col3 as Integer, Optional Ordem3 as Boolean) as Variant

''' Pode usar até 3 colunas, sendo 2 opcionais. 
'''	Definir sempre se verdadeiro ou falso após a coluna.

	'Para obter o intervalo
	Dim oIntervalo As Object
	'Define 3 campos/colunas para ordenação
	Dim Campos(2) As New com.sun.star.util.SortField
	'Define quais campos ordenar por meio da variável campos, leia-se colunas
	Dim Descritor(0) As New com.sun.star.beans.PropertyValue
		
	'Obtem a planilha onde quer ordenar
	If isMissing( ws ) Then ws = ThisComponent.CurrentController.getActiveSheet()
		'Obtem o intervalo a ordenar
		oIntervalo = ws.getCellRangeByName( sh )
		'Define as propriedades da ordenação
		Campos(0).Field = col1				'1ª Coluna a ordenar
		Campos(0).SortAscending = Ordem1	'Crescente = True, Decrescente = False
		
		If isMissing( col2 ) Then 
			col2 = ""
		Else
			Campos(1).Field = col2				'2ª Coluna a ordenar
			Campos(1).SortAscending = Ordem2	'Crescente? True or False
		End If
		
		If isMissing( col3 ) Then 
			col3 = ""
		Else	
			Campos(2).Field = col3				'3ª Coluna a ordenar
			Campos(2).SortAscending = Ordem2	'Crescente? True or False
	End If
		
		'Descritor a aplicar
		Descritor(0).Name = "SortFields"		'Fixo (NÃO SE ALTERA)
		Descritor(0).Value = Campos()			'Fixo (SEMPRE IGUAL A VARIÁVEL USADA PARA CAMPOS)
		
		'Ordena o intervalo definido
		oIntervalo.Sort( Descritor() )
End Sub
'=================================================================
Sub HabilitaToggle
	Call DadosPlanilha	
	If 	btnEditar.State = 1 Then  
		btnEditar.BackGroundColor = 16640250
		btnEditar.Label = "Crescente"
		
		Ordem1 = 1 '1=Crescente | 0=Decrescente
		Call OrdenarDados ( ws, sh , col1 , Ordem1 , col2 , Ordem2 , col3 , Ordem3 ) 
	Else 	
		btnEditar.BackGroundColor = 12381134
		btnEditar.Label = "Decrescente"
		
		Ordem1 = 0 '1=Crescente | 0=Decrescente
		Call OrdenarDados ( ws, sh , col1 , Ordem1 , col2 , Ordem2 , col3 , Ordem3 ) 
	End If		 
End Sub 
'=================================================================

macro-ordenar-wb-oo.ods (37.3 KB)

1 Like