最新消息

[公告2014/05/30] 如有需要將部落格中,任何一篇文章的程式碼使用在商業用途,請與我聯繫。

[公告2015/04/26] Line版的 iInfo程式與投資應用 群組已上線想加入的朋友們,請先查看 "入群須知" 再與我聯繫 Line : aminwhite5168,加入請告知身分與回答 "入群須知" 的問題。

[公告2018/04/22] 台北 Python + Excel VBA 金融資訊爬蟲課程,課程如網頁內容 金融資訊爬蟲班:台北班 Python 金融資訊爬蟲、EXCEL VBA 金融資訊爬蟲

[公告2019/01/08] 請注意:我再次重申,部落格文章的程式碼,是要提供各位參考與學習,一旦網頁改版請自行修改,別要求東要求西要我主動修改,你們用我寫東西賺錢了、交差了,請問有分我一杯羹嗎?既然賺錢沒分我,請問有什麼理由要求我修改,如果沒能力改,就花錢來找我上課。

[公告2019/12/01] 若各位有 Excel VBA 案子開發需求,歡迎與我聯繫,可接案處理。

[公告2020/05/22] 頁面載入速度慢,起因為部分JS來源(alexgorbatchev.com)失效導致頁面載入變慢,目前已做調整,請多見諒。

2016年11月19日 星期六

Excel VBA 使用DDE函數抓取看盤軟體DDE數值

這幾天有個想法,就是在含有DDE的檔案上,在開啟檔案時則選擇不更新連結DDE,那後續又要讓Excel與DDE進行連結,有沒有什麼方法可以做到呢?答案是有,可藉由DDEInitiate、DDERequest、DDETerminate等函數就可以完成,以下就簡單說明相關內容。
開啟含有DDE檔案,會彈出一對話框,確認檔案是否做DDE更新連結,在按下不要更新後,Excel 就不會對DDE進行連結,但如果在檔案編輯完成後,需要再重新更新連結DDE,在不重新開啟檔案讓Excel自動做更新連結下,可以透過Excel VBA的函數來完成。

以凱基的HTS看盤軟體為例,讀著可以依照自己使用的看盤軟體為主,開啟凱基超級大三元DDE的內容。

選擇DDE項目。

傳送至Excel。

DDE格式:ServerName|Topic!Item
開盤價:"=TS|KS!TXFL6.130"
最高價:"=TS|KS!TXFL6.131"
最低價:"=TS|KS!TXFL6.132"
成交價:"=TS|KS!TXFL6.124"
接著將上述4個項目用Excel VBA來寫以下程式。
Sub DDE更新連結()
    Const c_strItem As String = "130, 131, 132, 124" '開盤價、最高價、最低價、收盤價
    Dim astrItem() As String
    Dim channel As Long
    Dim i As Integer, j As Integer
    Dim returnList
    
    '建立DDE連結通道,以超級大三元為例
    'DDEInitiate(AppName, Topic)
    channel = Application.DDEInitiate("TS", "KS") '超級大三元的AppName:TS、Topic:KS
    
    '確認通道建立
    If channel <> 0 Then
        '分割字串項目
        astrItem = Split(c_strItem, ", ")
        For i = LBound(astrItem) To UBound(astrItem)
            '指定欲查詢的項目
            'DDERequest(channel, item)
            returnList = Application.DDERequest(channel, "TXFL6." & astrItem(i))
        
            '取得該項目的資料內容
            For j = LBound(returnList) To UBound(returnList)
                Worksheets(1).Cells(1, i + 1).Formula = returnList(j)
            Next
        Next
    End If
    
    '關閉DDE連結通道
    Application.DDETerminate channel
End Sub
上面程式碼只是簡單的內容,後續可以延伸出很多應用的功能。

程式執行結果:

PS:此方法目前尚無法證明DDE是否會持續更新,需要即時接收變化,請讀者自行加入時間計時。

參考資料: