2015-04-23 4 views
5

Per favore, cerca di elaborare il più sinteticamente possibile:Il mio semplice MsgBox VBA blocca l'intero foglio di calcolo a meno che non clicchi su "ok"?

Ho un foglio di calcolo di base per il trading che prende prezzi in tempo reale e se il prezzo supera il mio prezzo di entrata obiettivo una cella, ad esempio AB4, mostra il testo " ACQUISTARE". Se possiedo il titolo e il prezzo scende sotto il mio obiettivo, la stessa cella mostra "VENDITA". In entrambi i casi, il foglio di calcolo invierà automaticamente un ordine per eseguire la transazione.

Tutto quello che desideravo era un messaggio msg per ricordarmi di prendere appunti ogni volta che viene visualizzato un segnale. Ho solo bisogno di un promemoria, ma ne ho bisogno, come ho sempre dimenticato.

Dopo aver letto molti post passato qui, questo è stato il mio primo tentativo:

Private Sub worksheet_calculate() 
If Range("AB4").value = "BUY" Or Range("AB4").value = "SELL" Then 
    MsgBox ("Record Catalyst") 
End If 
End Sub 

sembrava funzionare ma non appena ho cliccato "OK" il msgbox avrebbe immediatamente riapparire. Fintanto che il testo "ACQUISTA" o "Vendi" mostrava il messaggio msgbox non andava via, non importa il numero di volte in cui l'ho fatto clic.

Così ho cercato di nuovo e hanno trovato un modo per rendere il msgbox appaiono solo una volta:

Private Sub worksheet_calculate() 
If ActiveSheet.Range("BV4").Text = "Triggered" Then Exit Sub 
    If Range("AB4").value = "BUY" Or Range("AB4").value = "SELL" Then 
    MsgBox ("Record Catalyst") 
ActiveSheet.Range("BV4") = "Triggered" 
End If 
End Sub 

sembrava funzionare un fascino a meno che io non fare clic sul "ok" per rendere il msgbox scomparire tutta la mia foglio di calcolo cessa di fare qualsiasi cosa (cioè i prezzi non si aggiornano più, i calcoli non vengono più eseguiti ecc.)! Sembra solo aspettare che clicchi prima su "ok". Questo è un grosso problema perché se non sono in giro quando viene visualizzato un messaggio msg e il foglio di calcolo viene fermato, il prezzo per un altro stock nel mio portafoglio raggiunge il suo obiettivo, il foglio di calcolo non saprebbe nemmeno di farlo sparire automaticamente.

Perché questa semplice procedura interrompe il funzionamento del foglio di calcolo e come posso risolvere il mio problema "semplice" msgbox? Non voglio seguire il percorso di formattazione condizionale sul foglio di calcolo poiché è già ingombrato da troppe celle condizionate in modo condizionale.

Grazie guru!

+8

MsgBox è modale: richiede all'utente di eseguire un'azione prima di procedere. Piuttosto che usare un MsgBox, puoi creare un semplice UserForm che può essere chiamato come Modeless (e non interrompere il tuo foglio di calcolo). O utilizzare lo StatusBar. – brettdj

+0

Perché hai bisogno di MsgBox in primo luogo? Perché non lo rimuovi, quindi aggiungi un tracker sul numero di volte in cui il tuo codice viene eseguito (se in qualche modo hai bisogno di rintracciarlo o qualcosa del genere). – L42

+0

Oh capisco ..... non sapevo che fosse "modale". Ok, lasciami guardare in UserForms e vedere come potrebbero aiutare. Grazie per il puntatore! – Untitled

risposta

5

Sembra che il problema principale sia che MsgBox non scade e scompare in quanto il messaggio è solo informativo.

Con il codice sottostante il messaggio Promped scade tra 2 secondi e consente al sottotitolo di terminare.

Private Sub worksheet_calculate() 
    If ActiveSheet.Range("BV4").Text = "Triggered" Then Exit Sub 
     If Range("AB4").Value = "BUY" Or Range("AB4").Value = "SELL" Then 

      Set objShell = CreateObject("Wscript.Shell") 

      intReturn = objShell.Popup("Record Catalyst", _ 
       2, , wshOk) 

      If intReturn = 1 Then 
       'do something if you click ok 
      ElseIf intReturn = -1 Then 
       'do something if times out alone, like record in a diff sheet 
      End If 

      ActiveSheet.Range("BV4") = "Triggered" 

      Set objShell = Nothing 

    End If 
End Sub 

Spero che questo risolva il problema.

+0

Wow, è pulito. Solo 2 domande però. Il foglio di calcolo smetterebbe di funzionare durante quei 2 secondi e se mi allontano dal mio pc per più di 2 secondi vuol dire che potrei perdere qualche messaggio? – Untitled

+0

@Uniginale Sì e sì, se desideri accorciare il timer nel codice cambia semplicemente il "2" nella variabile intReturn. Per i messaggi mancati suggerirei di creare un nuovo foglio chiamato register_logs e registrare ogni modifica per "far scattare" il codice e l'ora. Se hai bisogno di assistenza con il codice di registrazione, posso darti un aiuto. –

1

Se il servizio di messaggistica di Windows è in esecuzione (è stato configurato per impostazione predefinita su tutti i computer su cui l'ho mai provato) è possibile utilizzare la funzione Shell su Msg. Questo è simile al metodo di @ Miguel_Ryu con l'eccezione che Shell verrà eseguita in modo asincrono - completamente non bloccante. Nell'esempio riportato di seguito viene illustrato (ovviamente si vorrà sostituire 'Comintern' con il proprio nome utente di Windows):

Sub NonBlockingMessage() 

    Dim i As Integer 

    Shell "msg Comintern Look at me, I'm non-blocking!", vbHide 

    For i = 1 To 10000 
     Debug.Print i 
    Next i 

End Sub 

Vedrete il messaggio pop-up e poi vedere il rotolo di numeri come il ciclo viene eseguito. Questo ha anche il vantaggio che il messaggio non è limitato al runtime del tuo codice. Rimarrà lì fino a quando non verrà eliminato, a prescindere dal completamento del codice nel frattempo, a meno che non gli venga concesso un timeout con il parametro /time:.

Ancora meglio, i messaggi si impilano.Se esegui il codice di prova sopra due volte senza chiudere il primo messaggio, continuerai comunque con entrambi.

+0

In nessun modo! Questa sarebbe una soluzione incredibilmente intelligente. Ottima idea Comintern, grazie! – Untitled