返回列表 上一主題 發帖

excel VBA calculate 的疑問

excel VBA calculate 的疑問

儲存格A1 會從外部接收資料 (DDE接收開盤價)
例如 台積電開盤價
我設定一個目標 (100元)
如果當天開盤>=100
就會執行送單

我GOOGLE了一下
網路上都是教使用 calculate 和change這兩個指令
因為接收外部資料
所以只能使用calculate

但我試了一下
發現兩個問題
1. 就是我主動改A1(改為101)的值, 並不會主動送單, 而是要從VB裡面按執行才會送出單子.

2. 一旦按了執行, 就會一直送單送個不停, 有沒有辦法設定成A1變動1次, 送單1次呢??
excel VBA 好難喔...

<DDE工作表資料例>
20130516-01.JPG

<工作表事件區.程式碼>
Private Declare Function PlaceOrderVB Lib "TC_Excel_Addin.xll" (ByVal OrderInfo As String) As String
Option Explicit

Private Sub Worksheet_Calculate()
Dim tmpResult As String
Dim OrderInfo_1 As String
If Date Mod 7 - 1 > 5 Then Exit Sub   '今天為〔周六.周日〕非交易日.跳出
If Time < TimeValue("08:00:00") Then Exit Sub   '未到開盤.跳出
If Time > TimeValue("13:45:00") Then Exit Sub   '已過收盤.跳出
If [D5] = "已送單" And [D6] = Date Then Exit Sub   '今天已有送單記錄.跳出
If IsError([D4]) Then Exit Sub    'DDE未正確連結,或公式有誤.跳出
If Val([D4]) < 0 Then Exit Sub   '未達目標價.跳出
On Error GoTo 901    '程式執行錯誤時,強制跳至901行,以回復事件觸發,並跳出
'-------------------------------------------
Application.EnableEvents = False
OrderInfo_1 = "" ' 裡面是個資, 下單的設定
tmpResult = PlaceOrderVB(OrderInfo_1)
PlaceOrderVB (OrderInfo_1)
[D5] = "已送單" '送單訊息
[D6] = Date  '送單日期
[D7] = Time  '送單時間
901: Application.EnableEvents = True
End Sub

<備註>
以工作表事件進行DDE動態監視,並不太好掌控,之前有寫過幾個範例,是以〔每秒〕遞迴主程式監視及記錄數據,
可至敝部落格,或網頁搜尋關鍵字〔准提部林 金千里 DDE〕參考相關下載檔(程式碼公開,且有註解),
個人並無操作股票及其它金融商品,也從未使用過DDE,僅憑揣摸寫程式,所以請自行套用,無法做私人的服務。
爾後若有時間.或許也在這論壇建個〔自動記錄DDE〕題分享!

以上純因版主一句〔VBA好難〕,應緣而發! 祝 操作順利

TOP

回復 29# GBKEE


大哥
我覺得應該是DDE的問題, 應該不是程式的問題
因為即使是現在我打開檔案
所有數字都沒有改變的情況之下(公式當然也沒有變)
關掉檔案
EXCEL都會出現==> 檔案已被修改過, 你是否要儲存檔案的msgbox

所以我猜即使都沒有變的情況之下
DDE還是有動作
我猜是一打開檔案
EXCEL就會去抓DDE的資料
所以即使數字沒有變
但是對EXCEL來說
卻是重新抓的
excel VBA 好難喔...

TOP

回復 29# GBKEE

工作表上只有3個儲存格有數字
今日開盤價    昨日收盤價
還有一個儲存格為 今日開盤價-昨日收盤價

所以一開盤之後
數字還有公式就都不會變了....
excel VBA 好難喔...

TOP

回復 28# shy
基本概念:工作表上的公式傳回的數值變動一次,執行Sub Worksheet_Calculate() 一次.
你說工作表上的DDE公式不會有變動: 是公式沒變動,且公式傳回的數值也都不變嗎? (那股市在營業時間中有在交易嗎?)
你說工作表上每個儲存格都只有對應一個DDE公式? 那這工作表上不是有許多儲存格有公式嗎?(不只一個公式對嗎)

17# 的程式碼已修正好,再試一次看看
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 27# GBKEE

Q 但是EXCEL還是一直在執行              ->股市營業中 : 工作表上的DEE公式會有變動對嗎?

工作表上的DDE公式不會有變動, 但是可以確定是EXCEL卻是持續執行.

Q 但之後理論上應該不會再執行送單了      ->工作表上的DEE公式有一個以上對嗎?

工作表上每個儲存格都只有對應一個DDE公式

Q 間隔20秒會是EXCEL的問題嗎?              ->股市營業中,會每秒每分都有交易嗎?

期貨的話, 每秒都會有交易...
excel VBA 好難喔...

TOP

回復 26# shy
基本概念:工作表上的DEE公式變動一次,執行Sub Worksheet_Calculate() 一次.

Q 但是EXCEL還是一直在執行              ->股市營業中 : 工作表上的DEE公式會有變動對嗎?

Q 但之後理論上應該不會再執行送單了      ->工作表上的DEE公式有一個以上對嗎?

Q 間隔20秒會是EXCEL的問題嗎?              ->股市營業中,會每秒每分都有交易嗎?
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 25# shy

可以再請教兩個問題嗎
就是只想一開盤只交易一次
之後不管不管符不符合條件
都不在執行自動下單

原因是這樣的
我在測試DDE送單的速度時
發現一件事情
如果儲存格分別是==> 今日開盤價和昨日收盤價
照道理當開盤開之後就會不動了
但是EXCEL還是一直在執行
例如
今日開盤100, 昨日收盤99 ==> 今開-昨收>=0==>符合條件==>執行送單
但之後理論上應該不會再執行送單了
因為這兩個儲存格的值已經不會再動了
但實際狀況卻是一直送單
我猜這是DDE的問題
所以才想乾脆只執行一開盤的那一次
之後不管符合不符合都不再動作

第二個問題是
我發現送單的時間很規律
都是間隔20秒
照理說
DDE若是每秒都會跳動的話
不是應該只間隔1秒嗎
間隔20秒會是EXCEL的問題嗎
若是我想改成間隔1秒的話
是不是可以在EXCEL上面改呢??
excel VBA 好難喔...

TOP

回復 24# Hsieh

GBKEE & Hsieh 大哥
目前除了一開啟檔案會送單兩次外
(符合條件會自動送單兩次, 不符合條件就沒有動作...)

其他基本上都沒有問題了
程式的運作
DDE報價跳動==>符合條件==> 自動送單
                                    不符合條件==> 就沒有動作

接下來小妹開始以這個為基礎
開始更進一步的寫作....
非常感謝你們..
excel VBA 好難喔...

TOP

回復 20# shy
以上程式碼以邏輯來看,開啟檔案會執行重算沒錯,會觸發Worksheet_Calculate程序
在程序內判斷D4是否符合條件而判斷是否執行送單動作
接下來當DDE收到更新後都會觸發Worksheet_Calculate
但是,若D4結果不符合條件也不該有送單動作
而且每次送單後都應該會出現對話方塊才對
實在看不出哪個環節出錯?
學海無涯_不恥下問

TOP

        靜思自在 : 為自己找藉口的人永遠不會進步。
返回列表 上一主題