loop infinito



  • loop infinito
    di bollicine (utente non iscritto) data: 12/02/2014 22:53:57

    buonasera a tutti,
    sto a fatica creando una macro in vba che dovrebbe far emettere il suono a.wav se il valore in A1 supera quello in A2 oppure il suono b.wav se il valore in A1 è inferiore a quello in A3.

    Il valore in A1 proviene da una cella dde, ma per il momento mi basterebbe funzionasse soltanto inserendo io i dati in A1.

    Domanda: la singola macro di controllo magari riesco a scriverla, ma non riesco a gestire un automatismo, non posso certo continuare a fare click su RUN. Il loop dovrebbe svolgersi una volta ogni mezzo secondo.

    qualcuno samdove posso trovare qualcosa già fatto?
    grazie



  • di Mister_x (utente non iscritto) data: 12/02/2014 23:40:45

    ciao

    da mettere in un modulo di classe
    PS non scendere sotto i 3 secondi, altrimento avresti dei problemi


    ciao Mister_x
     
    ''In um Modulo
    Option Explicit
    Sub Orario()
    DoEvents
    '''' qui il la tua rutin indirizzata al foglio da controllare con il tuo  RUN
      Application.OnTime Now + TimeSerial(0, 0, 3), "Orario" ''ogni 3 secondi
    End Sub






  • di scossa data: 12/02/2014 23:44:25

    Ciao,

    non capisco perché parli di automatismo: ti basta far lanciare la macro al variare del valore della cella A1.



  • di bollicine (utente non iscritto) data: 12/02/2014 23:50:23

    Intanto grazie per la risposta,
    poi cerco di capire cosa intendi per "modulo di classe"

    Ma prima che mi ci metto, io devo controllare il valore di una cella che prende i dati da un flusso DDE, questi dati variano ogni decimo di secondo e vorrei monitorare una decina di celle, A1, B1, ...

    Se mi dici di stare sotto i 3 secondi allora mi fermo e cerco altre soluzioni, vba non farebbe per me.

    Come hai stabilito questo valore?
    Grazie



  • di bollicine (utente non iscritto) data: 12/02/2014 23:55:09

    Grazie scossa,
    saresti così gentile da dirmi cosa devo scrivere come codice per far partire un suono se in A1 leggo meno di x o un altro suono se in A1 leggo piu di y (poi x e y li vario a piacere, meglio se posso scrivere questi valori in due celle del foglio
    Grazie ancora



  • di patel data: 13/02/2014 08:09:10

    prova il file allegato cambiando il valore di A1
    attualmente confronta soltanto A1 a A2, non ho capito cosa dovrebbe fare con A3





  • di scossa data: 13/02/2014 09:10:05

    @patel: ricordati di indicare il nome del file che alleghi, altrimenti se ne vengono allegati altri non si capisce più CHI h allegato COSA



  • di patel data: 13/02/2014 09:39:50

    ho allegato suona.xlsm





  • di scossa data: 13/02/2014 14:26:07

    cit.: "Ma prima che mi ci metto, io devo controllare il valore di una cella che prende i dati da un flusso DDE, questi dati variano ogni decimo di secondo e vorrei monitorare una decina di celle, A1, B1, ...
    Se mi dici di stare sotto i 3 secondi allora mi fermo e cerco altre soluzioni, vba non farebbe per me. "

    Scusa, ma ti rendi conto del fastidio che ti crea un suono ripetuto anche solo ogni 3 secondi??
    A parte il fatto che un suono ha una sua durata e se inferiore al secondo nemmeno lo senti ......

    Bho!



  • di bollicine (utente non iscritto) data: 13/02/2014 15:53:19

    di scossa (Utente esperto) data: 13/02/2014 14:26:07
    Scusa, ma ti rendi conto del fastidio che ti crea un suono ripetuto anche solo ogni 3 secondi??
    A parte il fatto che un suono ha una sua durata e se inferiore al secondo nemmeno lo senti ......
    Bho!

    Grazie scossa,
    capisco benissimo la tua risposta, dovevo invatti spiegare prima per bene quello che vorrei fare:

    SITUAZIONE:
    ha un flusso dati DDE dalla mia banca che alimenta le celle A1, A2, A3, fino alla A20.
    Ogni riga corrisponde ad un titolo, diciamo che ne seguo al max 10.
    La cella A1 riporta un valore numerico con due decimali, es. 102,87 (il range va da zero a 1000 per determinare il tipo di variabile).

    COSA FACCIO
    guardo in continuazione questo valore della cella A1 e se supera un altro valore vendo, se è inferiore acquisto.
    questo mi obbliga a stare sempre davanti al video.

    COSA VORREI:
    avendo i dati su un foglio excel 2007 pensavo di automatizzare il tutto.
    vorrei inserire un valore nella cella A20 che se maggiore o uguale a quello in A1 si produca un suono .wav da 2 secondi (sopra.wav).
    vorrei nel contempo inserire un valore nella cella A21 che se inferiore o uguale a quello in A1 si produca diverso suono .wav da due secondi (sotto.wav)

    vero che la cosa può infasidire ma una volta che il programma funziona a suono avvenuto posso decidere di fermare questo loop,

    non riesco a creare questo loop, mi mancano le basi di vba (purtroppo).

    In seguito potrei decidere quante volte far avviare l'allarme sopra.wav, per ora mi accontenterei che stabilite due soglie sopra e sotto, da mettere nelle cella A20 e A21 la routine lanciata alle 9:00 facesse tutto da sola.

    grazie ancora
    bollicine
    13/2/2014 15:52



  • di bollicine (utente non iscritto) data: 13/02/2014 16:17:16

    dimenticavo,
    il loop infinito voorei testasse la cella A1 ogni mezzo secondo, max 1 secondo.
    grazie a chi mi aiuterà
    saluti



  • di Mister_x (utente non iscritto) data: 13/02/2014 17:53:02

    ciao

    se prendiamo in considerazione il file di Patel e apportiamo alcune modifiche alle sub() ne esce un qualcosa funzionante
    ti spiego da come vedrai nel file allegato SuonoBis
    in A1 ai i tuoi dati che arrivano da DDE , per simulare ho usato la cella G1
    in A20 ai la soglia max
    in A21 la Min
    la sub() Orario non fa altro che controllare la cella A1 se il suo valore cambia e se questa passa le soglie di max e min fa partire un suono per 2 secondi di avvertimento

    sempre inserito il tutto in un modulo

    ciao Mister_x
     
    Declare Function sndPlaySound32 Lib "winmm.dll" Alias "sndPlaySoundA" _
        (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long
    Option Explicit
    Dim A_1 As Variant
    
    Sub Orario()
    DoEvents
    If A_1 <> Worksheets(1).[A1] Then
    If Worksheets(1).[A1] < Worksheets(1).[A21] Or Worksheets(1).[A1] > Worksheets(1).[A20] Then Call PlaySound
      A_1 = Worksheets(1).[A1]
    End If
    Application.OnTime Now + TimeSerial(0, 0, 1), "Orario"
    End Sub
    
    
    Sub PlaySound()
        If Application.CanPlaySounds Then
            Call sndPlaySound32("c:windowsmediachimes.wav", 2)
        End If
    End Sub
    






  • di bollicine (utente non iscritto) data: 13/02/2014 19:03:18

    grazie mister,
    riesci a farmi getire due diversi suoni .wav,
    uno se supera la soglia alta ed uno per la soglia bassa?
    grazie 1000
    ciao
    bollicine



  • di Mister_x (utente non iscritto) data: 13/02/2014 20:06:36

    ciao

    Gruppo di sub() da sostituire con quelle attuali
    adesso ti colora anche la cella A1 di rosso se scende sotto il minimo , di verde sale sopra il massimo , se e' stabile mantiene la cella a nessun colore
    se non ti piacciono i suoni li puoi cambiare basta scegliere tra quelli in c:windowsmedia

    ciao
     
    Declare Function sndPlaySound32 Lib "winmm.dll" Alias "sndPlaySoundA" _
        (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long
    Option Explicit
    Dim A_1 As Variant
    
    Sub Orario()
    DoEvents
    If A_1 <> Worksheets(1).[A1] Then
    If Worksheets(1).[A1] < Worksheets(1).[A21] Then
      Call PlaySound_Min
      Worksheets(1).[A1].Interior.ColorIndex = 3
      A_1 = Worksheets(1).[A1]
    ElseIf Worksheets(1).[A1] > Worksheets(1).[A20] Then
      Call PlaySound_Max
      Worksheets(1).[A1].Interior.ColorIndex = 4
      A_1 = Worksheets(1).[A1]
    Else
      Worksheets(1).[A1].Interior.ColorIndex = xlNone
      A_1 = Worksheets(1).[A1]
    End If
    End If
    Application.OnTime Now + TimeSerial(0, 0, 1), "Orario"
    End Sub
    
    
    Sub PlaySound_Min()
        If Application.CanPlaySounds Then
            Call sndPlaySound32("c:windowsmediachimes.wav", 2)
        End If
    End Sub
    
    
    Sub PlaySound_Max()
        If Application.CanPlaySounds Then
            Call sndPlaySound32("c:windowsmediachord.wav", 2)
        End If
    End Sub
    






  • di bollicine (utente non iscritto) data: 13/02/2014 20:51:42

    sei un Grande Mister_x,
    stasera mi studio per bene tutte le istruzioni che hai usato, magari ti farò qualche domanda, ma il flow è quello che volevo, bene.
    domani con i mercati aperti la provo.
    Buona serata
    bollicine



  • di Zer0Kelvin data: 13/02/2014 21:13:01

    Ciao.
    Nel frattempo stavo allegando un file per illustrare un'altra strada percorribile.
    Il file in sè non ha quasi nulla a che fare con questo quesito.
    L'unica cosa che ha in comune è il fatto di dare il via ad un'azione (nel file si tratta di aprire una MsgBox) al variare del valore di una cella; nell'esempio la condizione scatenante è che la cella A1 contenga la stringa "PAROLA".
    Nel file viene usato l'evento Application.AfterCalculate() per effettuare il controllo della cella alla fine del ricalcolo della cartella.
    Se la condizione richiesta è vera, allora verrà eseguita l'operazione prevista (che nel nostro caso sarà attivare il suono)

    Il file è AlarmBox.xls

    Il funzionamento del file è grossomodo questo:
    -Tramite un modulo di classe ridefinisco l'evento Application.AfterCalculate() (tale evento si verifica al completamento del ricalcolo, quindi ad ogni modifica di valori)
    -Definisco la/le condizioni da verificare (nell'esempio Range("A1") = "PAROLA"), che possono essere modificate agevolmente.
    -Imposto l'azione da eseguire se la condizione è Vera.
    Se interessa si può adattare il codice alla situazione.



  • di scossa data: 13/02/2014 22:47:03

    cit. Zer0Kelvin: "Nel file viene usato l'evento Application.AfterCalculate() per effettuare il controllo della cella alla fine del ricalcolo della cartella."

    Solo un'osservazione: il file ha estensione .xls quindi si presume che funzioni almeno con Excel 2003, ma in Excel 2003 l'evento AfterCalculate non esiste.

    Quindi chi volesse usarlo con Excel 2003 cancelli il codice relativo a AfterCalculate() e lo sostituisca con il seguente (ho limitato l'azione al solo Foglio1):
     
    Private Sub mApp_SheetCalculate(ByVal Sh As Object)
        If Sh.Name = Foglio1.Name And aRange.Value = aValue Then _
        MsgBox "LOTTI NON AGGIORNATI E CONTROLLATI DA PIU' DI UNA SETTIMANA - CONTROLLARE ED EVENTUALMENTE AGGIORNARE ", _
        vbCritical + vbOKOnly, "> CONTROLLO ED AGGIORNAMENTO LOTTI ! "
    End Sub



  • di scossa data: 13/02/2014 23:13:45

    cit. Mister_x: ....
    Application.OnTime Now + TimeSerial(0, 0, 1), "Orario"

    Non è che hai dimenticato qualcosa di molto importante?


    Comunque, visto che si parla di DDE, suggerisco la lettura dell'help relativi ai metodi SetLinkOnData e LinkSources




  • di bollicine (utente non iscritto) data: 14/02/2014 11:15:44

    Grazie Mister_X e scossa,
    il tutto funziona perfettamente,
    la procedura funziona anche riferendomi con un semplice =B30 dove in B30 ho una cella che si alimenta automaticamente via DDE,
    temevo non fosse possibile.

    Due ulteriori richieste:
    1. raggiunto un valore, esempio 103,44 quando come valore per far scattare il suono A ho impostato 103,31 vorrei che NON SCATTASSE IL SUONO SE NON PER ULTERIORI SUPERAMENTI DELL'ULTIMO VALORE. Altrimenti ho il suono di allarme anche se scende di poco ma comunque sta sopra 103,31. Idem per il suono B.

    2. Vorrei introdurre un'ultima feature, ho, sempre via DDE, una cella che mi riporta l'ora dell'ultima variazione, ora leggo 10.51.17, mi piacerebbe impostare una routine che mi avvii un terzo suono C quando il valore da monitorare sale ad esempio dello 0,2 percento in un tempo ravvicinato come 4/5/6 secondi. Questo suono C non interverrà se il valore salirà lentamente mentre lo farà per variazioni repentine (Suono C se sale rapido, suono D se scende rapido). Vorrei come per i valori di soglia minima e soglia massima dedicare altre due celle nel foglio xls che conterranno la percentuale e l'intervallo da considerare in secondi. La scelta di lavorare in percentuale in quanto alcuni valori da considerare sono ad esempio 90,12, altri 121,33 ed una mera differenza non avrebbe un comportamento uniforme, scopo è monitorare almeno 20 valori.
    Questa routine dovrebbe funzionare insieme alle altre.

    3. invece che scrivere io i dati nelle celle mi piacerebbe avere dei piccolo bottoni triangolari, up e down, che alzano o abbassano le mie impostazioni nelle celle, questo velocizzerebbe di molto il mio lavoro consentendomi di operare solo col mouse.

    4. tecnicamente il loop della procedura continua a girare oppure gira ogni secondo? Non mi è molto chiara l'istruzione Application.Ontime Now + Timeseriale (0,0,1), "Orario" >>>> a cosa si riferisce? Dove trovo maggiori informazioni? Chiedo questo per sapere quanto possa essere fluido il programma monitoranto 30/40 valori.

    Saluti a tutti

    Grazie Grazie Grazie
    bollicine



  • di scossa data: 14/02/2014 11:23:40

    cit. bollicine: "...il tutto funziona perfettamente...."

    ATTENZIONE:
    cit. Mister_x: .... Application.OnTime Now + TimeSerial(0, 0, 1), "Orario"

    Non è che hai dimenticato qualcosa di molto importante?

    Quando si schedula un evento OnTime si DEVE anche provvedere alla sua rimozione prima di chiudere il file, altrimenti le conseguenze potrebbero essere imprevedibili e magari dannose.




     
    
    



  • di Mister_x (utente non iscritto) data: 14/02/2014 21:12:48

    ciao scossa

    sono appena tornato e ho visto la tua postilla in base alla sub() orario,
    da come dici penso che bisogna uscire da questi prima di chiudere il file, se e' cosi basta creare una sub() e una variabile Boolen e determinare uscita da questa
    io adesso ho utilizzato i tasti ctrl+pausa per variare la Boolean da False a True per fermare e ho lasciato con una sub() AVVIA_Orario la possibilita di ricominciare,
    si puo' collegare anche un altro Bottone la sub() Spegni per effettuare questo lavoro o addirittura in uscita con la chiusura del file
    Fai sapere se e' questo che intendevi

    ciao

    per bollicine
    in base alla tua ultima richiesta appena ho un pochino di tempo e il cervello e libero, vedo se riesco ad implementare il tutto , questo anche per mio scopo personale in quanto non ho mai trattato un argomento simile
     
    Declare Function sndPlaySound32 Lib "winmm.dll" Alias "sndPlaySoundA" _
        (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long
    Option Explicit
    Dim A_1 As Variant
    Dim Spento As Boolean
    
    Sub AVVIA_Orario()
      Spento = False
       Call Orario
      Exit Sub
    End Sub
    
    
    Sub Orario()
    DoEvents
    If A_1 <> Worksheets(1).[A1] Then
    If Worksheets(1).[A1] < Worksheets(1).[A21] Then
      Call PlaySound_Min
      Worksheets(1).[A1].Interior.ColorIndex = 3
      A_1 = Worksheets(1).[A1]
    ElseIf Worksheets(1).[A1] > Worksheets(1).[A20] Then
      Call PlaySound_Max
      Worksheets(1).[A1].Interior.ColorIndex = 4
      A_1 = Worksheets(1).[A1]
    Else
      Worksheets(1).[A1].Interior.ColorIndex = xlNone
      A_1 = Worksheets(1).[A1]
    End If
    End If
    Application.OnKey "^{BREAK}", "Spegni"  ''ctrl+Pausa esce dalla sub()
    If Spento = True Then Exit Sub
    Application.OnTime Now + TimeSerial(0, 0, 1), "Orario"
    End Sub
    
    Sub Spegni()
     Spento = True
    End Sub
    
    
    Sub PlaySound_Min()
        If Application.CanPlaySounds Then
            Call sndPlaySound32("c:windowsmediachimes.wav", 2)
        End If
    End Sub
    
    
    Sub PlaySound_Max()
        If Application.CanPlaySounds Then
            Call sndPlaySound32("c:windowsmediachord.wav", 2)
        End If
    End Sub
    






  • di bollicine (utente non iscritto) data: 14/02/2014 23:47:16

    Nel frattempo, Mister:X, un grazie per il tempo che riuscirai a dedicarci.

    Le variabili sono due: la quotazione ed il tempo.
    L'obiettivo è comunicare via suoni il raggiungimento/superamento di due soglie min e max da me impostate e dare anche informazione sonora se la variazione % è molto repentina, sia in salita che in discesa (diciamo 0,5% in 5 secondi, per dare un'idea).

    Il tutto leggendo "quotazione" ed "ora della variazione della quotazione" da due celle alimentate da un flusso dde, A2 per le quotazioni ed A 10 per ora minuti secondi

    Le righe sono 20 (max 30), ciascuna riga rappresenta un titolo da monitorare.

    Non nego che mi piacerebbe anche "sentire" il valore raggiunto tramite voce sintetizzata , ma per questo ci penserò in la nel tempo.

    Saluti a tutti.
    bollicine



  • di scossa data: 15/02/2014 12:05:21

    Ciao,

    avevo risposto ieri, ma non vedo il messaggio inserito, me ne scuso e rispondo ora.

    @Mister_x:

    No, non intendevo quello.
    Quando si schedula una routine con il metodo OnTime si DEVE anche provvedere alla sua rimozione altrimenti (essendo un metodo a livello di applicazione) se chiudi il file che l'ha schedulata, ma continui a lavorare con Excel, lui cercherà di rieseguirla.

    Leggi l'help del il metodo Application.OnTime, (parametro Schedule:
    Schedule Facoltativo Variant Se ha valore True, verrà programmata una nuova routine OnTime. Se ha valore False, verrà annullata una routine impostata in precedenza. Il valore predefinito è True.)
    C'è anche un esempio di come usarlo.



  • di scossa data: 15/02/2014 12:07:23

    Dimenticavo:
    inutile ricorrere ad Application.OnTime, visto che si parla di DDE.

    Suggerisco la lettura dell'help relativi ai metodi SetLinkOnData e LinkSources



  • di bollicine (utente non iscritto) data: 17/02/2014 00:53:37

    il flusso dati comunque funziona benissimo, forse è un surrogato DDE,
    attendo miser_x per completare il programma soprattutto per la gestione delle variazioni rapide entro 5/8 secondi.
    ciao a tutti
    bollicine



  • di bollicine (utente non iscritto) data: 18/02/2014 20:29:26

    Mister_X ci sei?
    ciao
    bollicine



  • di bollicine (utente non iscritto) data: 24/03/2014 20:46:36

    Mister_X