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
Se scarichi le super FAQ ...
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.
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.
Certamente ... puoi fare ciò che vuoi ... o quasi.
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.
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
> 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/
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.
> 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
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
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"
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
> 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/
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"
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
> 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'...
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.
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
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)
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.
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
Si i due massimi sarebbe un problema, al momento lo faccio fermare al
primo che trova.