Il 18/04/2012 19:17, [email protected] ha scritto:
> Posto di qua dato che in ML Libò l'argomento è fermo ma credo possa 
> interessare
> sia come soluzione che come eventuale stimolo :-)
> 
> Avevo postato questo:
> %
> Ci deve essere sicuramente una soluzione semplice ma proprio non mi viene...
> E' possibile utilizzare un SE per riempire o una terza o una quarta cella?
> In pratica, SBAGLIANDO la sintassi ma seguendo la logica mi occorrerebbe avere
> una formula del tipo:
> SE(A1>5; C1="XXXX";D1="XXXX") [leggendola: se a1 è maggiore di 5 allora metti 
> in c1 le x, se no metti in d1 le x] (ovviamente il tutto, celle valori segni 
> e 
> compreso la formula SE, sono per pura indicazione del processo logico e non 
> materialmente dei vincoli)
> Esempio per spiegare cosa vorrei ottenere:
> A1 è la cella discriminante (dove immettere il carattere che fa da 
> spartiacque)
> B1 continene il SE che deve spostare l'eventuale segno di spunta tra C1 e D1
> C1 cella di destinazione
> D1 cella di destinazione
> 
> Ovviamente le celle C1 e D1 non possono contenere ne formule ne altro dato 
> che 
> quella delle due non contenente le XXX dell'esempio dovrà essere scritta in 
> seguito, con dati successivi.
> Piccola altra complicazione: non posso usare la formattazione condizionata 
> dato che questa diviene attiva DOPO che si è inserito qualcosa nella cella, 
> mentre mi occorre che una delle due celle contenga il segno di eliminazione 
> PRIMA di qualsivoglia digitazione. (Ovvero se ad esempio uso formattazione 
> condizionata rosso e doppio barrato i caratteri del dato diverranno rossi e 
> doppiobarrati DOPO che nella cella C1 sono stati scritti e si sia premuto 
> invio 
> ma a me occorre che quella cella sia interdetta o bloccata in qualche modo o 
> già riempita con delle XXX PRIMA che perdano tempo a scriverci per poi 
> accorgersi di aver sbagliato, cancellare e riscrivere nelle celle giuste)
> 
> Il SE computa il risultato nella sua cella, ovvero restituisce il risultato 
> nella cella dov'è inserita la formula, come si fa a fargli puntare ad un'altra
> casella, ovvero a fargli inserire i risultati in una casella terza?? 
> % 
> 
> unica risposta
> %
>> Io farei così:
>> In A1 metti il valore che vuoi, purché sia un numero.
>> In C1 scrivi SE(A1>5;"x";"")
>> In D1 scrivi SE(A1<=5;"x";"")
>> Non userei B1.
>> La doppia virgoletta ti lascia la cella vuota.
> 
> No, è già fatto a questa maniera e non va bene, le celle c1 e d1 DEVONO 
> restare vuote dato che chi compilerà il modulo altrimenti sovrascriverà i SE 
> che contengono!
> Ho usato l'escamotage di fare il modulo originale in OTS (modello) in modo 
> che 
> aprano dei nuovi moduli di volta in volta, quindi riproducendo ogni volta la 
> situazione originale, senza caselle con le formule sovrascritte ma non c'è 
> verso, le ragazze
> mi creano casini compilando i moduli successivi utilizzando il precedente già 
> fatto anzichè aprendone uno nuovo e quindi nelle celle che contenevano il SE 
> alla volta successiva non c'è piùla formula dato che sonos tati inseriti i 
> dati 
> e si scombina tutto il resto dei dati....
> 
> In pratica devo far compilare un elenco complesso e a seconda di cosa viene 
> scritto in alcune determinate celle una serie di altre devono essere 
> immediatamente riempite con delle X o interdette in modo da risultare A VISTA 
> non scrivibili, mentre delle altre resteranno vuote quindi riempibili con i 
> dati necessari. In questo modo prevengo gli errori e sopratutto non devo 
> andarmi a ricontrollare tutti i sacrosanti dati uno per uno visto che sono 
> una 
> sfliza di valori e li sbagliano praticamente sempre...
> 
> Nel caso non se ne venga a capo con semplici formule proverò a farmi una 
> macro 
> ad hoc... anche se volevo evitare macro e sopratutto pensavo esistesse la 
> possibilità di andare a modificare un valore in una cella terza anzichè per 
> forza limitarsi alla combinazione cellaorigineformula=cellarisultatofinale:
> tutte le formule restituiscono il controvalore nelle celle in cui sono 
> scritte...
> %
> 
> Ho risolto (per modo di dire) così: ho creato una serie di campi formattati 
> con la barra formulario associando ad ognuno di questi la serie di macro 
> necessarie a riempire o meno le celle finali.
> Ma è un pasticcio e non mi piace come soluzione.
> Quindi pongo un ulteriore questione: è possibile bloccare una cella 
> nascondendola o comunque impedendone la scrittura se in una determinata altra 
> avviene qualcosa?
> Esempio:
> A1 vuota
> A2 vuota
> A3 vuota
> Scrivo 1 in A1 ed alla pressione del tasto invio il cursore si porta in A2
> Scrivo 3 in A1 ed alla pressione del tasto invio il cursore si porta in A3 
> saltando A2 dato che 3 è il numero scelto come discriminante.
> 
> Lo so che propongo cose di non semplice soluzione ma vedetela così: è un 
> pungolo a sbirciare da nuovi punti di vista :-)
> 
> Grazie per la pazienza di aver letto sta lunghissima mail 
> Angelo
> 
> ---------------------------------------------------------------------
> Per cancellarsi: [email protected]
> Per informazioni: http://www.openoffice.org/it/
> Per avviare una nuova discussione: [email protected]
> Archivi: http://mail-archives.apache.org/mod_mbox/incubator-ooo-utenti-it
> 
Ciao,
se decidi di abbandonare le formule (te lo consiglio!) puoi provare con
le macro!
Ti mando un esempio che utilizza un event listner.
Vedi se fa al caso tuo:

Attenzione alle righe di codice spezzate x motivi di spazio!

Global oListener, oSheet, oCell

Sub AddListenerA1
        oSheet = ThisComponent.getSheets().getByName("Foglio1")
        oCell = oSheet.getCellRangeByName("A1")
        oListener = CreateUnoListener("OOO_",
"com.sun.star.chart.XChartDataChangeEventListener")
        oCell.addChartDataChangeEventListener(oListener)
End Sub

Sub OOO_chartDataChanged
Dim aCellProtection As New com.sun.star.util.CellProtection
        oCellToLock = oSheet.getCellRangeByName("F1") 'La cella da proteggere è 
F1
        If oCell.getValue() > 5 Then
                oSheet.getCellRangeByName("C1").String = "XXXX"
                aCellProtection.IsLocked = true
                oCellToLock.CellProtection = aCellProtection
        Else    
                oSheet.getCellRangeByName("D1").String = "XXXX"
        End If
End Sub

Sub RemoveListnerA1
        oCell.removeChartDataChangeEventListener(oListener)
End Sub

Il funzionamento è semplice, esegui AddListnerA1 e poi prova a inserire
un valore in A1.
Se il valore inserito è maggiore di 5 scrive in C1 e blocca F1,
altrimenti scrive in D1.
Dovrebbe essere più o meno quello che ti serviva...

---------------------------------------------------------------------
Per cancellarsi: [email protected]
Per informazioni: http://www.openoffice.org/it/
Per avviare una nuova discussione: [email protected]
Archivi: http://mail-archives.apache.org/mod_mbox/incubator-ooo-utenti-it

Rispondere a