Il 09/11/2010 10:09, Fernando ff77 ha scritto:
[....]
esempio completo:
prog Tipo L H risultato_formula.1 risultato_formula.2
risultato_formula_NN
1 A 1000 2000
2 B 1500 2000
3 C 2000 2300
4 A 1200 1200
5 A 2100 2200
6 D 1000 1230
. E 1200 2000
40 F 800 900
in base al campo Tipo devo decidere che formule applicare
non volevo inserire mega formule con tanti SE perchè se poi l'utente deve
modificare una formula o aggiungere una tipologia è un casino.
così è più chiaro ?
Ora è molto più chiaro!
Se fosse un database al posto di una sola tabella avresti una tabella
"profili_di_calcolo" e una "prodotti" legate da una relazione 1 a molti.
La tabella con i risultati sarebbe in effetti una query
E' possibile che in SQL esista una funzione eval() e comunque molti db
relazionali possono elaborare query parametriche e annidate, quindi può
darsi che l'approccio che tu stai tentando sia più indicato per un db.
In ogni caso, restiamo sul pezzo e vediamo cosa si può fare in Calc
1)
Direi che abbiamo appurato che la soluzione standard suggerita anche
nell'ultimo posto da Guido Moretto non ti va bene in quanto tende a
generare delle megaformule difficilemnte manipolaili.
2)
In basic si possono scrivere funzioni che si possono utilizzare nel
foglio elettronico come se fossero normali funzioni di Calc
In teoria perciò sarebbe possibile creare una funzione che prende del
testo, es: "a1+b1" lo inserisce in una cella "di appoggio" come se fosse
una formula e trasferisce il risultato alla cella chiamante.
purtroppo però esistono dei limiti a quello che si può fare in una
funzione basic da usare come formula in calc.
Facciamo un esempio pratico per capire meglio:
immaginiamo di scrivere la seguente funzione basic:
Function MiaSomma(a, b) As Double
nResult = a + b
MiaSomma = nResult
End Function
Poi andiamo in una cella qualsiasi e scriviamo
= MIASOMMA(5;9)
otterremo ovviamente il risultato corretto: 14
In pratica se esaminiamo quello che è successo "dietro le quinte" è che
Calc durante l'evento "ricalcola" ha richamato la funzione basic e ha
riportato il risultato nella cella di desitinazione.
L'evento "ricalcola" avviene ogni volta che si modifica una cella
Ora prendiamo in esame il tuo caso specifico e scriviamo una funzione ad
hoc:
Function EvalFunc(sFormula As String) As Variant
XCell = ThisComponent.Sheets(0).getCellByPosition(0,100)
XCell.FormulaLocal = "=" & sFormula
EvalFunc = XCell.Value
End Function
La funzione EvalFunc riceve una stringa e usa una cella arbitraria
(XCell) per valutare la stringa come se fosse una funzione di Calc.
Questa procedura funziona perfettamente se richiamata dall'ambiente
basic, ma non funziona se usata come formula di Calc.
Perchè?
Perchè Calc non ti permette di modificare il contenuto di una cella
durante un evento "ricalcola" e questo è perfettamente logico perchè la
modifica della cella causerebbe a sua volta un evento "ricalcola" il
quale causerebbe una nuova modifica della cella e un nuovo evento
"ricalcola" e così via, in un loop infinito.
Adesso che abbiamo capito la situazione possiamo arguire che se usiamo
la stessa tecnica della funzione EVALFUNC ma azionando la procedura
attraverso un pulsante dovremmo ottenere il risultato sperato.
Il problema ora è:
l'approccio "statico" (ad esempio con un pulsante "calcola" posto in una
barra personalizzata o direttamente sul foglio elettronico) ti garba o no?
ciao
Paolo M
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]