Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Pogramma in startBasic

73 views
Skip to first unread message

Sergio Marelli

unread,
Dec 11, 2010, 6:42:50 AM12/11/10
to
Ciao,

ho scarse conoscenze di programmazione, quindi ho scritto i passaggi
che il programma dovrebbe fare, ma non so proprio da dove cominciare
per scriverli in linguaggio programmazione corretto.

Spero che sia possibile fare quello che voglio con lo start basic:

http://img153.imageshack.us/img153/2883/prrg.jpg

nella colonna azzurrina appaiono numeri che vengono da un altro
processo che non vi sto a spiegare, ma che possono cambiare tutte le
volte e apparire ovunque nella colonna.
Vorrei che Calc evidenziasse in automatico il range di righe che
comprende il 70% della somma totale di tutti i valori nella colonna
azzurrina, a partire dalla riga col valore massimo.

Il programma che mi servirebbe è il seguente:
------------------------------------------------------------------------
i=0
R=0
D=0
S=0
G=0

controlla riga della cella in cui è presente il valore 'MAX' e dai a
'R' tale valore.
se_________________ 'MAX' è maggiore del 70%; scrivi '*' nella
colonnaA alla riga 'R' e fermati;
altrimenti_________ scrivi sempre '*' nella colonnaA alla riga 'R' e
salva valore 'MAX' in 'D' e continua a leggere il programma;

[ciclo]

i= i+1
G=R-i
dalla riga 'G' leggi valore in colonnaB e sommalo a 'D'; chiama tale
somma 'S';
D=S
Se_________________ D>70% scrivi '*' nella colonnaA alla riga 'G' e
ferma ciclo;
altrimenti_________ scrivi sempre '*' nella colonnaA alla riga 'G' ma
continua ciclo;

G=R+i
dalla riga 'G' leggi valore in colonnaB e sommalo a 'D'; chiama tale
somma 'S';
D=S
Se_________________ D>70% scrivi '*' nella colonnaA alla riga 'G' e
fermati;
altrimenti_________ scrivi sempre '*' nella colonnaA alla riga 'G' ma
continua ciclo;

[ciclo]
------------------------------------------------------------------------

spero che qualche buon anima mi aiuti a tradurlo in startBasic

martello

unread,
Dec 11, 2010, 7:47:10 AM12/11/10
to

> spero che qualche buon anima mi aiuti a tradurlo in startBasic

Se scarichi le super FAQ ...


https://sourceforge.net/projects/ooodocs/files/FAQ%20i-a.c.s.o/OpenOffice3%20Soluzioni%20a%20raccolta/


Troverai delle funzioni già fatte per leggere e scrivere celle di calc
che è sicuramente il primo scoglio per chi vuole programmare in calc.

Fatto questo implementare l'algoritmo è relativamente semplice ... ma
solo tu puoi farlo correttamente perchè la programmazione a distanza
presenta qualche problema.

Sempre nelle FAQ puoi trovare i link per scaricare i manuali in italiano
di star basic e altro.

Sergio Marelli

unread,
Dec 11, 2010, 8:47:52 AM12/11/10
to

> Troverai delle funzioni gi fatte per leggere e scrivere celle di calc
> che sicuramente il primo scoglio per chi vuole programmare in calc.
>
> Fatto questo implementare l'algoritmo relativamente semplice ... ma
> solo tu puoi farlo correttamente perch la programmazione a distanza
> presenta qualche problema.

Grazie mille! per me l'importante era sapere che si può fare...
inserire cicli di programmazione all'interno di tabelle Calc.

Ora studio un pò e cerco di caprie come si può fare.

Sergio Marelli

unread,
Dec 11, 2010, 9:00:18 AM12/11/10
to
quello che serve a me è capire come scrivere le Macro? giusto?
è con le macro che posso fare programmi che leggono e scrivono in
celle che sceglie il programma in base alle istruzioni?

martello

unread,
Dec 11, 2010, 11:01:45 AM12/11/10
to

Certamente ... puoi fare ciò che vuoi ... o quasi.

Roberto Montaruli

unread,
Dec 11, 2010, 11:03:12 AM12/11/10
to

Strumenti/Macro/Organizza Macro/OpenOffice Basic/

Poi ci sono specifici oggetti per poter gestire il documento, il
singolo foglio, la singola cella.
Leggere il contenuto di una cella, scrivere un valore in una cella.

Naturalmente il prerequisito e' quello di saper programmare o avere un
minimo di idea di che cosa voglia dire programmare.
Senza tale prerequisito, di strada se ne fa poca.

Sergio Marelli

unread,
Dec 11, 2010, 4:28:44 PM12/11/10
to
> Naturalmente il prerequisito e' quello di saper programmare o avere un
> minimo di idea di che cosa voglia dire programmare.
> Senza tale prerequisito, di strada se ne fa poca.

Si ho una vaga idea della programmazione... e il compito da svoglere
e' davvero semplice, mi serve solo sapere come vengono scritte le
varie semplici azioni in questo linguaggio.. le superFAQ sono al
quanto incasinate e non hanno introduzione...
non avreste un link da consigliarmi in cui possa iniziare ad essere
introdotto al startBasic? perche' io non so nemmno proprio da dove
scrivere.. da dove compilare... da dove comincio insomma?

grazie ancora

VITRIOL

unread,
Dec 11, 2010, 4:33:04 PM12/11/10
to
Il 11/12/2010 22.28, Sergio Marelli ha scritto:

> non avreste un link da consigliarmi in cui possa iniziare ad essere
> introdotto al startBasic?

http://dlc.sun.com/pdf/819-1329/819-1329.pdf

--
news:it-alt.comp.software.openoffice : Il newsgroup dedicato a
OpenOffice.org, la suite open source di applicazioni per ufficio.
Scarica "OpenOffice.org 3: Soluzioni a raccolta", molto piů di semplici
FAQ! http://it.openoffice.org/doc/manuali/

Roberto Montaruli

unread,
Dec 12, 2010, 11:34:22 AM12/12/10
to

Te l'ho detto:
Strumenti/Macro/Organizza Macro/OpenOffice Basic/

Poi qualche esempio di macro lo trovi pure su questo NG che sono state
postate alcune cose nei precedenti messaggi.

Per il resto c'e' solo da chiedere a google oppure sempre qua.

Tommy

unread,
Dec 12, 2010, 4:28:09 PM12/12/10
to
scusate, mi sorge un dubbio, ma si dice StarBasic o StartBasic?

VITRIOL

unread,
Dec 12, 2010, 4:35:10 PM12/12/10
to
Il 12/12/2010 22.28, Tommy ha scritto:

> scusate, mi sorge un dubbio, ma si dice StarBasic o StartBasic?

Il primo, da StarOffice. Comunque in OOo formalmente sarebbe
OpenOffice.org Basic, ma č uguale...

pablo

unread,
Dec 14, 2010, 5:29:23 AM12/14/10
to
Il 12/12/2010 22:35, VITRIOL ha scritto:
> Il 12/12/2010 22.28, Tommy ha scritto:
>
>> scusate, mi sorge un dubbio, ma si dice StarBasic o StartBasic?
>
> Il primo, da StarOffice. Comunque in OOo formalmente sarebbe
> OpenOffice.org Basic, ma è uguale...

Probabilmente sarò l'unico ma non sono d'accordo. :-)

Prima di tutto, occorre ricordare che "linguaggio" non indica un pezzo
di software ma un concetto astratto, un insieme di specifiche e regole
di sintassi, parole riservate, strutture semantiche e funzioni di base.

Il c++ rimane c++ indipendentemente dall'implementazione del
compilatore, indipendentemente dall'ambiente di programmazione ecc.

Il linguaggio StarBasic a livello di specifiche e sintassi fu inventato
prima dell'esistenza di ooo.

La versione implementata in openoffice non cambia le specifiche del
linguaggio, quello che è cambiato è l'accesso alla suite ovvero le
funzioni API, perciò secondo me il linguaggio dovrebbe mantenere il nome
originale.

Non è che se scrivi una macro in java o in python i nomi dei linguaggi
diventano OOoJava oppure OOoPython.

Anche, in ambiente MS, se usi il linguaggio VBA in Office o in Autocad
continui a chiamarlo VBA.

Poi, se all'opposto seguissimo la filosofia di unire il nome del
prodotto al nome del linguaggio, fra breve ci troveremo a dover
aggiungere un nuovo nome per chiamare la stessa cosa, ovvero libò-basic
che forse è perfino peggio di ooo-basic...

ciao
Paolo

Sergio Marelli

unread,
Dec 15, 2010, 10:45:18 AM12/15/10
to
grazie, una bella introduzione... ma non viene detto molto, ad esempio
non so come fare che il programma possa leggere l'indirizzo di una
cella e assegare una coordinata ad una variabile che può essere
assegnata come coordinata di un altra cella.

inoltre il seguente codice non dovrebbe scrivere Test nella cella A1?
---------------------------
Dim Doc As Object
Dim Sheet As Object
Dim Cell As Object


Sub Main

Doc=StarDesktop.CurrentComponent
Sheet=Doc.Sheets(0)

Cell=Sheet.getCellByPosition(0, 0)
Cell.String="Test"

End Sub
---------------------------

invece mi viene dato un errore alla riga
Sheet=Doc.Sheets(0)

secondo il manuale dovrebbe essere corretto

grazie per qualsiasi hint

Sergio Marelli

unread,
Dec 15, 2010, 12:06:24 PM12/15/10
to
Probabilmente non sono stato chiarissimo.

Ma leggendo il manuale mi è chiaro come fare a scrivere nelle celle.
Ma, ad esempio:
-nell'area A1:A9 ho una serie di numeri che vanno da 1 a 9 in modo
casuale
-ora io voglio trovare la cella Ax con il valore 9 e voglio scrivere
nella cella Bx la stringa "MAX"

Ora come faccio a dire a Calc di trovarmi una cella che contiente 9 e
soprattutto come faccio a dirgli di darmi le coordinate di tale
cella? con questo comando potrei poi dare alla variabile 'a' il
valore della seconda coordinata e fare qualcosa di simile:
Cell = Sheet.getCellByPosition(1,a)
Cell.String = "MAX"

Roberto Montaruli

unread,
Dec 15, 2010, 1:26:31 PM12/15/10
to
On 15 Dic, 16:45, Sergio Marelli <sergio.m...@gmail.com> wrote:
> grazie, una bella introduzione... ma non viene detto molto, ad esempio
> non so come fare che il programma possa leggere l'indirizzo di una
> cella e assegare una coordinata ad una variabile che può essere
> assegnata come coordinata di un altra cella.
>
> inoltre il seguente codice non dovrebbe scrivere Test nella cella A1?
> ---------------------------
> Dim Doc As Object
> Dim Sheet As Object
> Dim Cell As Object
>
> Sub Main
>
> Doc=StarDesktop.CurrentComponent
> Sheet=Doc.Sheets(0)
>
> Cell=Sheet.getCellByPosition(0, 0)
> Cell.String="Test"
>
> End Sub
> ---------------------------
>
> invece mi viene dato un errore alla riga
> Sheet=Doc.Sheets(0)
>
> secondo il manuale dovrebbe essere corretto
>
> grazie per qualsiasi hint


Ho fatto un copia/incolla del codice qui sopra e mi funziona
perfettamente.
In A1 mi trovo scritto "Test"

L'unica cosa diversa da come le scrivo io le macro e' che
al posto di StarDesktop.CurrentComment, io uso ThisComponent

Quindi
Set Doc = ThisComponent

VITRIOL

unread,
Dec 15, 2010, 1:40:24 PM12/15/10
to
Il 15/12/2010 19.26, Roberto Montaruli ha scritto:

> Ho fatto un copia/incolla del codice qui sopra e mi funziona
> perfettamente.
> In A1 mi trovo scritto "Test"
>
> L'unica cosa diversa da come le scrivo io le macro e' che
> al posto di StarDesktop.CurrentComment, io uso ThisComponent

Qui c'è la spiegazione dell'arcano:

http://api.openoffice.org/servlets/ReadMsg?msgId=867808&listName=dev

in pratica StarDesktop.CurrentComponent non funziona se si lancia la
macro dall'IDE Basic, perché in questo modo l'oggetto creato si
riferisce all'IDE stesso.
La soluzione è usare ThisComponent come hai detto tu.

--
news:it-alt.comp.software.openoffice : Il newsgroup dedicato a
OpenOffice.org, la suite open source di applicazioni per ufficio.

Scarica "OpenOffice.org 3: Soluzioni a raccolta", molto più di semplici
FAQ! http://it.openoffice.org/doc/manuali/

Roberto Montaruli

unread,
Dec 15, 2010, 1:43:20 PM12/15/10
to
On 15 Dic, 18:06, Sergio Marelli <sergio.m...@gmail.com> wrote:
> Probabilmente non sono stato chiarissimo.
>
> Ma leggendo il manuale mi è chiaro come fare a scrivere nelle celle.
> Ma, ad esempio:
> -nell'area A1:A9 ho una serie di numeri che vanno da 1 a 9 in modo
> casuale
> -ora io voglio trovare la cella Ax con il valore 9 e voglio scrivere
> nella cella Bx la stringa "MAX"
>
> Ora come faccio a dire a Calc di trovarmi una cella che contiente 9 e
> soprattutto come faccio a dirgli di darmi le coordinate di tale
> cella?  con questo comando potrei poi dare alla variabile 'a' il
> valore della seconda coordinata e fare qualcosa di simile:
> Cell = Sheet.getCellByPosition(1,a)
> Cell.String = "MAX"

Per esempio cosi':

max = -1
r1 = -1
for r = 0 to 8
v = ThisComponent.Sheets(0).getCellByPosition(0, r).Value
if v > max then
max = v
r1 = r
end if
next

ThisComponent.Sheets(0).getCellByPosition(1, r1).String = "MAX"

Sergio Marelli

unread,
Dec 15, 2010, 4:50:32 PM12/15/10
to
grazie a tutti... ora è tutto risolto... ma ritorno presto ;)

Sergio Marelli

unread,
Dec 15, 2010, 5:47:22 PM12/15/10
to
Fantastico... è andato tutto liscio e il codice seguente è proprio
quello che mi serviva... questo linguaggio è una bomba, meno di 48 ore
e mi ha dato quello che cercavo.
E' un pò lentino a completare i calcoli (circa 10secondi), ma il suo
dovere lo fa.
magari voi notate subito qualche errorino che lo rende lento, anche se
senza sapere a cosa serve è dura..

ecco il codice:


Sub Main

Sheet = ThisComponent.Sheets(14)
P = Sheet.getCellByPosition(9,6).Value
C = -1

For I = 10 to 699
T = Sheet.getCellByPosition(9,I).Value

If T=P Then
Sheet.getCellByPosition(1,I).String = "|"
C=I
Else
Sheet.getCellByPosition(1,I).String = ""
End If
Next I


S = Sheet.getCellByPosition(9,C).Value
Prc = Sheet.getCellByPosition(9,7).Value
G = C

Do While S <= Prc
C = C - 1
Sheet.getCellByPosition(1,C).String = "|"
S = S + Sheet.getCellByPosition(9,C).Value
if S >= Prc then
Exit Do
End If
G = G + 1
Sheet.getCellByPosition(1,G).String = "|"
S = S + Sheet.getCellByPosition(9,G).Value
Loop

Sheet.getCellByPosition(9,5).String = S 'questo mette il totale ti
TPOs che formano la value area


End Sub

Roberto Montaruli

unread,
Dec 16, 2010, 3:34:58 AM12/16/10
to
On 15 Dic, 23:47, Sergio Marelli <sergio.m...@gmail.com> wrote:

> E' un pò lentino a completare i calcoli (circa 10secondi), ma il suo
> dovere lo fa.

Sono macro.
Puoi aspettarti di tutto da una macro, tranne la velocita'.

E' una elaborazione batch, da lanciare solo quando serve, generalmente
prima di andare a prendere un caffe'.
Torni, e lui ha finito.

p.s. un consiglio.
Gli oggetti usati per puntare al documento, al foglio e alla cella,
mettici una o minuscola davanti al nome:
oDoc, oSheet, oCell.

E' solo una convenzione, ma migliora di molto la leggibilita' del
codice, in quanto lo stesso nome, senza la o minuscola, Doc, Sheet,
Cell, potrebbe essere confuso con un oggetto interno o un metodo o una
proprieta'...

Sergio Marelli

unread,
Dec 16, 2010, 6:27:41 AM12/16/10
to
> Sono macro.
> Puoi aspettarti di tutto da una macro, tranne la velocita'.
>
> E' una elaborazione batch, da lanciare solo quando serve, generalmente
> prima di andare a prendere un caffe'.
> Torni, e lui ha finito.

Capisco, infatti in realtà mi aspettavo che la macro fosse qualcosa
che rimaneva in aggiornamento automatico un pò come le celle con
formule.
C'è nessun modo per ottenere qualcosa di simile? forse bisogna
programmare con C++ o simili?

> p.s. un consiglio.
> Gli oggetti usati per puntare al documento, al foglio e alla cella,
> mettici una o minuscola davanti al nome:
> oDoc, oSheet, oCell.
>
> E' solo una convenzione, ma migliora di molto la leggibilita' del
> codice

Sarà fatto, grazie del consiglio.

Innuendo

unread,
Dec 16, 2010, 6:38:41 AM12/16/10
to
Il 16/12/2010 12:27, Sergio Marelli ha scritto:
> Capisco, infatti in realt� mi aspettavo che la macro fosse qualcosa
> che rimaneva in aggiornamento automatico un p� come le celle con
> formule.
> C'� nessun modo per ottenere qualcosa di simile? forse bisogna

> programmare con C++ o simili?

Puoi provare a usare le formule, non ho analizzato a fondo il tuo
algortimo ma non mi sembra impossibile da implementare usando solo le
formule e qualche cella "di appoggio" dove scrivere i dati temporanei.

Per esempio il massimo del tuo elenco (che spero sia a lunghezza fissa)
lo puoi ottenere scrivendo in una cella =max(I10:I699) che � certamente
molto pi� veloce che non ciclare con la macro su tutte le 700 righe del
tuo elenco.

Gi� leggere questo valore da una cella senza scorrere tutto l'elenco
dovrebbe velocizzarti di molto il lavoro.

ciao
Mauro

Sergio Marelli

unread,
Dec 16, 2010, 7:48:40 AM12/16/10
to

No, non credo sia possibile con le formule perchè mi serve un LOOP che
con le formule non c'è, proprio per questo ho iniziato a studiare lo
starBasic.

Il massimo è già calcolato con le celle comunque. La seguente
istruzione prende il valore di una cella in cui è registrato il valore
massimo di tutta la colonna.
Questo valore è poi utilizzato per trovare l'indirizzo della cella che
contiene il valore massimo... e la prima istruzione IF serve proprio a
questo:
Insomma la prima istruzione IF ha il solo scopo di rendere noto
l'indirizzo della riga che contiene il valore massimo.
Certo che se ci fosse un modo per ottenere l'indirizzo di una cella in
modo più smart sarebbe ottimo.

Perchè poi da questa posizione il programma somma il valore sopra e i
lvalore sotto fino a che non raggiunge il 70% della somma totale dei
valori (e questo sarebbe il LOOP)

Sergio Marelli

unread,
Dec 16, 2010, 7:51:41 AM12/16/10
to

> Il massimo è già calcolato con le celle comunque. La seguente
> istruzione prende il valore di una cella in cui è registrato il valore
> massimo di tutta la colonna.


questa sarebbe "la seguente istruzione"

P = Sheet.getCellByPosition(9,6).Value

il P è poi usato per trovare lo stesso valore di P in T... a seconda
di quanti incrementi di I mi ci sono voluti per torvare il valore T=P
so l'indirizzo di cella..

spero di essere riuscito a farti capire meglio il problema così magari
saprai darmi una soluzione più veloce per comunicare l'indirizzo di
una cella NON nota al sistema.

Innuendo

unread,
Dec 16, 2010, 8:17:51 AM12/16/10
to
Il 16/12/2010 13:48, Sergio Marelli ha scritto:
> Insomma la prima istruzione IF ha il solo scopo di rendere noto
> l'indirizzo della riga che contiene il valore massimo.
> Certo che se ci fosse un modo per ottenere l'indirizzo di una cella in
> modo più smart sarebbe ottimo.

Una volta che tu conosci il valore massimo puoi fare un cerca() per
trovare la sua posizione.

Una cosa del tipo (vado a memoria)

Cella A1 = max (I1:I100)
Cella A2 = cerca.vert(A1;I1:I100)

In questo modo in A2 trovi l'indirizzo della cella con il valore massimo

Certo che se nel tuo elenco ci sono due celle con lo stesso valore
massimo puoi avere problemi, ma mi pare che questo succeda anche con il
tuo codice.

ciao
Mauro

Sergio Marelli

unread,
Dec 16, 2010, 8:43:04 AM12/16/10
to
Vero, probabilmente funziona mettendo in una colonna i valori
corrispondenti al numeor della riga e dando come indice della formula
CERCA quella colonna.

Si i due massimi sarebbe un problema, al momento lo faccio fermare al
primo che trova.

0 new messages