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]

Rispondere a