Board logo

標題: [發問] 如何讓計時器馬上中斷跳出?? [打印本頁]

作者: t8899    時間: 2014-1-18 13:34     標題: 如何讓計時器馬上中斷跳出??

本帖最後由 t8899 於 2014-1-18 13:36 編輯

在執行馬上中斷跳出 (exit sub)
Application.OnTime Now + TimeValue("00:02:00"), "BBB"
Application.OnTime Time + #12:02:00 AM#, "bbb"
作者: wl02353427    時間: 2014-1-18 19:31

[attach]17298[/attach]
作者: GBKEE    時間: 2014-1-18 20:35

本帖最後由 GBKEE 於 2014-1-19 16:13 編輯

回復 2# wl02353427
  1. Option Explicit
  2. Dim Msg As Boolean
  3. Sub startTimer()
  4.     Msg = False
  5.     Application.OnTime Now + TimeValue("00:00:01"), "Increment_count"
  6. End Sub

  7. Sub Increment_count()
  8.     If Msg Then Exit Sub
  9.     hiji = Now()
  10.     Range("A1") = hiji
  11.     'Range("A3").Value = Range("A3")+1 '計數器
  12.     startTimer
  13. End Sub
  14. Sub stopTimer()
  15.     Msg = True
  16.     'Application.OnTime Now + TimeValue("00:00:01"), "Increment_count", schedule:=False
  17.     '連按二次OnTime會有錯誤
  18. End Sub
複製代碼

作者: t8899    時間: 2014-1-18 21:16

回復 2# wl02353427
ONTIME 方法失敗??[attach]17300[/attach]
Application.OnTime Time + #12:00:10 AM#, "timestock", schedule:=False
作者: wl02353427    時間: 2014-1-18 23:27

回復 3# GBKEE

感謝GBKEE前輩的更正,前輩的方法還真的是簡潔有力,小弟還真是沒按過兩次....真是不清楚,也沒有想到if的這個用法,真是受益良多。
作者: t8899    時間: 2014-1-19 10:06

回復  wl02353427
GBKEE 發表於 2014-1-18 20:35


Dim my As Date
    If Sheet6.Range("V14").Value = 1 Then my = #12:01:00 AM#
    If Sheet6.Range("V14").Value = 2 Then my = #12:02:00 AM#
   

Application.OnTime Time + my, "timestock"


終止為何錯誤??(型態不符合)
Application.OnTime EarliestTime:=TimeValue(my), _
Procedure:="timestock", Schedule:=False
作者: GBKEE    時間: 2014-1-19 15:20

本帖最後由 GBKEE 於 2014-1-19 15:36 編輯

回復 6# t8899
OnTime 方法 VBA的說明範例
  1. 本範例設定 15 秒後執行 my_Procedure 程序,從現在開始計時。
  2. Application.OnTime Now + TimeValue("00:00:15"), "my_Procedure"               
  3. 本範例設定 my_Procedure 在下午 5 點開始執行。
  4. Application.OnTime TimeValue("17:00:00"), "my_Procedure"               
  5. 本範例取消前一個範例對 OnTime 的設定。
  6. Application.OnTime EarliestTime:=TimeValue("17:00:00"), _
  7.     Procedure:="my_Procedure", Schedule:=False
複製代碼
Module2
  1. Option Explicit
  2. Public The_Time As Date
  3. Public Ie As Object
  4. Sub W1232222()
  5.     Set Ie = CreateObject("InternetExplorer.Application")
  6.     Ie.Navigate "http://newmis.twse.com.tw/stock/group.jsp?ex=tse&ind=TIDX#STATISTICS"
  7.     Do While Ie.Busy Or Ie.ReadyState <> 4: DoEvents: Loop
  8.     timestock
  9. End Sub
  10. Sub timestock()
  11.     Dim i As Integer, S As Integer, K As Integer, j As Integer, Element
  12.     If Sheets("sheet2").Range("A1") = 1 Then
  13.         Ie.Quit
  14.         Set Ie = Nothing
  15.         Sheets("sheet2").Range("A1") = 2
  16.         MsgBox "跳離IEOK"
  17.         Exit Sub
  18.     End If
  19.     The_Time = Time + #12:00:10 AM#             'OnTime的時間
  20.     Application.OnTime The_Time, "timestock"
  21.     Application.ScreenUpdating = False
  22.     Do While Ie.Busy Or Ie.ReadyState <> 4: DoEvents: Loop
  23.     Set Element = Ie.document.getelementsbytagname("table")
  24.     With Sheets("sheet2")
  25.         .Range("C1:C4").ClearContents
  26.         For S = 2 To 2                    '已找出網頁的table內容在 0-3 中
  27.             For i = 0 To Element(S).Rows.Length - 1
  28.                 K = K + 1
  29.                 j = 2
  30.                 .Cells(K, j + 1) = Element(S).Rows(i).Cells(j).innerText
  31.             Next
  32.         Next
  33.     End With
  34. End Sub
複製代碼
Sheet2
  1. Private Sub CommandButton1_Click()
  2.     If Not Ie Is Nothing Then
  3.         Application.OnTime The_Time, "timestock", schedule:=False
  4.         Ie.Quit
  5.         Set Ie = Nothing
  6.     End If
  7. End Sub
  8. Private Sub CommandButton2_Click()
  9.     W1232222
  10. End Sub
複製代碼

作者: t8899    時間: 2014-1-19 15:37

回復  t8899
OnTime 方法 VBA的說明範例Module2Sheet2
GBKEE 發表於 2014-1-19 15:20

研究已超過2小時,還抓不出錯誤!
請指導,謝謝! [attach]17311[/attach]
作者: GBKEE    時間: 2014-1-19 16:07

回復 8# t8899
  1. Option Explicit  '強迫程式宣告使用的變數,可以找出沒有宣告的變數,易於程式碼的偵錯
  2. Dim tome As Date '在模組端Dim 是這模組的私有變數,這模組的程式都可以引用到的
  3. Sub timestock()
  4.     'Dim tome As Date      '在程式內的 Dim 是這程式的私有變數,這程式所有Dim的變數內容,在程式執行完畢後,會被釋放掉,其他程式引用不到的
  5.     tome = TimeValue(Now) + TimeValue("00:00:05")
  6.     Application.OnTime tome, "sheet2.timestock"
  7.     MsgBoxTest 0, "test ", "提示訊息", vbInformation, 0, 1500
  8. End Sub
  9. Private Sub CommandButton1_Click()
  10.     If tome > 0 Then
  11.         Application.OnTime EarliestTime:=TimeValue(tome), _
  12.             Procedure:="sheet2.timestock", Schedule:=False
  13.             tome = 0
  14.     End If
  15. End Sub
  16. Private Sub CommandButton2_Click()
  17.     timestock
  18. End Sub
複製代碼

作者: t8899    時間: 2014-1-19 18:17

本帖最後由 t8899 於 2014-1-19 18:18 編輯
回復  t8899
GBKEE 發表於 2014-1-19 16:07 [img]http://forum.twbts.com/images/common/back.gif
程式所有Dim的變數內容,在程式執行完畢後,會被釋放掉,其他程式引用不到的
[/img]

我懂了,程式執行完變數就被釋放掉,尤於要再等5秒才會再執行, 這中間 執行 Schedule:=False 找不到變數....
類似這種等待時間再重覆執行的程序,最好用 public 宣告讓變數不要被釋放




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)