Pagina 1 di 1
LibreOffice 7.1xx Macro (registrata) per ordinare
Inviato: lunedì 10 maggio 2021, 12:50
da maria uni
Ciao a tutti,
questo è lo scrpit che OpenOffice mi ha restiuito quando ho registato la macro. All'interno del codice vorrei passare alla MACRO il valore
VALORECELLA che ho evidenziato in grassetto, perché l'ordinamento lo vorrei creare automaticamente e non impostato, ovvero l'utente specifica nella cella VALORECELLA=100 e poi cliccando sul pulsante ordina che funziona ed è correttamente collegato alla MACRO mi ordina secondo quella COLONNA... potete gentilmente spiegarmi come fare per passare il valode della cella? ho pensato così:
Calcoli = ThisComponent.Sheets(0)
VALORE CELLA= (Calcoli.getCellByPosition(8, 3).Value)+5
al valore della cella I3 voglio aggiungerci la somma del numero 5
ma non funziona..
Codice: Seleziona tutto
sub Main
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$6"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
dim tCol as new com.sun.star.beans.PropertyValue
args2(0).Name = "ToPoint"
args2(0).Value = "$A$6:[b]VALORECELLA[/b]"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args2())
rem ----------------------------------------------------------------------
dim args3(6) 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 = "IncludeAttribs"
args3(3).Value = true
args3(4).Name = "UserDefIndex"
args3(4).Value = 0
args3(5).Name = "Col1"
args3(5).Value = 6
args3(6).Name = "Ascending1"
args3(6).Value = false
dispatcher.executeDispatch(document, ".uno:DataSort", "", 0, args3())
end sub
DOMANDA1. in LIBREOFFICE come si fa a registrare una macro? io sono solamente riuscita in OPENOFFICE CALC a troavre il pulsante registra..
DOMANDA2. le MACRO per questione di sicurezza vanno sempre abilitate all'avvio del file. Esite un modo di ad esempio fare un pacchetto esguibile che funziona STANDALONE che avviandolo esegue come un normale programma?
DOMANDA3. i file di OPENOFFICE e LIBREOFFICE possono essere distrubuiti/condivisi come OPENSORUCE o ci sono delle limitazioni?
Grazie mille
Re: LibreOffice 7.1xx Macro (registrata) per ordinare
Inviato: lunedì 10 maggio 2021, 13:13
da maria uni
ho trovato questo codice:
Doc = ThisComponent
Sheet = Doc.Sheets(0) ' foglio 1
VALORECELLA= Sheet.getCellRangeByName("I3").Value
come lo inserisco nel mio SCRIPT?
Re: LibreOffice 7.1xx Macro (registrata) per ordinare
Inviato: lunedì 10 maggio 2021, 14:09
da charlie
Ciao e benvenuta sul forum.
Se intanto ti vuoi presentare, farai cosa gradita. Puoi farlo in questa sezione ->
viewforum.php?f=16
L’utente che apre un quesito si impegna:
In caso di inosservanza saremo costretti ad azioni di “richiamo”, sospensione o chiusura del profilo utente.
Buon proseguimento.
Re: LibreOffice 7.1xx Macro (registrata) per ordinare
Inviato: lunedì 10 maggio 2021, 15:34
da Gaetanopr
maria uni ha scritto:
VALORE CELLA= (Calcoli.getCellByPosition(8, 3).Value)+5
al valore della cella I3 voglio aggiungerci la somma del numero 5
ma non funziona..
Cosa vuol dire ordinare secondo un valore? 100 cosa è ? è il numero di colonna? perché non puoi ordinare per valori ma per colonne in maniera ascendente o discendente.
L'indirizzo di cella I3 si scrive così
maria uni ha scritto:
DOMANDA1. in LIBREOFFICE come si fa a registrare una macro? io sono solamente riuscita in OPENOFFICE CALC a troavre il pulsante registra..
Devi controllare se la funzione di registrazione delle macro sia attivata in Strumenti - Opzioni - LibreOffice - Avanzate.
Saluti
Re: LibreOffice 7.1xx Macro (registrata) per ordinare
Inviato: lunedì 10 maggio 2021, 19:35
da maria uni
Gaetanopr ha scritto:maria uni ha scritto:
VALORE CELLA= (Calcoli.getCellByPosition(8, 3).Value)+5
al valore della cella I3 voglio aggiungerci la somma del numero 5
ma non funziona..
Cosa vuol dire ordinare secondo un valore? 100 cosa è ? è il numero di colonna? perché non puoi ordinare per valori ma per colonne in maniera ascendente o discendente.
L'indirizzo di cella I3 si scrive così
Si esatto 100 è il numero di RIGA ad esempio - può cambiare ma dipende da questa CELLA INPUT "I3", si voglio ordinare per colonne asc/desc
Il tuo codice come lo inserisco nella funzione?
rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
dim tCol as new com.sun.star.beans.PropertyValue
args2(0).Name = "ToPoint"
VALORECELLA = Calcoli.getCellByPosition(8, 2).Value + 5
args2(0).Value = "$A$6:VALORECELLA"
torna errore.. come si inserisce per piacere.. grazie
Gaetanopr ha scritto:
maria uni ha scritto:
DOMANDA1. in LIBREOFFICE come si fa a registrare una macro? io sono solamente riuscita in OPENOFFICE CALC a troavre il pulsante registra..
Devi controllare se la funzione di registrazione delle macro sia attivata in Strumenti - Opzioni - LibreOffice - Avanzate.Saluti
[/quote]
Va bene, grazie mille, verifico.
Un'ultima gentilezza ma non ho capito OpenOffice è la stessa cosa di LibreOffice? quale consigliate per elaborare con i fogli di calcolo?
Re: LibreOffice 7.1xx Macro (registrata) per ordinare
Inviato: lunedì 10 maggio 2021, 22:29
da maria uni
ciao a tutti ho modificato così, ma continua a dare errore, come bisogna inizializzare le variabile e qual è la sintassi corretta,
ho messo la modifica alla riga
rem #################### MODIFICA ##########################
grazie mille
sub Main
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$6"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
dim tCol as new com.sun.star.beans.PropertyValue
args2(0).Name = "ToPoint"
rem #################### MODIFICA ##########################
args2(0).Value = "$A$6:Calcoli.getCellByPosition(8, 2).Value + 5"
rem #################### MODIFICA ##########################
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args2())
rem ----------------------------------------------------------------------
dim args3(6) 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 = "IncludeAttribs"
args3(3).Value = true
args3(4).Name = "UserDefIndex"
args3(4).Value = 0
args3(5).Name = "Col1"
args3(5).Value = 6
args3(6).Name = "Ascending1"
args3(6).Value = false
dispatcher.executeDispatch(document, ".uno:DataSort", "", 0, args3())
end sub
Re: LibreOffice 7.1xx Macro (registrata) per ordinare
Inviato: lunedì 10 maggio 2021, 22:32
da Gaetanopr
maria uni ha scritto:......
Si esatto 100 è il numero di RIGA ad esempio - può cambiare ma dipende da questa CELLA INPUT "I3", si voglio ordinare per colonne asc/desc
Il tuo codice come lo inserisco nella funzione?
Presumendo che l'ordinamento interessi il range da colonna A a colonna F e che VALORECELLA(dovresti essere più chiara) sia la riga finale del range l'istruzione diventa così
Codice: Seleziona tutto
VALORECELLA = Calcoli.getCellByPosition(8, 2).Value + 5
args2(0).Value = "$A$6:$F$" & VALORECELLA
Essendo una variabile VALORECELLA non và inserita tra virgolette
Comunque se fai una ricerca sul forum, trovi diverse macro per fare l'ordinamento dei dati.
Re: LibreOffice 7.1xx Macro (registrata) per ordinare
Inviato: lunedì 10 maggio 2021, 23:46
da maria uni
Ciao grazie per il suggerimento, FUNZIONA TUTTO ALLA GRANDE
sub Main
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$6"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
dim tCol as new com.sun.star.beans.PropertyValue
args2(0).Name = "ToPoint"
Calcoli = ThisComponent.Sheets(0)
VALORECELLA = Calcoli.getCellByPosition(8, 2).Value + 5
args2(0).Value = "$A$6:$F$" & VALORECELLA
rem args2(0).Value = "$A$6:$H52"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args2())
rem ----------------------------------------------------------------------
dim args3(6) 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 = "IncludeAttribs"
args3(3).Value = true
args3(4).Name = "UserDefIndex"
args3(4).Value = 0
args3(5).Name = "Col1"
args3(5).Value = 6
args3(6).Name = "Ascending1"
args3(6).Value = false
dispatcher.executeDispatch(document, ".uno:DataSort", "", 0, args3())
end sub
VOLEVO CHIEDERE È POSSIBILE RICLICCARE SUL PULSANTE "ORDINA" E ORDINARE IN SENSO CRESCENTE SECONDO LA COLONNA A?
Re: LibreOffice 7.1xx Macro (registrata) per ordinare
Inviato: lunedì 10 maggio 2021, 23:53
da Gaetanopr
Ti manca questa parte di codice
La colonna A corrisponde a col1 = 1 per adesso è impostata a 6, ti basta cambiare questo valore, puoi usare una variabile
Re: LibreOffice 7.1xx Macro (registrata) per ordinare
Inviato: martedì 11 maggio 2021, 1:24
da maria uni
Gaetanopr ha scritto:Ti manca questa parte di codice
La colonna A corrisponde a col1 = 1 per adesso è impostata a 6, ti basta cambiare questo valore, puoi usare una variabile
Ciao grazie, avevo visto che mancava qualche cosa ed ho modificato il messaggio con il codice corretto, grazie mille,
ma esiste la possibilità senza stravolgere il codice che al click successivo ordina in senso crescente secondo la colonna A?
grazie
Re: LibreOffice 7.1xx Macro (registrata) per ordinare
Inviato: martedì 11 maggio 2021, 5:58
da patel
maria uni ha scritto:
Un'ultima gentilezza ma non ho capito OpenOffice è la stessa cosa di LibreOffice? quale consigliate per elaborare con i fogli di calcolo?
LibreOffice è di solito più aggiornato di OO, ma sostanzialmente si equivalgono, quindi diventa anche una questione di gusti.
maria uni ha scritto:DOMANDA3. i file di OPENOFFICE e LIBREOFFICE possono essere distrubuiti/condivisi come OPENSORUCE o ci sono delle limitazioni?
nessuna limitazione.
maria uni ha scritto:ma esiste la possibilità senza stravolgere il codice che al click successivo ordina in senso crescente secondo la colonna A?
Esiste, ma dovresti creare una ulteriore sub a cui passare il valore di col1 ed utilizzare una cella di appoggio che tenga conto della sequenza dei clic, mi sembra più semplice per ora aggiungere un secondo pulsante.
Comunque, se vuoi approfondire, allega un file di esempio funzionante
Re: LibreOffice 7.1xx Macro (registrata) per ordinare
Inviato: martedì 11 maggio 2021, 9:11
da Gaetanopr
maria uni ha scritto:
ma esiste la possibilità senza stravolgere il codice che al click successivo ordina in senso crescente secondo la colonna A?
grazie
Nel mio precedente messaggio ti avevo risposto, comunque esistono vari modi per ottenere questo, ti faccio alcuni esempi lavorando per comodità sulla macro registrata e anche perchè ti è più familiare.
1) Come detto prima puoi usare una variabile che prende il valore da una specifica cella, come hai fatto per VALORECELLA, ad esempio se usassi la cella I4 il codice diverrebbe così
Codice: Seleziona tutto
sub Main
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 ----------------------------------------------------------------------
Calcoli = ThisComponent.Sheets(0)
VALORECELLA = Calcoli.getCellByPosition(8, 2).Value + 5
col1 = Calcoli.getCellByPosition(8, 3).Value
rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
dim tCol as new com.sun.star.beans.PropertyValue
args2(0).Name = "ToPoint"
args2(0).Value = "$A$6:$F$" & VALORECELLA
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args2())
rem ----------------------------------------------------------------------
dim args3(6) 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 = "IncludeAttribs"
args3(3).Value = true
args3(4).Name = "UserDefIndex"
args3(4).Value = 0
args3(5).Name = "Col1"
args3(5).Value = Col1
args3(6).Name = "Ascending1"
args3(6).Value = false
dispatcher.executeDispatch(document, ".uno:DataSort", "", 0, args3())
end sub
2) Usare un inputbox dove inserire il numero di colonna 6 x F e 1 x A il codice sarebbe questo
Codice: Seleziona tutto
sub Main
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 ----------------------------------------------------------------------
Calcoli = ThisComponent.Sheets(0)
VALORECELLA = Calcoli.getCellByPosition(8, 2).Value + 5
col1 = Int(InputBox("Per quale colonna ordinare: ","Scelta colonna", 6))
rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
dim tCol as new com.sun.star.beans.PropertyValue
args2(0).Name = "ToPoint"
args2(0).Value = "$A$6:$F$" & VALORECELLA
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args2())
rem ----------------------------------------------------------------------
dim args3(6) 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 = "IncludeAttribs"
args3(3).Value = true
args3(4).Name = "UserDefIndex"
args3(4).Value = 0
args3(5).Name = "Col1"
args3(5).Value = Col1
args3(6).Name = "Ascending1"
args3(6).Value = false
dispatcher.executeDispatch(document, ".uno:DataSort", "", 0, args3())
end sub
3) Usare una varibile Globale e ad ogni pressione del pulsante si alternerebbe l'ordinamento per colonna F e al successivo click l'ordinamento per colonna A e cosi da capo.
Codice: Seleziona tutto
REM ***** BASIC *****
Global sequenza
sub Main
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 ----------------------------------------------------------------------
Calcoli = ThisComponent.Sheets(0)
VALORECELLA = Calcoli.getCellByPosition(8, 2).Value + 5
Sequenza = Sequenza + 1
If Sequenza = 1 Then
col1 = 6
Elseif Sequenza = 2 Then
col1 = 1
Sequenza = 0
End If
rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
dim tCol as new com.sun.star.beans.PropertyValue
args2(0).Name = "ToPoint"
args2(0).Value = "$A$6:$F$" & VALORECELLA
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args2())
rem ----------------------------------------------------------------------
dim args3(6) 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 = "IncludeAttribs"
args3(3).Value = true
args3(4).Name = "UserDefIndex"
args3(4).Value = 0
args3(5).Name = "Col1"
args3(5).Value = Col1
args3(6).Name = "Ascending1"
args3(6).Value = false
dispatcher.executeDispatch(document, ".uno:DataSort", "", 0, args3())
end sub
4) Intervenire direttamente sul pulsante.
Le vie sono tante e diverse dipende da te.
Saluti