2015-04-23 6 views
5

proszę pokrywa się ze mną jak próbuję wypracować jak zwięźle jako poss:Moje proste MsgBox VBA zatrzymuje cały arkusz kalkulacyjny, chyba że klikam "ok"?

Mam podstawowe arkusza handlowego, które ma ceny na żywo i jeśli cena przewyższa moją docelową ceny wejścia komórce powiedzieć AB4, pokazuje tekst " KUPOWAĆ". Jeśli posiadam akcje, a cena spadnie poniżej celu, ta sama komórka pokazuje "SPRZEDAJ". Tak czy inaczej, arkusz kalkulacyjny automatycznie wyśle ​​także polecenie wykonania transakcji.

Wszystko, czego chciałem, to msgbox, aby przypomnieć mi o robieniu notatek za każdym razem, gdy pojawi się sygnał. Potrzebuję tylko jednego przypomnienia, ale potrzebuję go, ponieważ zawsze zapominam.

Po przeczytaniu wielu wcześniejszych postów tutaj, to była moja pierwsza próba:

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

wydawało się do pracy, ale jak tylko kliknął „OK” MsgBox będzie natychmiast ponownie. Dopóki tekst "KUPUJ" lub "sprzedawaj" pokazywał, że msgbox nie zniknie bez względu na to, ile razy go kliknąłem.

Więc znowu szukał i znalazł sposób, aby sprawić, że msgbox pojawiają się tylko raz:

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 

wydawało się działać zaklęcie wyjątkiem sytuacji, gdy nie kliknąć przycisk „OK”, aby sprawić, że znika cała moja MsgBox arkusz kalkulacyjny przestaje cokolwiek robić (tj. ceny nie są już aktualizowane, obliczenia już nie działają itd.)! Wydaje się, że najpierw czekam na kliknięcie "ok". Jest to poważny problem, ponieważ jeśli nie będę w pobliżu, gdy pojawi się msgbox, a arkusz kalkulacyjny zostanie zatrzymany, to wtedy cena za kolejne akcje w moim portfolio osiągnie cel, arkusz kalkulacyjny nawet nie będzie wiedział, nie mówiąc już o automatycznym wykonaniu polecenia.

Dlaczego ta prosta procedura zatrzymuje działanie arkusza kalkulacyjnego i jak mogę rozwiązać mój pierwotny "prosty" problem z msgbox? Nie chcę przechodzić warunkowej trasy formatowania w arkuszu kalkulacyjnym, ponieważ jest już zapełniona zbyt wieloma warunkowo sformatowanymi komórkami.

Dziękuję, guru!

+8

MsgBox jest modalny - wymaga od użytkownika wykonania czynności przed kontynuowaniem. Zamiast używać MsgBox możesz stworzyć prosty UserForm, który można nazwać Modeless (i nie przerywać swojego arkusza kalkulacyjnego). Lub użyj paska stanu. – brettdj

+0

Dlaczego potrzebujesz MsgBox na pierwszym miejscu? Dlaczego po prostu go nie usuniesz, po prostu dodaj tracker, ile razy twój kod działa (jeśli w jakiś sposób musisz go śledzić lub coś takiego). – L42

+0

Och, widzę ..... Nie wiedziałem, że to "modalne". Ok, pozwól mi zajrzeć do UserForms i zobaczyć, jak mogą pomóc. Dzięki za wskazówkę! – Untitled

Odpowiedz

5

Wydaje się, że głównym problemem jest to, że MsgBox nie wyczerpie się i zniknie, ponieważ wiadomość ma jedynie charakter informacyjny.

Za pomocą poniższego kodu komunikat Promped wygaśnie w ciągu 2 sekund i umożliwi zakończenie sub.

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 

Mam nadzieję, że to rozwiąże problem.

+0

Wow, to jest miłe. Tylko 2 pytania. Czy arkusz kalkulacyjny nadal przestałby działać w ciągu tych 2 sekund i jeśli odsuwałbym się od mojego komputera na więcej niż 2 sekundy, oznacza to, że mógłbym pominąć jakieś wiadomości? – Untitled

+0

@ Nie ma tytułu Tak i tak, jeśli chcesz skrócić czas w kodzie, zmień "2" w zmiennej intreurn. W przypadku nieodebranych komunikatów sugeruję utworzenie nowego arkusza o nazwie recorded_logs i zapisanie każdej zmiany do "wyzwolenia" kodu i czasu. Jeśli potrzebujesz pomocy z kodem do nagrywania, mogę Ci pomóc. –

1

Jeśli usługa komunikatora Windows jest uruchomiona (domyślnie na każdej maszynie, na której kiedykolwiek to wypróbowałem), możesz samodzielnie użyć funkcji Shell do Msg. Jest to podobne do metody @ Miguel_Ryu z tym wyjątkiem, że Shell będzie działał asynchronicznie - jest całkowicie niezablokowany. Poniższy przykład demonstruje (oczywiście będziemy chcieli zastąpić „Komintern” z nazwą użytkownika systemu 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 

Zobaczysz komunikat wyskakujący, a następnie zobaczyć zwój liczb jako pętla wykonuje. Ma to tę zaletę, że wiadomość nie ogranicza się do środowiska wykonawczego kodu. Zostanie tam do czasu zwolnienia, bez względu na to, czy twój kod zakończy się w międzyczasie, chyba że dasz mu czas z parametrem /time:.

Jeszcze lepiej, wiadomości będą się układać w stosy.Jeśli dwukrotnie uruchomisz kod testowy bez odrzucania pierwszej wiadomości, otrzymasz oba.

+0

Nie ma mowy! To byłoby niesamowicie sprytne rozwiązanie. Świetny pomysł Komintern, dzięki! – Untitled

Powiązane problemy