[Risolto] Ordinare colonne tramite pulsante.

Discussioni sull'applicazione per i fogli di calcolo
Rispondi
GYa-n0S
Messaggi: 8
Iscritto il: mercoledì 14 maggio 2014, 2:16

[Risolto] Ordinare colonne tramite pulsante.

Messaggio 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.
Allegati
Nuovo OpenDocument - Foglio elettronico.ods
Aiutooo!
(13.03 KiB) Scaricato 209 volte
Ultima modifica di charlie il lunedì 26 maggio 2014, 14:32, modificato 2 volte in totale.
Motivazione: Inserito segno di spunta verde
Apache Open Office 4.0.0 - Windows 7 Ultimate
patel
Volontario attivo
Volontario attivo
Messaggi: 4030
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Ordinare tramite pulsante.

Messaggio 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
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
GYa-n0S
Messaggi: 8
Iscritto il: mercoledì 14 maggio 2014, 2:16

Re: Ordinare tramite pulsante.

Messaggio da GYa-n0S »

Quindi? Credo di non aver compreso...
Apache Open Office 4.0.0 - Windows 7 Ultimate
patel
Volontario attivo
Volontario attivo
Messaggi: 4030
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Ordinare tramite pulsante.

Messaggio da patel »

hai provato il codice che ti ho allegato ?
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
Avatar utente
unlucky83
Volontario
Volontario
Messaggi: 2355
Iscritto il: lunedì 7 gennaio 2013, 1:23
Località: Latina

Re: Ordinare tramite pulsante.

Messaggio 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) ;)
LibO:Versione: 6.2.8.2
Build ID: 1:6.2.8~rc2-0ubuntu0.16.04.1- 32-bit
-
Se risolvi:
1. Condividi la soluzione qui con noi
2. Metti [Risolto] al titolo del primo messaggio come spiegato qui
GYa-n0S
Messaggi: 8
Iscritto il: mercoledì 14 maggio 2014, 2:16

Re: Ordinare tramite pulsante.

Messaggio 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ù...
Apache Open Office 4.0.0 - Windows 7 Ultimate
patel
Volontario attivo
Volontario attivo
Messaggi: 4030
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Ordinare tramite pulsante.

Messaggio 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
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
GYa-n0S
Messaggi: 8
Iscritto il: mercoledì 14 maggio 2014, 2:16

Re: Ordinare tramite pulsante.

Messaggio 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
Apache Open Office 4.0.0 - Windows 7 Ultimate
patel
Volontario attivo
Volontario attivo
Messaggi: 4030
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Ordinare tramite pulsante.

Messaggio 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
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
GYa-n0S
Messaggi: 8
Iscritto il: mercoledì 14 maggio 2014, 2:16

Re: Ordinare tramite pulsante.

Messaggio 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.
Apache Open Office 4.0.0 - Windows 7 Ultimate
Avatar utente
LUGIUDANI
Messaggi: 400
Iscritto il: martedì 27 marzo 2012, 12:29

Re: Ordinare tramite pulsante.

Messaggio 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
Openoffice.org 3.2
GYa-n0S
Messaggi: 8
Iscritto il: mercoledì 14 maggio 2014, 2:16

Re: Ordinare tramite pulsante.

Messaggio da GYa-n0S »

Grazie a tutti. <3 Ora lo modifico come Risolto.
Apache Open Office 4.0.0 - Windows 7 Ultimate
Rispondi