Pannello di Controllo Moderatore ]

[Risolto]Ordina colonne

Creare una macro - Scrivere uno script - Usare le API

[Risolto]Ordina colonne

Messaggioda epico » giovedì 8 marzo 2018, 14:50

Salve,
le macro le risultano mi sono abbastanza indigeste …
Vorrei ordinare le colonne in base al valore in E1
In E1 "2" ordina in base alla colonna 2

riga incriminata
args5(5).Value = 3 ' colonna C
tipo
args5(5).Value = E1
ma non và

:crazy: Grazie

Codice: Seleziona tutto   Espandi visualeStringi visuale
sub ordina
dim document   as object, dispatcher as object
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

oSheet = ThisComponent.Sheets(0)
oCursor =oSheet.createCursor
oCursor.gotoEndOfUsedArea(False)
LastRow = oCursor.RangeAddress.EndRow + 1

dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$A$2:$C$" & LastRow
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())

dim args5(6) as new com.sun.star.beans.PropertyValue
args5(0).Name = "ByRows"
args5(0).Value = true
args5(1).Name = "HasHeader"
args5(1).Value = false
args5(2).Name = "CaseSensitive"
args5(2).Value = false
args5(3).Name = "IncludeAttribs"
args5(3).Value = true
args5(4).Name = "UserDefIndex"
args5(4).Value = 0
args5(5).Name = "Col1"
args5(5).Value = 3 ' colonna C
args5(6).Name = "Ascending1"
args5(6).Value = true

dispatcher.executeDispatch(document, ".uno:DataSort", "", 0, args5())

rem ----------------------------------------------------------------------
dim args6(0) as new com.sun.star.beans.PropertyValue
args6(0).Name = "ToPoint"
args6(0).Value = "$A$1"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args6())
end sub
Allegati
ordina_01.ods
(12.08 KiB) Scaricato 17 volte
Ultima modifica di epico il sabato 10 marzo 2018, 11:59, modificato 1 volta in totale.
OpenOffice 4.1 su Win10
epico
 
Messaggi: 40
Iscritto il: mercoledì 4 giugno 2014, 11:53

Re: Ordina colonne

Messaggioda epico » venerdì 9 marzo 2018, 8:42

Facendo ricerche ho trovato questo thread che sfrutta la posizione del mouse (nella relativa colonna) per fare l'ordinamento http://forum.openoffice.org/it/forum/viewtopic.php?f=9&t=5367
con codice
Codice: Seleziona tutto   Espandi visualeStringi visuale
sub OrdinaCrescenteColonnaPosizioneCursore
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object

rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
rem Numero della colonna della cella selezionata all'attivazione della Macro
NumeroColonna = ThisComponent.getCurrentSelection.cellAddress.Column + 1  ' 2

rem ----------------------------------------------------------------------
dim args1(7) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ByRows"
args1(0).Value = true
args1(1).Name = "HasHeader"
args1(1).Value = false
args1(2).Name = "CaseSensitive"
args1(2).Value = false
args1(3).Name = "NaturalSort"
args1(3).Value = false
args1(4).Name = "IncludeAttribs"
args1(4).Value = true
args1(5).Name = "UserDefIndex"
args1(5).Value = 0
args1(6).Name = "Col1"
args1(6).Value = NumeroColonna '  Numero della colonna della cella selezionata all'attivazione della Macro
args1(7).Name = "Ascending1"
args1(7).Value = true

dispatcher.executeDispatch(document, ".uno:DataSort", "", 0, args1())

rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "ToPoint"
args2(0).Value = "$D$1"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args2())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:ClearContents", "", 0, Array())

rem ----------------------------------------------------------------------
dim args4(0) as new com.sun.star.beans.PropertyValue
args4(0).Name = "ToPoint"
args4(0).Value = "$B$1"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args4())

end sub

ma non sono riuscito ad adattare alla mia necessità
OpenOffice 4.1 su Win10
epico
 
Messaggi: 40
Iscritto il: mercoledì 4 giugno 2014, 11:53

Re: Ordina colonne

Messaggioda patel » venerdì 9 marzo 2018, 9:33

non ho capito come vuoi ordinare, allega un file con anche il risultato desiderato
-------------------
OpenOffice 4.1 e Libre Office 6 su Windows 10
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
patel
Volontario attivo
Volontario attivo
 
Messaggi: 2892
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Ordina colonne

Messaggioda epico » venerdì 9 marzo 2018, 10:07

Il file iniziale è composto da 3 colonne
- se in E1 c'è 1 ordina le colonne in base alla colonna A
- se in E1 c'è 2 ordina le colonne in base alla colonna B
- se in E1 c'è 3 ordina le colonne in base alla colonna C

Comè scritto adesso il codice ordina solo in base alla colonna C

Spero di essere stato chiaro, perchè un'altro file file non saprei come impostarlo

Grazie
OpenOffice 4.1 su Win10
epico
 
Messaggi: 40
Iscritto il: mercoledì 4 giugno 2014, 11:53

Re: Ordina colonne

Messaggioda patel » venerdì 9 marzo 2018, 18:16

Codice: Seleziona tutto   Espandi visualeStringi visuale
Sub OrdinaDati
  dim I,lastCol as integer
  Dim oSheetDSC As Object, oDSCRange As Object
  Dim aSortFields(0) As New com.sun.star.util.SortField
  Dim aSortDesc(0) As New com.sun.star.beans.PropertyValue
  oSheet = ThisComponent.CurrentController.ActiveSheet
  c = oSheet.createCursor
  c.gotoEndOfUsedArea(false)
  LastRow = c.RangeAddress.EndRow
   lastCol = 2 ' col C
   ordCol = oSheet.getCellRangeByName("E1").Value - 1
   oDSCRange = oSheet.getCellRangeByPosition(0,1, lastCol,LastRow)    ' range da ordinare
   ThisComponent.getCurrentController.select(oDSCRange)
   aSortFields(0).Field = ordCol

     aSortFields(0).SortAscending = TRUE     'ordine crescente, se si vogliono i dati in ordine decrescente inserire FALSE
     aSortDesc(0).Name = "SortFields"
     aSortDesc(0).Value = aSortFields()
     oDSCRange.Sort(aSortDesc())
End Sub         


-------------------
OpenOffice 4.1 e Libre Office 6 su Windows 10
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
patel
Volontario attivo
Volontario attivo
 
Messaggi: 2892
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Ordina colonne

Messaggioda epico » sabato 10 marzo 2018, 11:57

:super:
Grazie
OpenOffice 4.1 su Win10
epico
 
Messaggi: 40
Iscritto il: mercoledì 4 giugno 2014, 11:53

Re: [Risolto]Ordina colonne

Messaggioda epico » domenica 11 marzo 2018, 12:32

Rileggendo il thread, mi sono reso conto che il titolo non è proprio corretto
infatti la mia richiesta era di ordinare le righe del range in base al valore scritto in E1 (riferito alle colonne interessate)
:knock:
Mi scuso con tutto il forum

Grazie
OpenOffice 4.1 su Win10
epico
 
Messaggi: 40
Iscritto il: mercoledì 4 giugno 2014, 11:53


Torna a Macro e UNO API

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite