Board logo

標題: [發問] 不太懂為什麼module1跟thisworkbook的關係 [打印本頁]

作者: ddtggg    時間: 2018-9-11 11:46     標題: 不太懂為什麼module1跟thisworkbook的關係

從網路上找到的DDE紀錄程式,學習上,不懂為什麼module1跟thisworkbook?都要做相同的變數宣告也都有ExeSelf()的函數?
原本以為在module1上宣告應該就都可以使用才對。
但是實際測試上刪掉其中一個變數宣告或是ExeSelf(),程式就跑不動了發生巨集錯誤。
會想要刪掉其中一個是因為有時候跑一跑原本一分鐘記憶一次卻變成30秒記憶一次。
請指點一下,非常感謝。
Module1
Dim i, j As Single
Dim Min_Bar(1000, 6) As Variant 'Time, O,H,L.C,V
Dim O As Single
Dim H As Single
Dim L As Single
Dim C As Single
Dim V As Single
Dim NP As Single

Sub 關閉DDE自動交易系統()
    On Error Resume Next
    Application.OnTime Now + TimeValue("00:00:02"), "ThisWorkBook.ExeSelf", , False
End Sub
Sub 啟動DDE自動交易系統()
    Dim k As Single
    j = 2
    Application.OnTime TimeValue("08:45:00"), "ExeSelf"
    'Call ExeSelf
End Sub

Private Sub ExeSelf()
    On Error Resume Next
    i = i + 1
    If i = 58 Then
        Sheets(2).Cells(j, 1) = Time
        Sheets(2).Cells(j, 2) = O
        Sheets(2).Cells(j, 3) = H
        Sheets(2).Cells(j, 4) = L
        Sheets(2).Cells(j, 5) = C
        Sheets(2).Cells(j, 6) = V
        j = j + 1
        i = 0: V = 0
        O = Sheets(1).Cells(2, 2)
        V = V + Sheets(1).Cells(2, 4)
        H = O: L = O: C = O
    Else
        '以下判斷迴圈讓投資權重與投資標的物名稱設定,僅執行一次
        C = Sheets(1).Cells(2, 2)
        If C > H Then H = C
        If C < L Then L = C
        V = V + Sheets(1).Cells(2, 4)
'        Sheets(2).Cells(i, 1) = Sheets(1).Cells(2, 2)
    End If
        Application.OnTime Now + TimeValue("00:00:01"), "ThisWorkBook.ExeSelf"
End Sub

ThisWorkbook
Dim i, j As Single
Dim Min_Bar(1000, 6) As Variant 'Time, O,H,L.C,V
Dim O As Single
Dim H As Single
Dim L As Single
Dim C As Single
Dim V As Single
Dim NP As Single
Private Sub Workbook_Open()
    j = 2
    'Call ExeSelf
End Sub
Private Sub ExeSelf()
    On Error Resume Next
    i = i + 1
    If i = 60 Then
        Sheets(2).Cells(j, 1) = Time
        Sheets(2).Cells(j, 2) = O
        Sheets(2).Cells(j, 3) = H
        Sheets(2).Cells(j, 4) = L
        Sheets(2).Cells(j, 5) = C
        Sheets(2).Cells(j, 6) = V
        j = j + 1
        i = 0: V = 0
        O = Sheets(1).Cells(2, 2)
        V = V + Sheets(1).Cells(2, 4)
        H = O: L = O: C = O
    Else
        '以下判斷迴圈讓投資權重與投資標的物名稱設定,僅執行一次
        C = Sheets(1).Cells(2, 2)
        If C > H Then H = C
        If C < L Then L = C
        V = V + Sheets(1).Cells(2, 4)
'        Sheets(2).Cells(i, 1) = Sheets(1).Cells(2, 2)
    End If
        Application.OnTime Now + TimeValue("00:00:01"), "ThisWorkBook.ExeSelf"
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    On Error Resume Next
    'Application.OnTime Now + TimeValue("00:00:10"), "ThisWorkBook.ExeSelf", , False
End Sub

作者: c_c_lai    時間: 2018-9-11 17:45

回復 1# ddtggg
"ThisWorkBook.ExeSelf" 與 "ExeSelf" 實質上是兩個不同的
宣告函式。 一個宣告於 ThisWorkBook 程式區域中;另一個則宣告
於 Module1 模組中。不巧的是兩者都使用同一程式名稱之命名。
如果將它們個別宣告成 A()、以及 B() 時則無此困惑。
此處 "ThisWorkBook.ExeSelf" 是去呼叫 ThisWorkBook 中的
Sub ExeSelf() 函式; 而 ExeSelf 則會去執行 Module1 模組
中的 Sub ExeSelf() 函式, 而非 ThisWorkBook 中的 Sub ExeSelf()。
如此解答瞭解否?
作者: ddtggg    時間: 2018-9-12 11:36

回復 2# c_c_lai
有一點懂。簡單說就是把Modlue1最底下thisworkbook.ExeSelf改成指到ExSelf,就不會繞來繞去了。
....略
End If
        Application.OnTime Now + TimeValue("00:00:01"), "ExeSelf"
End Sub

改完之後對時間有一個疑問orz,就是明明寫是i=1 if i=30 Then紀錄
但時間記錄上都是29秒59秒29秒59秒而不是30 00 30 00 想不透
[attach]29378[/attach]
作者: c_c_lai    時間: 2018-9-12 18:11

回復  c_c_lai
有一點懂。簡單說就是把Modlue1最底下thisworkbook.ExeSelf改成指到ExSelf,就不會繞來繞去 ...
ddtggg 發表於 2018-9-12 11:36

請附上目前提問的檔案,方便查對。
譬如: if i = 30 then 等語法在哪裡。
作者: 准提部林    時間: 2018-9-12 22:26

i=1
0秒~29秒, i=i+1, 跳30次, 剛剛好~~
作者: ddtggg    時間: 2018-9-17 11:09

回復 5# 准提部林


    原來如此,謝謝提點。
    本來以為從08:45:00開始經過的時間0~1秒才算1秒,1~2秒算下一秒這樣。
    原來0秒、1秒、2秒...
  
Private Sub ExeSelf()
    On Error Resume Next
    i = i + 1
    If i = 30 Then
        Sheets(2).Cells(j, 1) = Time
        Sheets(2).Cells(j, 2) = O
        Sheets(2).Cells(j, 3) = H
        Sheets(2).Cells(j, 4) = L
        Sheets(2).Cells(j, 5) = C
        Sheets(2).Cells(j, 6) = V
        j = j + 1
        i = 0: V = 0
        O = Sheets(1).Cells(2, 2)
        V = V + Sheets(1).Cells(2, 4)
        H = O: L = O: C = O
    Else
        '以下判斷迴圈讓投資權重與投資標的物名稱設定,僅執行一次
        C = Sheets(1).Cells(2, 2)
        If C > H Then H = C
        If C < L Then L = C
        V = V + Sheets(1).Cells(2, 4)
'        Sheets(2).Cells(i, 1) = Sheets(1).Cells(2, 2)
    End If
        Application.OnTime Now + TimeValue("00:00:01"), "ThisWorkBook.ExeSelf"
End Sub

另外想再請問i=i+1 If  i=30 Then 紀錄 Else判斷開高低收 End If 下一秒繼續執行
Else判斷的部分是不是執行i=0~第28秒都在判斷  第29秒才紀錄
因為他寫僅執行一次,但怎麼覺得好像每秒都在判斷。
作者: c_c_lai    時間: 2018-9-19 05:54

回復 6# ddtggg
Application.OnTime Now + TimeValue("00:00:01"), "ThisWorkBook.ExeSelf"
每秒 (Now + TimeValue("00:00:01")) 都會啟動執行 "ThisWorkBook.ExeSelf"
內之 If i = 30 Then ~  Else ~ End If 判斷。
作者: 准提部林    時間: 2018-9-19 10:16

回復 6# ddtggg


ELSE 中的參數, 若沒有判斷及存取,
等 i=30 時, 就沒有參數可用, 應不可省略,
再說那些判斷也應不影響檔案的運作吧!
作者: ddtggg    時間: 2018-9-24 18:40

本帖最後由 ddtggg 於 2018-9-24 18:43 編輯

回復 8# 准提部林

Private Sub ExeSelf()
    On Error Resume Next
    i = i + 1
    If i = 58 Then
        Sheets(2).Cells(j, 1) = Time
        Sheets(2).Cells(j, 2) = O
        Sheets(2).Cells(j, 3) = H
        Sheets(2).Cells(j, 4) = L
        Sheets(2).Cells(j, 5) = C
        Sheets(2).Cells(j, 6) = V
        j = j + 1
        i = 0: V = 0
        O = Sheets(1).Cells(2, 2)
        V = V + Sheets(1).Cells(2, 4)
        H = O: L = O: C = O
    Else
        '以下判斷迴圈讓投資權重與投資標的物名稱設定,僅執行一次
        C = Sheets(1).Cells(2, 2)
        If C > H Then H = C
        If C < L Then L = C
        V = V + Sheets(1).Cells(2, 4)
'        Sheets(2).Cells(i, 1) = Sheets(1).Cells(2, 2)
    End If
        Application.OnTime Now + TimeValue("00:00:01"), "ThisWorkBook.ExeSelf"
End Sub

在    On Error Resume Next 加上 If (TimeValue(Now) > Sheets("MinBar").Range("N1").Value) Then Exit Sub
則只有記錄時間。
如果改加在else後面就可以記錄開高收低,實在是不懂為什麼?請指導謝謝。
另外我照抄另一個寫法想多記錄一個開高收低,這個寫法上卻什麼沒發生。請參考DDEv11 v21




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