Olá, estou com uma dificuldade em criar um macro para um botão, onde ele faz a ordenação para crescente.
É 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
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)
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)