[Risolto] Ripetere n volte una macro.

Creare una macro - Scrivere uno script - Usare le API
Rispondi
Merca60
Messaggi: 7
Iscritto il: mercoledì 3 gennaio 2024, 2:14

[Risolto] Ripetere n volte una macro.

Messaggio da Merca60 »

Premetto che non sono un programmatore, mi piace cercare di risolvere da solo i problemi che mi si pongono davanti.
Uso un PC con windows 10 Pro su cui ho installato sia LibreOffice che OpenOffice. Da molti anni uso i programmi Microsoft solo se costretto per lavoro.
Penso che a breve migrerò tutto su Linux

Ho realizzato un programmino in Python per scaricare in continuo dati da un datalogger, e adesso, dopo qualche mese di apprendimento, sono riuscito a ottenere file in formato csv facilmente elaborabili.

MA... Prima di arrivare a questo risultato ho prodotto molte decine di file di testo con centinaia di migliaia di righe praticamente ingestibili.
Per facilitarmi la vita, ovvero trasporre in una sola riga, e con i corretti separatori, le informazioni in origine su diverse righe, ho provato ad aprirli con writer e registrare più macro in funzione delle diverse situazioni che ho nel file, e ci sono riuscito. Le ho abbinate a diverse coppie di caratteri per lanciarle e sono piuttosto soddisfatto.
I casi sono 5 e lanciare 5 macro sarebbe cosa ben diversa che lanciarne una per ogni riga da ottenere, ovvero diverse migliaia di volte.

Ho verificato che non è cosa da fare, almeno per me, provare a modificare a mano le macro registrate male, magari per un errore di pressione tasti, mi conviene registrarla di nuovo.

Per provare a lanciare un numero finito di volte una delle macro ottenute avevo provato a inserire il controllo seguente, che mi sembra la scelta migliore, visto che file di questo tipo non ne produrrò più, ma evidentemente nelle due o tre prove che ho fatto avevo sbagliato qualcosa, perché il ciclo si blocca dopo il primo giro.

Allego il codice della macro originale modificata col controllo For / Next, (Che ho commentato per renderlo inoffensivo)... e una piccola porzione del file di log, con alcune righe originali e altre "trattate". La necessità delle diverse macro è dovuta al numero "ciclo", che va da 1 a 5 caratteri. Il file originale ha oltre 100k righe.

For contatore=inizio To fine [Step passo]
blocco istruzioni (Cioè la macro registrata)
Next [contatore]

Sono convinto che sia una sciocchezza, ma a "sapere come", tutto può essere una sciocchezza.

Grazie in anticipo per l'aiuto, Merca60.
Allegati
20240103_EsempioBaseDati_Merca60.odt
(30.98 KiB) Scaricato 24 volte
20240103_Macro_Merca60.txt
(52.63 KiB) Scaricato 25 volte
Ultima modifica di Merca60 il venerdì 5 gennaio 2024, 21:39, modificato 3 volte in totale.
OpenOffice 4.1.6 su Windows 10
Avatar utente
charlie
Site Admin
Site Admin
Messaggi: 8766
Iscritto il: mercoledì 19 dicembre 2012, 10:50
Contatta:

Re: Ripetere n volte una macro.

Messaggio da charlie »

Ciao e benvenuto sul forum.
Se intanto ti vuoi presentare, farai cosa gradita. Puoi farlo in questa sezione -> https://forum.openoffice.org/it/forum/v ... m.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.2 Sonoma: Open Office 4.1.15 - LibreOffice 7.5.7.2
http://www.charlieopenoffice.altervista.org
Gaetanopr
Volontario
Volontario
Messaggi: 3286
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Ripetere n volte una macro.

Messaggio da Gaetanopr »

Ciao, il problema quasi sicuramente sta nel fatto che con il ciclo dichiari per 90 volte gli stessi array, prova a mettere fuori dal ciclo tutte le istruzioni di dichiarazione e poi crei il ciclo con le altre istruzioni, io non posso farlo in quanto ci sono 183 array. Ti faccio un piccolo esempio.
Tutte le istruzioni Dim args vanno PRIMA DEL CICLO.
qualcosa del genere e se ci fai caso args9 è uguale ad args10, quindi il 10 non ha senso puoi usare soltanto il 9 e stessa cosa se ci sono altre dichiarazioni uguali, in questo modo snellisci di molto il codice.

Codice: Seleziona tutto

sub macro2_numeri


rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object

rem - Tentativo di contatore per ripetere n volte la macro
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "Text"
args2(0).Value = ", "

rem ----------------------------------------------------------------------
dim args5(0) as new com.sun.star.beans.PropertyValue
args5(0).Name = "Text"
args5(0).Value = ","

rem ----------------------------------------------------------------------
dim args8(0) as new com.sun.star.beans.PropertyValue
args8(0).Name = "Text"
args8(0).Value = " "

rem ----------------------------------------------------------------------
dim args9(1) as new com.sun.star.beans.PropertyValue
args9(0).Name = "Count"
args9(0).Value = 1
args9(1).Name = "Select"
args9(1).Value = false

dim args10(1) as new com.sun.star.beans.PropertyValue
args10(0).Name = "Count"
args10(0).Value = 1
args10(1).Name = "Select"
args10(1).Value = false

for counter=1 to 90
dispatcher.executeDispatch(document, ".uno:GoRight", "", 0, args10())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:GoToEndOfLine", "", 0, Array())

rem ----------------------------------------------------------------------

dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args2())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Delete", "", 0, Array())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:GoToEndOfLine", "", 0, Array())

dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args5())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Delete", "", 0, Array())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Delete", "", 0, Array())

dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args8())

dispatcher.executeDispatch(document, ".uno:GoRight", "", 0, args9())

rem - comando di chiusura ciclo di ripetizione
Next

end sub
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
Merca60
Messaggi: 7
Iscritto il: mercoledì 3 gennaio 2024, 2:14

Re: Ripetere n volte una macro.

Messaggio da Merca60 »

Mmh..
Fammi capire.
Premetto che non conosco, (ancora), il significato dei comandi Visual Basic, anche se immaginavo che "dim" fosse una dichiarazione, infatti il "mio for" lo avevo inserito dopo le prime righe, che riporto qui,
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
sub macro2_numeri


rem ----------------------------------------------------------------------
rem define variables
dim document as object
dim dispatcher as object
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Ma evidentemente non va bene.

La macro che ho riportato è pari pari quella prodotta da Writer e che mi serve per "trasformare" un gruppo di righe in una sola, ed è tutto questo codice che dovrei ripetere, tutto insieme, per 90 volte, ( o 900, o 9000). ars9 è uguale ad args 10 perché io ho prmuto lo stesso tasto, come ce ne sono molti altri in seguito. Avevo provato a togliere qualcosa per correggere un mio errore di battitura ma si è bloccato tutto, evidentemente l'interprete vuole che quei numeri siano tutti in sequenza e senza ripetizioni.
Come fai notare te Il fatto che nella marco ci sia un "dim" ad ogni azione, cioè ad ogni pressione di un tasto durante la registrazione della macro, può essere un problema, perché significherebbe che quello che vorrei ottenere io non è possibile con questo sistema, ma andrebbe fatto un codice del tutto diverso, che non usi delle macro.. A quel punto userei Python, che sto cercando di imparare ad usare.

:-(( la vedo male...
OpenOffice 4.1.6 su Windows 10
Gaetanopr
Volontario
Volontario
Messaggi: 3286
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Ripetere n volte una macro.

Messaggio da Gaetanopr »

Merca60 ha scritto: giovedì 4 gennaio 2024, 12:09 .. A quel punto userei Python, che sto cercando di imparare ad usare.

:-(( la vedo male...
Non è questione di usare il Basic o il Python in ogni caso la macro andrebbe scritta seguendo certe regole uguali per entrambi i linguaggi.
Dopo questa premessa cerco di spiegarmi meglio, avviare la stessa macro per 900 volte non è come creare un ciclo che si ripete per 900 volte in una sola volta, per i seguenti motivi:
Quando avvii la macro 900 volte singolarmente (quindi 900 volte premi un pulsante) alla fine delle istruzioni la macro termina e tutte le variabili vengono azzerate, le istruzioni terminano l'operato e appena la lanci nuovamente si ricomincia da capo e tutto funziona.
Diversamente se invece di premere il pulsante 900 volte(una cosa impraticabile) metti le stesse istruzioni dentro ad un ciclo di n 900 devi stare attento a cosa metti dentro, alcune istruzioni della macro vanno inserite una sola volta quindi devono stare al di fuori e prima del ciclo altrimenti le ripeterai per 900 volte(cosa che non serve e che nel tuo caso porta ad avere errori), all'internoi del ciclo dovrai inserire SOLO le istruzioni da ripetere n volte che nel tuo caso sono soltanto le esecuzioni del dispatcher ad esempio

Codice: Seleziona tutto

dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args2())
.
Le dichiarazioni vanno fatte una sola volta quindi fuori e prima del ciclo ad esempio

Codice: Seleziona tutto

dim args9(1) as new com.sun.star.beans.PropertyValue
args9(0).Name = "Count"
args9(0).Value = 1
args9(1).Name = "Select"
args9(1).Value = false
Nel mio precedente esempio l'ho fatto con alcuni args ma essendo più di 100 lascio questo compito ingrato di farlo a te.

La tua macro dovrà iniziare così

Codice: Seleziona tutto

sub macro2_numeri


rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object

rem - Tentativo di contatore per ripetere n volte la macro
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "Text"
args2(0).Value = ", "

REM TUTTO IL BLOCCO DI ISTRUZIONI che va da dim arg(n) a args(n).Value

rem qua inizi il ciclo
for counter 1 to 900

  rem  istruzioni di dispatcher
  dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args2())
next counter

LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
Merca60
Messaggi: 7
Iscritto il: mercoledì 3 gennaio 2024, 2:14

Re: Ripetere n volte una macro.

Messaggio da Merca60 »

Forse ho capito...
Devo fare qualche prova con poche righe e mi ci vorrà comunque un pò di tempo.
Posso "sospendere" l'argomento?

Grazie per ora!
OpenOffice 4.1.6 su Windows 10
Merca60
Messaggi: 7
Iscritto il: mercoledì 3 gennaio 2024, 2:14

Re: Ripetere n volte una macro.

Messaggio da Merca60 »

Allora.
Ho seguito le istruzioni, creato un file di testo ridotto per le prove e ricavato questo codice, che funziona.
C'è il problema che quando, durante l'esecuzione, c'è da andare a capo, perde il filo e cancella quello che io non vorrei, ma evidentemente gli ho detto di fare così...
il ciclo dopo "si riprende", e va bene così.

In basso il testo usato per la prova. E' buffo che cambiando dimensione dei caratteri, giustamente, cambia il punto in cui avviene il "danno".
Ora provo con la macro più complessa, che non dovrebbe avere questo problema perché di a capo ce ne sono diversi e dovrebbero essere tutti "dentro" il controllo
Al momento non mi interessa capire come rimediare a questa cosa, è solo una prova.

P.S. Io sono un tecnico di laboratorio universitario, abituato a essere multifunzione, vero, ma sono un meccanico...

REM ***** BASIC *****

sub ProvaBreve2
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 ----------------------------------------------------------------------
rem - dispatcher.executeDispatch(document, ".uno:GoToEndOfLine", "", 0, Array())

rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "Text"
args2(0).Value = ", "

dim args5(0) as new com.sun.star.beans.PropertyValue
args5(0).Name = "Text"
args5(0).Value = ", "

rem - qua iniza il ciclo

for counter=1 to 10

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:GoToEndOfLine", "", 0, Array())

dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args2())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Delete", "", 0, Array())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:GoToEndOfLine", "", 0, Array())

rem ----------------------------------------------------------------------
rem - dim args5(0) as new com.sun.star.beans.PropertyValue
rem - args5(0).Name = "Text"
rem - args5(0).Value = ", "

dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args5())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Delete", "", 0, Array())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Delete", "", 0, Array())

next counter

end sub

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Testo prima della plurimacro

1 False
stato relay aperto

2 False
stato relay aperto

3 False
stato relay aperto

4 False
stato relay aperto

5 False
stato relay aperto

6 False
stato relay aperto

7 False
stato relay aperto

8 False
stato relay aperto

9 False
stato relay aperto

10 False
stato relay aperto

xxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Testo dopo la plurimacro, impostata per 10 ripetizioni (La mia pagina è in formato orizzontale e carattere 10 pt, e non torna con la larghezza di questo form).

1 False, stato relay aperto, 2 False, stato relay aperto, 3 False, stato relay aperto, 4 False, stato relay aperto, 5 False, stato, elay aperto, , False, stato relay aperto, 7 False, stato relay aperto, 8 False, stato relay aperto, 9 False, stato relay, perto

10 False
stato relay aperto
OpenOffice 4.1.6 su Windows 10
Merca60
Messaggi: 7
Iscritto il: mercoledì 3 gennaio 2024, 2:14

Re: Ripetere n volte una macro.

Messaggio da Merca60 »

Perfetto. Spostare le 180 dichiarazioni della macro originale è stata proprio una palla, ma funziona.
Però avrei ancora bisogno di una precisazione...
Presumo che le millanta dichiarazioni siano ognuna relativa alla pressione di un singolo tasto. In parecchie c'è il nome "Count" e il valore "1".
Suppongo che questo corrisponda alla pressione del tasto freccia a destra, che è quello che ho usato più di frequente.
Prima di fare delle prove in modo un pò bovino chiedo: per ridimensionareun pò il codice ha senso cancellare, per esempio, 4 dichiarazioni uguali e sostituire in quella precedente il valore "1" con "5"?
Lo chiedo perché non vorrei fare casino con gli "args" non più in successione.
OpenOffice 4.1.6 su Windows 10
Merca60
Messaggi: 7
Iscritto il: mercoledì 3 gennaio 2024, 2:14

Re: Ripetere n volte una macro.

Messaggio da Merca60 »

RISOLTO!
La mia ultima supposizione era giusta: ho tanto alleggerito la macro eliminando tutte le inutili ripetizioni del codice, e in questo modo è anche estremamente facile adattarlo a eventuali cambiamenti nella posizione di caratteri e spazi nel file da trattare.

Allego un esempio dei dati che volevo "trattare" riportandoli tutti su una riga, in modo da poterli elaborare come un file csv con la virgola come delimitartore.
Il codice della macro da cui sono partito e quello della "multimacro" nata seguedo le indicazioni di Gaetanopr

spero che tutto questo possa essere di aiuto anche ad altri.

GRAZIE!!

Mi si è aperto uno spiraglino nel mondo della programmazione e delle macro.
Allegati
MultiMacro_Dati.txt
(2.85 KiB) Scaricato 23 volte
Multimacro_MacroDiPartenza.txt
(52.21 KiB) Scaricato 20 volte
Multimacro_MacroDefinitiva.txt
(11.64 KiB) Scaricato 21 volte
OpenOffice 4.1.6 su Windows 10
Rispondi