Il giorno 9 mag 2022, alle ore 23:27, gianpaolo_marcolongo
<gianpaolo_marcolongo@newwhitebear.net> ha scritto:
Ciao Andrea,
ho esaminato il tuo problema e mi sembra che nel basic fornito ci sia qualcosa che manchi.
Io ho fatto registra macro. Poi ho selezionato l'area - da colonna b a colonna d, perché sulla
colonna a ho riportato i dati relativi a ROW - ho aperto la finestra di dialogo ordina,
selezionato le due chiavi, chiave 1 colonna c, chiave 2 colonna d. E poi ok. terminato il
sorto ho terminato la registrazione della macro, assegnando un nome modulo e un nome macro.
Il basic relativo è quello riportato sotto.
REM ***** BASIC *****
Sub Main
End Sub
sub Ordinamento1
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 ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$B$2:$D$9"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
rem ----------------------------------------------------------------------
rem dispatcher.executeDispatch(document, ".uno:DataSort", "", 0, Array())
rem ----------------------------------------------------------------------
dim args3(11) as new com.sun.star.beans.PropertyValue
args3(0).Name = "ByRows"
args3(0).Value = true
args3(1).Name = "HasHeader"
args3(1).Value = false
args3(2).Name = "CaseSensitive"
args3(2).Value = false
args3(3).Name = "NaturalSort"
args3(3).Value = false
args3(4).Name = "IncludeAttribs"
args3(4).Value = true
args3(5).Name = "UserDefIndex"
args3(5).Value = 0
args3(6).Name = "Col1"
args3(6).Value = 3
args3(7).Name = "Ascending1"
args3(7).Value = true
args3(8).Name = "Col2"
args3(8).Value = 4
args3(9).Name = "Ascending2"
args3(9).Value = true
args3(10).Name = "IncludeComments"
args3(10).Value = false
args3(11).Name = "IncludeImages"
args3(11).Value = true
dispatcher.executeDispatch(document, ".uno:DataSort", "", 0, args3())
end sub
Come noti è assai più corposo del tuo. Poi in organizza macro ho assegnato un pulsante. Chiusa
questa fase ho ripristinato i dati da trattare come in origine - ovviamente al termine della
registrazione macro il foglio è risultato sortato - ed ho eseguito il pulsante assegnato. Il
risultato è quello che tu volevi senza nessun intervento manuale come volevi tu.
Il limite di questa macro è che area e colonne da sortare sono fisse e non modificabili. Se
questo risolve il tuo problema va benissimo ma se le aree o le colonne possono variare no.
Gian Paolo
Il 08/05/22 15:51, Andrea Nardi ha scritto:
Salve a tutti. Ho il seguente problema:
un foglio calc con i seguenti dati:
Col Col Col
A B C
Row
2 1 1 b
3 2 1 a
4 3 3 d
5 4 7 h
6 5 7 g
7 6 4 j
8 7 4 f
9 8 8 k
Vorrei una macro per metterli in ordine secondo la colonna B e poi C.
Il risultato dovrebbe essere il seguente:
Col Col Col
A B C
Row
2 2 1 a
3 1 1 b
4 3 3 d
5 7 4 f
6 6 4 j
7 5 7 g
8 4 7 h
9 8 8 k
Ho utilizzato (come usualmente faccio a lavoro su Excel...) il comando Registra macro.
Ho selezionato le 3 colonne dalla riga 2 alla 9, quindi ho fatto clic sul pulsante [AZ] che
fa comparire l'apposita finestra di dialogo per l'ordinamento. Ho selezionato le due chiavi
di ordinamento e fatto clic su OK. Poi ho terminato la registrazione. Inserito il nome della
macro e del modulo (lasciando quello di default).
La macro registrata è questa:
REM ***** BASIC *****
sub Ordinamento
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 ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$A$2:$C$9"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
rem ----------------------------------------------------------------------
rem dispatcher.executeDispatch(document, ".uno:DataSort", "", 0, Array())
end sub
Noto qualcosa di strano rispetto al codice che normalmente ottengo facendo le stesse
operazioni in Excel ed infatti dopo aver aggiunto un pulsante collegato alla suddetta macro
l'operazione non funziona.
Ho provato ad eliminare il rem dall'ultima riga di codice prima di end sub ed in questo modo
eseguendo la macro compare la finestra di dialogo per l'ordinamento e cliccando su OK sembra
funzionare l'operazione, ma io vorrei che la cosa avvenisse in modo trasparente semplicemente
premendo il pulsante che ho aggiunto.
Cosa mi sfugge?
—
Distinti Saluti
Andrea NARDI
--
Come cancellarsi: E-mail users+unsubscribe@it.libreoffice.org
Problemi? https://it.libreoffice.org/supporto/mailing-lists/come-cancellarsi/
Linee guida per postare + altro: https://wiki.documentfoundation.org/Local_Mailing_Lists/it
Archivio della lista: https://listarchives.libreoffice.org/it/users/
Privacy Policy: https://www.documentfoundation.org/privacy