Condividi:        

[Excel] Macro al cambiamento di una cella

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

[Excel] Macro al cambiamento di una cella

Postdi luca2002for » 29/04/10 19:23

Salve a tutti e un saluto particolare a Anthony e Flash.

Vi annoio con una questione che qua è là è stata già in parte trattata nel forum ma che, nel modo con cui mi si presenta adesso, non riesco a risolvere con i suggerimenti che ho finora trovato.

Il mio foglio di excel riceve dati in diretta con collegamento DDE, esegue delle macro a tempo, si compone di più fogli di lavoro (che vengono utilizzati sostanzialmente per dei copia-incolla valori). Contiene anche delle celle col valore di alcuni indicatori numerici (che sono la sintesi dei dati DDE variamente analizzati e calcolati).

Ciò che vorrei riuscire a fare è semplicemente questo: se una cella (supponiamo per semplicità la A1 del Foglio1) il valore numerico (che è in costante fluttuazione, perché dipendente da calcoli in cui sono presenti valori dinamici, il DDE appunto) diventa per esempio maggiore di 1 allora vorrei che in automatico partisse la routine Macro1.

I tentativi che ho fatto finora (basati su una Private Sub Worksheet_Change(ByVal Target As Range) inserita nel VBA del Foglio1) hanno avuto risultati deludenti, perché excel si “accorge” del cambiamento del valore (>1) della cella A1 solo quando io manualmente inserisco un valore qualsiasi in un’altra cella. Allora excel si “sveglia” e riconoscendo la condizione verificata, mi fa partire la Macro1.

Ma se “non tocco” il foglio, i valori della cella A1 cambiano e diventano molte volte >1 senza che la Macro1 parta.

Mi pare che in gioco sia proprio il tema dell’”attenzione” di excel alla variazione delle celle e laddove esistesse il modo per avere questa attenzione sempre al massimo mi piacerebbe verificare i riflessi del programma (esempio se il valore della cella A1 diventa 1,3 – cioè maggiore di 1 – per un decimo, supponiamo, di secondo, excel se ne accorgerà?).

Un ringraziamento anticipato a chi volesse darmi uno spunto, scusandomi (come di consueto) per la prolissità.

Luca
luca2002for
Utente Senior
 
Post: 116
Iscritto il: 07/05/06 09:32

Sponsor
 

Re: [Excel] Macro al cambiamento di una cella

Postdi Anthony47 » 03/05/10 00:06

Ci sono ancora...
Ovviamente Worksheet_Change non funziona perche' non ci sono cambiamenti eseguiti da tastiera sul foglio.
Immagino che la cella A1 sia "dipendente" da una cella contenente un link dde; dovrai pertanto inserire la verifica If [A1] > 1 all' interno della macro che fai scattare (tramite SetLinkOnData) con quel dde; ovviamente l' istruzione completa sara' If [A1] > 1 Then Call Macro1.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [Excel] Macro al cambiamento di una cella

Postdi luca2002for » 03/05/10 18:34

E meno male che ci sei :)

Grazie della risposta, ma non riesco ad applicarla. Ho letto le “generalità” del metodo SetLinkOnData su http://msdn.microsoft.com/en-us/library/aa202966(office.10).aspx e ho cercato sulla base di queste informazioni, di costruire una macro.

Ma non funziona. Il codice che ho provato a mettere insieme

Codice: Seleziona tutto
Sub controlla()
ActiveWorkbook.SetLinkOnData _
    A1, _
    "macro1"
    End Sub


dove la parte A1 doveva rappresentare la cella A1 (ma dubito che ciò sia corretto)

fa attivare la macro1 a un qualsiasi cambiamento di una delle tante celle contenenti il dde e non a quelli (soltanto) della cella A1 del foglio1 (che come hai giustamente intuito, non è un “puro” collegamento dde ma una somma di valori che pur “derivando” da celle dde, non contengono la relativa formula, essendo semplici calcoli).

Mi sento lontano dall’obbiettivo, anche perché, anche se questa macro funzionasse, si attiverebbe ai cambiamenti puri e semplici di A1 e non per valori di A1>1. Proprio non riesco a capire come il SetLinkOnData possa, a livello di codice, essere unito ad una condizione come A1>1.

Ho letto, tra le altre, anche pagine di una discussione che avevo iniziato proprio io un po’ di tempo fa, ma ammetto che non ci capisco più niente e che le macro che postai all’epoca e delle quali ero soddisfatto, non funzionano.

Secondo te dove sbaglio? Grazie ancora

Luca
luca2002for
Utente Senior
 
Post: 116
Iscritto il: 07/05/06 09:32

Re: [Excel] Macro al cambiamento di una cella

Postdi Anthony47 » 04/05/10 22:09

Ehi, vuoi dire che hai dimenticato quanto fatto nel 2006 qui
viewtopic.php?f=26&t=46965&start=20 ?

Riporto il punto saliente:
La sintassi e’ ActiveWorkbook.SetLinkOnData Nome_link, Procedura
Se tu sai il Nome_Link (qualcosa che somiglia a: Programma|Documento!Link) il gioco e’ fatto:
Codice: Seleziona tutto
Codice: Seleziona tutto
    Sub LinkList()
        ActiveWorkbook.SetLinkOnData “Nome_Link”, "Macro1"   
    End Sub


Immagino che nelle tue macro il problema e' risolto, nel senso che avrai una macro che (tramite il metodo SetLinkOnData) imposta l' esecuzione di altre macro quando il link dde fornisce un dato modificato; devi individuare quale e' il dato dde "precedente" della cella A1 (quella che ne determina il cambiamento di valore), quale macro hai preattivata al cambio della cella "precedente", e in questa macro inserire il controllo sul valore di A1; correggo la sintassi dell' istruzione da inserire, in quanto e' opportuno inserire sia il workbook name che lo sheet name in cui si trova il tuo A1; quindi:
If Workbooks("NomeFile.xls").Sheets("NomeFoglio").Range("A1").Value > 1 Then Call macro1

Se le macro vecchie non funzionano allora devi fare un debug per individuare le istruzioni che sbagliano e poi correggere; per suggerimenti sul debug consiglio la lettura di questo thread: viewtopic.php?t=65537

Ciao, fai sapere se si accende qualche lucina...
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [Excel] Macro al cambiamento di una cella

Postdi luca2002for » 05/05/10 11:29

Grazie per l’interessamento Anthony :)

Il punto nodale della questione è questo:

Immagino che nelle tue macro il problema e' risolto, nel senso che avrai una macro che (tramite il metodo SetLinkOnData) imposta l' esecuzione di altre macro quando il link dde fornisce un dato modificato;


Per la verità accade che il mio dde si aggiorna automaticamente (cioè non ho delle “precedenti macro" col metodo SetLinkOnData, che impostano l’esecuzione di altre macro). Non esiste una sola macro nel mio foglio col metodo SetLinkOnData.

E la cella A1, del famoso Foglio1, non contiene dde “diretto”, ma una formula che solo di riflesso si riferisce ad alcune (neanche tutte) le celle dde presenti sul foglio.

Questa cella A1 assume dei valori “fluidi”, nel senso che, in dipendenza dei calcoli e delle celle dde, assume valori fluttuanti in maniera continua.

Siccome a me interessa far partire una macro quando il valore della cella A1 è >1, avevo finora risolto (parzialmente) il problema con una on time a 1 secondo che “controllava” il valore di A1.

La soluzione è però piuttosto scadente perché può facilmente accadere che “all’interno” dei 10 decimi di secondo dell’on time (=1 secondo) la cella valga, per esempio 2,1 al secondo decimo, 3 al terzo decimo, 18 al quarto decimo, per tornare poi a 0,1 all’ultimo decimo, quando l’on time effettua il controllo e mi dice che non ci sono macro da far partire perché il valore di A1 è inferiore a 1 (infatti è 0,1, ma il foglio non “sa” che in realtà è arrivato fino a 18 nei decimi di secondo precedenti, nei quali lui non controllava).

Ed è proprio per cercare di ovviare a questa “cecità” del foglio sul controllo del valore della cella A1 che ho postato questo problema (che in realtà, e ho fatto male a non spiegarlo prima, forse c’entra poco con il dde, se non per il fatto che si chiede al foglio di “stare attento” ai cambiamenti di valore “fluidi” del contenuto di una cella dipendente "anche" da altre celle dde).

Avere un foglio perennemente “attento” alle variazioni fluide e continue del valore contenuto nella cella A1 del Foglio1. Questo è il mio obbiettivo.

Mi scuso se, spiegandomi male, Ti ho fatto perdere tempo.

Grazie ancora

Luca
luca2002for
Utente Senior
 
Post: 116
Iscritto il: 07/05/06 09:32

Re: [Excel] Macro al cambiamento di una cella

Postdi Anthony47 » 05/05/10 14:54

Tranquillo, non abbiamo perso tanto tempo.
La cella A1 cambia valore o (1) perche' qualcuno digita a mano dei dati, e in questo caso ripiegheremmo su una macro Worksheet_Change, o (2) perche' un suo "precedente" viene aggiornato tramite un link dde; ci sono anche altri casi ma non sono applicabili alla tua situazione.
Mi pare che il tuo caso sia il secondo.
L' ideale sarebbe ercare quindi quale cella con dde fa questo gioco, e poi mettere un SetLinkOnData solo su quel link; poiche' pero' mi sembri in difficolta' possiamo anche attivare il controllo di A1 su tutti i link: non sara' ottimizzato ma certamente e' efficace.
Per questo prova a inserire questo codice in un Modulo standard (es Modulo1):

Codice: Seleziona tutto
Private A1Run As Boolean
Private OldA1 As Single
Sub LinkList()
   Dim Links As Variant
   Links = ActiveWorkbook.LinkSources(xlOLELinks)
   If Not IsEmpty(Links) Then
       For I = 1 To UBound(Links)
           ActiveWorkbook.SetLinkOnData Links(I), "MacroA1"
       Next I
   Else
       MsgBox "This workbook does not contain any links " & _
       "to other workbooks"
   End If
End Sub

Sub MacroA1()
If A1Run = True Then Exit Sub
A1Run = True
If OldA1 > 1 Then OldA1 = Workbooks("NomeFile.xls").Sheets("NomeFoglio").Range("A1").Value: _
   GoTo EndA1
OldA1 = Workbooks("NomeFile.xls").Sheets("NomeFoglio").Range("A1").Value
'
Beep
'Le tue istruzione per gestire A1 >1
'
EndA1:
A1Run = False
End Sub

Inserisci il vero Nome File e Nome Foglio, poi aggiungi le istruzioni che vuoi eseguire in caso di A1 >1; al momento c' e' solo un "beep" che potrebbe essere usato per un primo collaudo.

MacroA1 non si riesegue completamente se A1 e' "ancora >1", cioe' aspetta che A1 torni a <=1.

Procedura:
-inserisci il codice in Modulo1
-correggi il NomeFile e NomeFoglio
-esegui una volta la Sub LinkList, che impostera' l' esecuzione di MacroA1 and ogni modifica dei dati dde.

Ciao, fai sapere.
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [Excel] Macro al cambiamento di una cella

Postdi luca2002for » 26/05/10 14:11

Grazie della risposta Anthony :-)

Ho lasciato passare un pò di tempo perchè non appena ho copiato il tuo codice sul mio foglio e l'ho testato ho visto che era un passo avanti gigantesco rispetto a tutti gli altri tentativi fatti.

Ma, contemporaneamente, non mi sembrava facesse quello che volevo.

Ho testato e ritestato, cercando anche di capire il funzionamento del tuo codice (impresa riuscita solo in parte, devo ammetterlo) ma accade che la macro che si attiva al verificarsi della condizione richiesta (cioè nel mio foglio il valore di A1 > 1) si attivi spesso (non sempre) anche per valori di A1 < 1.

Ho provato differenti macro (tutte attivate dalla condizione e lasciando ovviamente intatto tutto il resto del tuo codice), ma il risultato non cambia.

Si attivano spesso anche per valori non entranti nella condizione (anche se, ed è il qui il passo gigantesco in avanti, effettivamente vedo il foglio che "gira" e si attiva al cambiamento della cella A1).

Da un excel "disattento" (che non si attivava al cambio della cella) siamo quindi passati ad un foglio "iperattivo" :lol: (o chissà forse in ritardo rispetto ad un valore precedente che viene "sentito" in ritardo di quella frazione di secondo per cui la macro si attiva in presenza di un valore diverso e non rispondente alla condizione).

E se provassi a mandarti il foglio di lavoro con "C" (compra) e "V" (vendi) nella A1? Certo il problema sarebbe che non avresti i dati DDE "in movimento" non avendo la mia piattaforma.

Però forse potresti vedere concretamente l'idea che ho in testa.

Sai mica dove posso postare il file?

Grazie mille ancora :oops:

Luca
luca2002for
Utente Senior
 
Post: 116
Iscritto il: 07/05/06 09:32

Re: [Excel] Macro al cambiamento di una cella

Postdi Anthony47 » 27/05/10 00:38

In effetti mi pare proprio che nella MacroA1 manca un test cruciale; quindi dopo questa
OldA1 = Workbooks("NomeFile.xls").Sheets("NomeFoglio").Range("A1").Value
metti questa:
Codice: Seleziona tutto
If OldA1<=1 then GoTo EndA1

Per quanto riguarda la copia del file, non avevdo la tua piattaforma di lavoro non me ne farei assolutamente nulla.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "[Excel] Macro al cambiamento di una cella":


Chi c’è in linea

Visitano il forum: Marius44 e 50 ospiti