返回列表 上一主題 發帖

[發問] 不太懂為什麼module1跟thisworkbook的關係

[發問] 不太懂為什麼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

DDE下單系統.zip (35.83 KB)

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

TOP

回復 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 想不透
1536723138110.jpg
2018-9-12 11:32

TOP

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

請附上目前提問的檔案,方便查對。
譬如: if i = 30 then 等語法在哪裡。

TOP

i=1
0秒~29秒, i=i+1, 跳30次, 剛剛好~~
EXCEL參考資料:
http://blog.xuite.net/smile1000mile/blog

TOP

回復 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秒才紀錄
因為他寫僅執行一次,但怎麼覺得好像每秒都在判斷。

TOP

回復 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 判斷。

TOP

回復 6# ddtggg


ELSE 中的參數, 若沒有判斷及存取,
等 i=30 時, 就沒有參數可用, 應不可省略,
再說那些判斷也應不影響檔案的運作吧!
EXCEL參考資料:
http://blog.xuite.net/smile1000mile/blog

TOP

本帖最後由 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

DDEv11.rar (35.67 KB)

原始檔

DDEv21.rar (41.96 KB)

想多一個記錄

TOP

        靜思自在 : 【行善要及時】行善要及時,功德要持續。如燒開水一般,未燒開之前千萬不要停熄火候,否則重來就太費事了。
返回列表 上一主題