LibreOffice 7.1xx Macro (registrata) per ordinare

Discussioni sull'applicazione per i fogli di calcolo
Rispondi
maria uni
Messaggi: 9
Iscritto il: lunedì 10 maggio 2021, 12:41

LibreOffice 7.1xx Macro (registrata) per ordinare

Messaggio 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
Ultima modifica di charlie il lunedì 10 maggio 2021, 14:13, modificato 1 volta in totale.
Motivazione: formattato codice
OpenOffice 3.1 su Windows 7/ LibreOffice 7.1.3 su Windows 7
maria uni
Messaggi: 9
Iscritto il: lunedì 10 maggio 2021, 12:41

Re: LibreOffice 7.1xx Macro (registrata) per ordinare

Messaggio 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?
OpenOffice 3.1 su Windows 7/ LibreOffice 7.1.3 su Windows 7
Avatar utente
charlie
Site Admin
Site Admin
Messaggi: 8807
Iscritto il: mercoledì 19 dicembre 2012, 10:50
Contatta:

Re: LibreOffice 7.1xx Macro (registrata) per ordinare

Messaggio 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.
charlie
macOS 14.4.1 Sonoma: Open Office 4.1.15 - LibreOffice 7.5.7.2
http://www.charlieopenoffice.altervista.org
Gaetanopr
Volontario
Volontario
Messaggi: 3300
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: LibreOffice 7.1xx Macro (registrata) per ordinare

Messaggio 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ì

Codice: Seleziona tutto

Calcoli.getCellByPosition(8, 2).Value + 5
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
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
maria uni
Messaggi: 9
Iscritto il: lunedì 10 maggio 2021, 12:41

Re: LibreOffice 7.1xx Macro (registrata) per ordinare

Messaggio 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ì

Codice: Seleziona tutto

Calcoli.getCellByPosition(8, 2).Value + 5
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?
OpenOffice 3.1 su Windows 7/ LibreOffice 7.1.3 su Windows 7
maria uni
Messaggi: 9
Iscritto il: lunedì 10 maggio 2021, 12:41

Re: LibreOffice 7.1xx Macro (registrata) per ordinare

Messaggio 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
OpenOffice 3.1 su Windows 7/ LibreOffice 7.1.3 su Windows 7
Gaetanopr
Volontario
Volontario
Messaggi: 3300
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: LibreOffice 7.1xx Macro (registrata) per ordinare

Messaggio 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.
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
maria uni
Messaggi: 9
Iscritto il: lunedì 10 maggio 2021, 12:41

Re: LibreOffice 7.1xx Macro (registrata) per ordinare

Messaggio 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?
OpenOffice 3.1 su Windows 7/ LibreOffice 7.1.3 su Windows 7
Gaetanopr
Volontario
Volontario
Messaggi: 3300
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: LibreOffice 7.1xx Macro (registrata) per ordinare

Messaggio da Gaetanopr »

Ti manca questa parte di codice

Codice: Seleziona tutto

Calcoli = ThisComponent.Sheets(0)
La colonna A corrisponde a col1 = 1 per adesso è impostata a 6, ti basta cambiare questo valore, puoi usare una variabile
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
maria uni
Messaggi: 9
Iscritto il: lunedì 10 maggio 2021, 12:41

Re: LibreOffice 7.1xx Macro (registrata) per ordinare

Messaggio da maria uni »

Gaetanopr ha scritto:Ti manca questa parte di codice

Codice: Seleziona tutto

Calcoli = ThisComponent.Sheets(0)
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
OpenOffice 3.1 su Windows 7/ LibreOffice 7.1.3 su Windows 7
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: LibreOffice 7.1xx Macro (registrata) per ordinare

Messaggio 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
-------------------
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
Gaetanopr
Volontario
Volontario
Messaggi: 3300
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: LibreOffice 7.1xx Macro (registrata) per ordinare

Messaggio 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
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
Rispondi