返回列表 上一主題 發帖

一段關於開盤價最高價最低價收盤價的vb程式碼請教

一段關於開盤價最高價最低價收盤價的vb程式碼請教

Private Sub Worksheet_Calculate()
        Dim NowDateTime, nowTime, startTime, stopTime
        Dim tr As String

        NowDateTime = Now '現在的時間值, 去掉整數部份,
        nowTime = (NowDateTime - Int(NowDateTime)) '得到現在的時間值
        startTime = Range("A6") '開盤時間, 例如: "09:00:00 AM"
        stopTime = Range("A8")  '收盤時間, 例如: "01:30:00 PM"

        If nowTime <= startTime Then '尚未開盤
                Exit Sub
        ElseIf nowTime > stopTime Then '已經收盤
                Exit Sub
        ElseIf [A2] <> "-" And [A2] <> "###" Then '清盤的狀態, 不取其資料
                tr = Int((nowTime - startTime) * 288) + 2 '每差 300 秒就換一列
                If Range("D" & tr) = "" Then
                        Range("D" & tr) = Range("A2")        '開始價
                End If
                If Range("E" & tr) = "" Or Range("A2") > Range("E" & tr) Then
                        Range("E" & tr) = Range("A2")        '最高價
                End If
                If Range("F" & tr) = "" Or Range("A2") < Range("F" & tr) Then
                        Range("F" & tr) = Range("A2")        '最低價
                End If
                Range("G" & tr) = Range("A2")                '結束價
        End If
End Sub


問題:
1.Private Sub Worksheet_Calculate()
        Dim NowDateTime, nowTime, startTime, stopTime
        Dim tr As String

這一區的意義是?
第一排的dim沒有寫出資料型態是什麼
第二排是定義tr的資料型態為字串

這一區是宣告在這整張工作表都適用的意思嗎

2. ElseIf [A2] <> "-" And [A2] <> "###" Then '清盤的狀態, 不取其資料
這一段裡的"###"是什麼意思呢?~~前面的意思是寫a2不等於空白~~and a2不等於###~~那請問###是什麼意思阿??

3.tr = Int((nowTime - startTime) * 288) + 2 '每差 300 秒就換一列
start=早上9點~~nowtime=現在的時間~~*288+2~~這一串我不大能理解~~還請高手能協助解釋一下嗎?感謝了

問題很基礎~~個人自學幾個月~~很多一知半解~~問題若太笨~~還請見諒

本帖最後由 luhpro 於 2015-5-5 23:26 編輯
Private Sub Worksheet_Calculate()
        Dim NowDateTime, nowTime, startTime, stopTime
        Di ...
laieven 發表於 2015-5-5 16:32
第一排的dim沒有寫出資料型態是什麼

沒有寫出資料型態的 就是 Variant, 適用範圍最廣, 但最耗記憶體空間.

這一區是宣告在這整張工作表都適用的意思嗎

在 Sub 區塊內的變數定義只能適用於該 Sub 區塊,
全域變數一般都是定義在 Module 區塊內且以 Public 保留字作開頭.


這一段裡的"###"是什麼意思呢?~~

這應該是看盤軟體顯示出來帶有特定意義的表示方式,
要看你程式是從哪來的?有沒有說是哪套看盤軟體?

tr = Int((nowTime - startTime) * 288) + 2 '每差 300 秒就換一列
start=早上9點~~nowtime=現在的時間~~*288+2~~這一串我不大能理解~~

若以一個數字來表示時間值,整數部分表示日期,小數部分則表示時間
(24*60*60)/300=288
時   分  秒   
  一      天

TOP

回復 2# luhpro


    先感謝"luhpro"的熱心協助!!!感恩!!

1.288的是每5分鐘的意思這我能理解~~我只是對這串"tr = Int((nowTime - startTime) * 288) +2"
不大懂(這問題似乎有點蠢~不好意思)
int是個取整數的函數

為何用現在的時間去減掉開始的時間~~這不就得到了從開始到現在總共已經走了多少時間對嗎!

那為何*288~~~假設9點開始~~現在是9點5分~~整個式子不就變成int(5*288)+2~~~不大能理解捏????還有那個+2是要幹嘛用呢?


2.設好tr之後~~就把它放到後面
" If Range("D" & tr) = "" Then
                        Range("D" & tr) = Range("A2")  

等等等的式子裡~~~似乎是用計算後的結果來做為儲存格的位置計算用~~讓操作的儲存格
可能是d5或d8或d2不等的位置~~假設計算結果是5這一段是希望這一段時間內整個計算流程只在d5-e5-f5-g5這一列做大小筆記並排序~~對嗎?

TOP

回復 3# laieven
不是的喔.
上面說過 :
若以一個數字來表示時間值,整數部分表示日期,小數部分則表示時間
在原式 tr = Int((nowTime - startTime) * 288) + 2 '每差 300 秒就換一列  中,
tr 會每 300 秒就加 1(也就是 每差 300 秒就換一列 的意思),
癥結就在於 "小數部分則表示時間" 這一點,
當時間差的小數部分乘上 288 接著再取整數之後就會出現這樣的結果.
你可以執行以下程式看看結果:
  1. Sub nn()
  2.   Dim tr&
  3.   Dim startTime As Date
  4.   
  5.   startTime = Now
  6.   Do While tr <= 20
  7.     tr = Int((Now - startTime) * 28800) + 2 '每差 3 秒就換一列
  8.     Cells(tr, 1) = tr
  9.   Loop
  10. End Sub
複製代碼
當我們對於程式某些部分有疑慮的時候,
最簡單的方式就是用 F8 (單步模式) Try Try 看,
我最常用的方式是先在 "即時運算" 視窗中用 ? 來確認下一列相關變數會變成甚麼值,
或是下一列想要做甚麼事, (例如若是 Cells 或 Range 則確認要作用的儲存格是哪一個<些>)
再按一次 F8 確認結果是否與我所預期的相同.

TOP

回復 4# luhpro


    感謝熱心回答
我會多嘗試看看
感謝你

TOP

回復 4# luhpro


問題請教
.Private Sub Worksheet_Calculate()
寫在這個計算程序的意思ˋ~~是不是就是代表只要該檔案啟動~~這個工作表就自動啟動計算
而這個程序也該寫在工作表中而不是"thisbook"裏也不是寫在模組嗎~~對嗎?

TOP

回復 6# laieven


   
Sub Worksheet_Calculate()

是工作表物件模組的預設事件程序
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

        靜思自在 : 我們最大的敵人不是別人.可能是自己。
返回列表 上一主題