[Risolto] Funzione di ScriptForge

Creare una macro - Scrivere uno script - Usare le API
Rispondi
marinoernestoch
Messaggi: 25
Iscritto il: sabato 17 agosto 2024, 19:02

[Risolto] Funzione di ScriptForge

Messaggio da marinoernestoch »

Buon giorno.
Volendo usare la funzione di ScriptForge Dmax ho scritto:

Codice: Seleziona tutto


If Not GlobalScope.BasicLibraries.isLibraryLoaded("ScriptForge") Then 
 			GlobalScope.BasicLibraries.loadLibrary("ScriptForge") 
End If
			
Dim FSO as object, unrange As String, massimo As Long
unrange =  "B3:C20"
sheet = ThisComponent.CurrentController.ActiveSheet
range = sheet.getCellRangeByName(unrange)
Set FSO = CreateScriptService("Calc")  '<< CreateScriptService è una sub di Scriptforge
                                                        ' pur essendo presente il valore Calc, genera FSO Null e quindi crash 
massimo = FSO.Dmax(range)                                        
ma ottengo FSO nullo e, di conseguenza, non riesco ad usare Dmax.
Chi mi aiuta a capire dove sbaglio?
Grazie
Ultima modifica di marinoernestoch il martedì 5 novembre 2024, 18:37, modificato 1 volta in totale.
OpenOffice 4.1.15; LibreOffice 24.2.5.2; windows 10.
nickGiard
Messaggi: 84
Iscritto il: lunedì 14 maggio 2012, 22:04

Re: Funzione di ScriptForge

Messaggio da nickGiard »

buona sera marinoernestoch
sinceramente ho dato uno sguardo superficiale alle librerie ScriptForge, ma devo dire che non mi sono piaciute.
Sicuramente sono un notevole esempio di scrittura avanzata in basic, e vogliono emulare un ambiente ad oggetti creando quasi una nuova sintassi o un metalinguaggio, ma sono per me enormemente complicate.
Comunque sono scritte in basic, e non vedo vantaggi nel loro uso se non un ulteriore strato di appesantimento e sicuramente allungano il tempo di esecuzione del codice.
Mi piacerebbe che venissero discusse pubblicamente e che indicassero in quali settori possono dare dei miglioramenti.
Tornando al tuo esempio, che credo voglia trovare il valore massimo in un intervallo, puoi usare la semplice com.sun.star.sheet.GeneralFunction.MAX Maximum numerical value.
Sempre seguendo i consigli di Andrew Pitonyak puoi usare sempre getDataArray() method e quindi analizzare l'intero Array(Array), magari appoggiandoti a Python che ha moltissime ed utilissime, nonché velocissime funzioni e che sicuramente rappresenta un'evoluzione positiva nello sviluppo di macro LibreOffice.
Tra i vari principi di Python : "Semplice è meglio di complesso"
Nicola con LibreOffice 7.1 (x64) su Windows 11
marinoernestoch
Messaggi: 25
Iscritto il: sabato 17 agosto 2024, 19:02

Re: Funzione di ScriptForge

Messaggio da marinoernestoch »

Grazie nikGiard dell' intervento.
Sicuramente sono un notevole esempio di scrittura avanzata in basic, e vogliono emulare un ambiente ad oggetti creando quasi una nuova sintassi o un metalinguaggio, ma sono per me enormemente complicate.
L'obiettivo non è tanto quello di usare ScriptForge, quanto quello di capire come meglio stendere le istruzioni x sfruttare al meglio le opportunità del prodotto. Ho notato anch'io che alcune funzioni sono pesanti e, per dirla tutta, ridondanti: penso però che siano state scritte per gestire tutte le possibili richieste. Sta a chi le legge 'rubare' le idee da fare proprie, sfrondandole dagli ammennicoli inutili .
magari appoggiandoti a Python che ha moltissime ed utilissime, nonché velocissime funzioni e che sicuramente rappresenta un'evoluzione positiva nello sviluppo di macro LibreOffice.
Ennesimo linguaggio da imparare (bene -è riferito a imparare-)! non ne sono entusiasta: una decina di anni fa, sono in pensione dal 2011, l'avevo installato e abbozzato alcune sub, confrontandole con VBA (lettura sequenziale, un po' di loop e riscrittura), trovandolo decisamente più lento. E poi non ero riuscito a capire come generare un .EXE. Quindi l'ho accantonato.
E infine, ho troppa carne al fuoco: per ora, e non è detto che porti a termine l'obiettivo, continuo con lo studio di libreoffice in basic, poi vedrò.
Ad ogni modo, grazie dello scambio di opinioni.
OpenOffice 4.1.15; LibreOffice 24.2.5.2; windows 10.
nickGiard
Messaggi: 84
Iscritto il: lunedì 14 maggio 2012, 22:04

Re: Funzione di ScriptForge

Messaggio da nickGiard »

Buon giorno marinoernestoch
se posso permettermi un consiglio, se intendi approfondire il basic, risparmierai sicuramente tempo leggendo l'ottimo libro OpenOffice.org Macros Explained OOME Fourth Edition, di Andrew Pitonyak che trovi liberamente.
In merito al Python, intendo quello incorporato in LibreOffice, che io uso NON per gestire LO (che faccio in Basic) ma per ricevere Array(Array) di valori, elaborarli in Python, e restituirli nella stessa forma per riscriverli come DataArray in opportuni intervalli. Tra l'altro Python oggi è tra i linguaggi più usati a livello mondiale.
Buona continuazione
Nicola con LibreOffice 7.1 (x64) su Windows 11
marinoernestoch
Messaggi: 25
Iscritto il: sabato 17 agosto 2024, 19:02

Re: Funzione di ScriptForge

Messaggio da marinoernestoch »

Eccomi a te, nickGiard.
se posso permettermi un consiglio, se intendi approfondire il basic, risparmierai sicuramente tempo leggendo l'ottimo libro OpenOffice.org Macros Explained OOME Fourth Edition, di Andrew Pitonyak che trovi liberamente.
Avevo già scaricato la versione " Last Modified Wednesday, March 27, 2024 at 12:07:27 AM Document Revision: 663" ed anche "Useful Macro Information
For OpenOffice.org/By/Andrew Pitonyak" . Da questi documenti ho estratto istruzioni con le quali ho scritto le sub/Function di prova. Ho notato però, salvo errori, che non sono trattate barre con icone: argomento questo alla base di tutte le mie applicazioni in excel (la maggior parte dei miei fogli excel iniziano con l'impostazione di una o più barre, necessarie al trattamento dei dati del foglio). Devo assolutamente superare questo scoglio!!
Tra l'altro, mi sembra di capire che le informazioni sulla versione della documentazione di MAcros Explained, non si riferiscono alla sua ultima edizione, ma alla data/ora di salvataggio (non scarico) sul disco. :)

Grazie dei tuoi consigli.
p.s. Se vuoi ci sentiamo in privato.
OpenOffice 4.1.15; LibreOffice 24.2.5.2; windows 10.
Gaetanopr
Volontario
Volontario
Messaggi: 3316
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Funzione di ScriptForge

Messaggio da Gaetanopr »

marinoernestoch ha scritto: lunedì 7 ottobre 2024, 13:46 Buon giorno.
Volendo usare la funzione di ScriptForge Dmax ho scritto:

Codice: Seleziona tutto


If Not GlobalScope.BasicLibraries.isLibraryLoaded("ScriptForge") Then 
 			GlobalScope.BasicLibraries.loadLibrary("ScriptForge") 
End If
			
Dim FSO as object, unrange As String, massimo As Long
unrange =  "B3:C20"
sheet = ThisComponent.CurrentController.ActiveSheet
range = sheet.getCellRangeByName(unrange)
Set FSO = CreateScriptService("Calc")  '<< CreateScriptService è una sub di Scriptforge
                                                        ' pur essendo presente il valore Calc, genera FSO Null e quindi crash 
massimo = FSO.Dmax(range)                                        
ma ottengo FSO nullo e, di conseguenza, non riesco ad usare Dmax.
Chi mi aiuta a capire dove sbaglio?
Grazie
Salve, io ho usato e uso queste librerie soprattutto con base, le ritengo utili anche perchè la guida è buona e ti consentono di lavorare facilmente con Python, che rispetto al Basic è su altro livello( se vuoi creare applicazioni di un certo livello il python è più indicato)
In merito al tuo esempio, non ti funziona in quanto il range deve essere indicato in formato stringa comprensivo del nome del foglio.
Ti allego esempio prendendo il nome del foglio da quello attivo.

Codice: Seleziona tutto

Sub Main
If Not GlobalScope.BasicLibraries.isLibraryLoaded("ScriptForge") Then 
 			GlobalScope.BasicLibraries.loadLibrary("ScriptForge") 
End If
			
Dim FSO as object, unrange As String, massimo As Long

NFoglio = "$'" & ThisComponent.CurrentController.ActiveSheet.Name 
unrange =  NFoglio & "'.B3:C20"

Set FSO = CreateScriptService("Calc")  '<< CreateScriptService è una sub di Scriptforge
                                                        ' pur essendo presente il valore Calc, genera FSO Null e quindi crash 
massimo = FSO.Dmax(unrange) 
msgbox massimo  
End Sub
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
marinoernestoch
Messaggi: 25
Iscritto il: sabato 17 agosto 2024, 19:02

Re: Funzione di ScriptForge

Messaggio da marinoernestoch »

Gaetanopr:
In merito al tuo esempio, non ti funziona in quanto il range deve essere indicato in formato stringa comprensivo del nome del foglio.
Ti allego esempio prendendo il nome del foglio da quello attivo.
La sub quando arriva a

Codice: Seleziona tutto

massimo = FSO.Dmax(unrange)
trova l'oggetto FSO vuoto (come ho spiegato all'inizio), quindi l'istruzione non viene eseguita.
A mio avviso dove sbaglio potrebbe essere qui:

Codice: Seleziona tutto

Set FSO = CreateScriptService("Calc")  '<< CreateScriptService è una sub di Scriptforge
Ad ogni modo è un buon consiglio specificare il range, anche con il nome dello sheet.
OpenOffice 4.1.15; LibreOffice 24.2.5.2; windows 10.
Gaetanopr
Volontario
Volontario
Messaggi: 3316
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Funzione di ScriptForge

Messaggio da Gaetanopr »

marinoernestoch ha scritto: martedì 5 novembre 2024, 13:04 La sub quando arriva a

Codice: Seleziona tutto

massimo = FSO.Dmax(unrange)
trova l'oggetto FSO vuoto (come ho spiegato all'inizio), quindi l'istruzione non viene eseguita.
A me funziona, da dove lanci la macro? NON DEVI LANCIARLA DALL'IDE e il messaggio cosa dice di preciso?
Allega un esempio
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
marinoernestoch
Messaggi: 25
Iscritto il: sabato 17 agosto 2024, 19:02

Re: Funzione di ScriptForge

Messaggio da marinoernestoch »

OK.
Per testarla eseguo la Sub da IDE.
Il messaggio è: Errore di runtime BASIC. Variabile dell'oggetto non impostata.
Attivandola dal foglio con "Strumenti Macro Attiva macro..." funziona.
Avevo capito che ci sarebbero stati problemi di rifermenti eseguendo test da IDE se fosse stato richiamati lo "StarDesktop.CurrentComponent".
Grazie
OpenOffice 4.1.15; LibreOffice 24.2.5.2; windows 10.
Rispondi