Pagina 1 di 1
[Risolto] Ordinare colonne tramite pulsante.
Inviato: mercoledì 14 maggio 2014, 3:02
da GYa-n0S
Ho cercato sul forum e non ho trovato nessun post soddisfacente le mie richieste. Se così non fosse chiedo venia.
Ho necessità di ordinare in modo Crescente o Decrescente per categoria.
Ho creato i pulsanti e vi ho assegnato delle macro. Fino a qui tutto bene.
Il problema è che, ovviamente, per come ho realizzato le macro finché gli elementi restano tali va tutto liscio, ma quando devo aggiungere voci all'elenco non rientrando più nella selezione vengono esclusi.
Per ovviare a ciò dovrei realizzare una macro ogni volta...solo che fare ciò è semplice solo a dirsi perché avendo a che fare con centinaia di voci e dato il fatto che possano aggiungersene altre spesso, dovrei ogni 3x2 realizzare una nuova macro...ciò non mi rende affatto gioioso!
Voi cosa mi consigliereste di fare? Mi affido alle vostre sapienti mani...
Grazie, Luigi.
P.S.: Essendo l'allegato solo un fac-simile fittizio creato apposta per l'occasione ho evitato di aggiungere i pulsantini anche per le altre 2 categorie. La versione originale lo prevede.
Re: Ordinare tramite pulsante.
Inviato: mercoledì 14 maggio 2014, 7:26
da patel
Codice: Seleziona tutto
sub decresc
dim document as object, dispatcher as object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(0) as new com.sun.star.beans.PropertyValue
oSheet = ThisComponent.Sheets(0)
oCursor =oSheet.createCursor
oCursor.gotoEndOfUsedArea(False)
LastRow = oCursor.RangeAddress.EndRow + 1
args1(0).Name = "ToPoint"
args1(0).Value = "$A$3:$C$" & LastRow
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
dispatcher.executeDispatch(document, ".uno:SortDescending", "", 0, Array())
end sub
sub cresc
dim document as object, dispatcher as object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(0) as new com.sun.star.beans.PropertyValue
oSheet = ThisComponent.Sheets(0)
oCursor =oSheet.createCursor
oCursor.gotoEndOfUsedArea(False)
LastRow = oCursor.RangeAddress.EndRow + 1
args1(0).Name = "ToPoint"
args1(0).Value = "$A$3:$C$" & LastRow
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
dispatcher.executeDispatch(document, ".uno:SortAscending", "", 0, Array())
end sub
Re: Ordinare tramite pulsante.
Inviato: mercoledì 14 maggio 2014, 12:11
da GYa-n0S
Quindi? Credo di non aver compreso...
Re: Ordinare tramite pulsante.
Inviato: mercoledì 14 maggio 2014, 12:28
da patel
hai provato il codice che ti ho allegato ?
Re: Ordinare tramite pulsante.
Inviato: mercoledì 14 maggio 2014, 15:04
da unlucky83
Questa parte della macro
oSheet = ThisComponent.Sheets(0)
oCursor =oSheet.createCursor
oCursor.gotoEndOfUsedArea(False)
LastRow = oCursor.RangeAddress.EndRow + 1
args1(0).Name = "ToPoint"
args1(0).Value = "$A$3:$C$" & LastRow
ti consente di riconoscere automaticamente il rigo finale (LastRow) e quindi di selezionare l'area giusta (args1(0).Value = "$A$3:$C$" & LastRow)

Re: Ordinare tramite pulsante.
Inviato: giovedì 15 maggio 2014, 16:16
da GYa-n0S
Funziona perfettamente, però non riesco a modificarlo per eseguire la stessa funzione ma sulle altre colonne per esempio quella da B3 in giù...
Re: Ordinare tramite pulsante.
Inviato: giovedì 15 maggio 2014, 18:33
da patel
immagino che tu abbia usato il registratore di macro per creare il codice originale, riusalo per ordinare secondo la colonna B e guarda cosa cambia
Re: Ordinare tramite pulsante.
Inviato: venerdì 16 maggio 2014, 1:04
da GYa-n0S
L'ho usato per riordinare secondo la colonna B, quello che cambia è che non posso più selezionare tutto mentre registro la macro quindi sono costretto a selezionare solo la colonna B e dopo a dover comunicare al programma che voglio estendere la selezione.
args1(0).Value = "$A$3:$C$" & LastRow diventa args1(0).Value = "$B$3:$B$13" & LastRow
Re: Ordinare tramite pulsante.
Inviato: venerdì 16 maggio 2014, 6:14
da patel
Non è possibile che tu non possa selezionare tutto, ripeti bene le operazioni, comunque io mi sono limitato a spiegarti come estendere la selezione a tutte le righe del foglio ed ho preso per buono il codice che avevi allegato, riguardandolo non è completo e non sembra originato dal registratore, a me viene una macro del genere
Codice: Seleziona tutto
sub colonnab
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$3:$C$" & LastRow
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
dim args2(7) as new com.sun.star.beans.PropertyValue
args2(0).Name = "ByRows"
args2(0).Value = true
args2(1).Name = "HasHeader"
args2(1).Value = false
args2(2).Name = "CaseSensitive"
args2(2).Value = false
args2(3).Name = "NaturalSort"
args2(3).Value = false
args2(4).Name = "IncludeAttribs"
args2(4).Value = true
args2(5).Name = "UserDefIndex"
args2(5).Value = 0
args2(6).Name = "Col1"
args2(6).Value = 2 ' <<<<<<<<<<<<<< colonna da ordinare
args2(7).Name = "Ascending1"
args2(7).Value = true
dispatcher.executeDispatch(document, ".uno:DataSort", "", 0, args2())
end sub
Re: Ordinare tramite pulsante.
Inviato: venerdì 16 maggio 2014, 16:11
da GYa-n0S
Si,si, ti assicuro che è originato dal registratore...anche perché quando l'ho fatto sapevo a malapena cosa fossero le macro...non avevo proprio idea che si potesse programmare in questo modo una macro.
Re: Ordinare tramite pulsante.
Inviato: venerdì 23 maggio 2014, 20:12
da LUGIUDANI
Ciao, io per ordinare i dati su un foglio uso questa macro che la puoi abbinare ad un pulsante o all'evento del foglio.
Codice: Seleziona tutto
Sub OrdinaDati
dim I,iCol 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
'imposta il nome del foglio
oSheet = ThisComponent.CurrentController.ActiveSheet 'ordina il foglio attivo
'oSheet= ThisComponent.Sheets.getByName("NomeFoglio") oppure se vuoi mettere il nome del foglio usi solo questa riga di comando
iCol = getLastUsedColumn(oSheet) 'va a ricercare l'ultima colonna utilizzata nel foglio
I = LastCellUsed(oSheet,0,6) 'va a ricercare sul foglio le celle utilizzate 0 sta per colonna A e 6 sta per riga 7
oDSCRange = oSheet.getCellRangeByPosition(0,6, iCol, I) 'indica il range da ordinare in questo caso da A6 all'ultima riga e colonna utilizzata
ThisComponent.getCurrentController.select(oDSCRange)
aSortFields(0).Field = 3 'a questo punto si va ad inserire il numero di colonna come riferimento di ordine, in questo
caso è la colonna D
aSortFields(0).SortAscending = TRUE 'ordine crescente, se si vogliono i dati in ordine decrescente inserire FALSE
aSortDesc(0).Name = "SortFields"
aSortDesc(0).Value = aSortFields() ' aSortFields(0)
oDSCRange.Sort(aSortDesc()) ' aSortDesc(0)
End Sub
Function GetLastUsedColumn(oSheet as object) as integer
Dim oCell As Object
Dim oCursor As Object
Dim aAddress As Variant
oCell = oSheet.GetCellbyPosition(0, 0)
oCursor = oSheet.createCursorByRange(oCell)
oCursor.GotoEndOfUsedArea(True)
aAddress = oCursor.RangeAddress
GetLastUsedColumn = aAddress.EndColumn
End Function
Function LastCellUsed(oSheets As Object, iCol As Integer, ByVal iStartRow As Integer) As Integer
Do While oSheets.getCellByPosition(iCol, iStartRow).String <> ""
iStartRow = iStartRow + 1
Loop
LastCellUsed = iStartRow
End Function
Re: Ordinare tramite pulsante.
Inviato: domenica 25 maggio 2014, 22:43
da GYa-n0S
Grazie a tutti. <3 Ora lo modifico come Risolto.