You are on page 1of 5

 以 VBA 寫出資料到外部關聯式資料庫中

在本書第四章第二節的程式交易應用中,交易策略回測之程式,與外部資
料庫的互動是單向的,也就是說,僅從資料庫中取得資料,而不需反向改變外
部資料庫。
但由於每日均有交易紀錄,因此也必須知道如何以程式碼寫出資料到外部
關聯式資料庫中,以期增加、刪除、修改資料庫的紀錄。
以下舉例說明以 VBA 將資料寫入資料庫的方式。

[範例 3.30:以 VBA 配合 SQL 語法寫出資料至關聯式資料庫]


此範例的情境為在交易日(20040503)下午收盤後,透過資料庫轉出當日水泥
股之調整後「開盤價」 、
「最高價」、「最低價」、
「收盤價」與「成金金 額(千元)」,如圖
3.5.76 之文字 所示。
取得個股盤後資料的方式包括:

1. 透過資料庫廠商連結更新,再將當日盤後資料轉出。此部分的操作已如前述,
說明如何以時報資訊的情報贏家系統,轉出資料庫至外部文字檔中;讀者若
在金融機構服務,MIS 部門應可提供此服務,若是在學校的師生,則可透過
學校購買的資料庫取得。
2. 可外購金融資訊軟體公司的動態資料源。其以動態資料連結(DDE)的方式,
匯入資料到 Excel 中(在拙著「財務金融資訊化教學工具與設計」一書中即介紹
有寶碩公司所提供的即時資料源),再由 Excel 轉出文字檔。
3. 透過證券經紀商提供的免費操盤軟體轉檔。讀者若有買賣股票,必然會透過
券商買賣,而目前券商的標準服務,包括提供免費操盤軟體。
4. 自行透過 Excel 從券商網站或有提供即時報價的入口網站收集。在本書第四
章第二節中,有介紹如何取得即時資料的方法,在盤後所收集到的即為當日
開高收低量等資料。

圖 3.5.76 更新文字檔內容
接下來,我們可撰寫一簡單系統,將此文字檔中的最新資料,逐一轉檔至原
來的資料庫(StockTrans.mdb)之 1101D 資料表中。
系統介面設計如圖 3.5.77 所示。

圖 3.5.77 寫出資料庫系統執行視窗

在圖 3.5.77 中按下「執行更新」之按鍵,可執行如表 3.5.14 之程式碼。

表 3.5.14 資料庫更新說明範例(ADO_Test2.xlsm)
行號 程式碼
1 Private Sub CommandButton1_Click()

2 Dim Test_Dir As String


3 '取得查詢參數
4 Dim Stock_I, Update_D, Other_Data As String
5 Dim Up_D(6) As String
6 Stock_I = TextBox1.Text
7 Update_D = TextBox2.Text
8 '設定更新檔案與資料庫路徑位置
9 Test_Dir = ThisWorkbook.Path & "\"
10 'Read update data from txt file
11 Open Test_Dir & Update_D & ".txt" For Input As #1
12 While Not EOF(1)
13 Input #1, Up_D(1)
14 If Up_D(1) = Stock_I Then
15 Input #1, Up_D(2), Up_D(3), Up_D(4), Up_D(5), Up_D(6)
16 Else
17 Line Input #1, Other_Data
18 End If
19 Wend
20 Close #1
21 '連線資料庫
22 Dim Con_Test As ADODB.Connection
23 Set Con_Test = New ADODB.Connection
24 Con_Test.Open "Provider = Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & Test_Dir &
"StockTrans.mdb"
25 '資料庫讀取
26 Dim RS_Test As ADODB.Recordset
27 Set RS_Test = New ADODB.Recordset
28 RS_Test.Open "SELECT * FROM " & Stock_I & "D", Con_Test, adOpenStatic,
adLockOptimistic
29 RS_Test.AddNew
30 RS_Test!Date = Update_D
31 RS_Test!Open = Up_D(2)
32 RS_Test!High = Up_D(3)
33 RS_Test!Low = Up_D(4)
34 RS_Test!Close = Up_D(5)
35 RS_Test!Volume = Up_D(6)
36 RS_Test.Update
37 '資料庫連線釋放
38 RS_Test.Close
39 Set RS_Test = Nothing
40 Con_Test.Close
41 Set Con_Test = Nothing
End Sub

表 3.5.14 中的程式碼與前一版本不同之處,說明如下:

1. 行(4)宣告變數,其中 Stock_I 用以儲存欲更新的股票代號,Update_D 用以儲


存欲更新的日期,Other_Data 用以儲存不需要的字串資料(後述)。
2. 行(5)宣告字串陣列,用以儲存讀入的指定選取更新日期(Update_D)之股票
(Stock_I)之編號、開盤價、最高價、最低價、收盤價、成交金額等資料(即圖
3.5.76 中的列資料)。
3. 行(6)由介面讀取欲更新的股票編號;行(7)由介面讀取欲更新的指定日期。
4. 行(11)打開欲更新資料的文字檔,此例中,欲更新 20040503 該日的資料,因
此打開名為「20040503.txt」的文字 (此文字檔應置於與 Excel 程式檔同一目
錄中)。
5. 行(12)到行(19)中的程式碼用以讀入更新檔案中指定股票 (Stock_I)的資料(即
圖 3.5.76 中,第二列 1101 股票的相關資料)。由於「20040503.txt」文字檔,包
含多檔股票當日(20040503)的交易資料,因此由行(13)先讀入第一欄資料(即
股票編號欄),在行(14)中判斷,若屬於要更新的股票(=Stock_I),則於行(15)
依序將該股票開高收低量等資料一一讀入,否則,於行(17)將該列其他資料
存入 Other_Data 變數中,形同丟棄。
6. 行(20)關閉開啟的更新資料文字檔。
7. 行(28)使用 SQL 語法開啟指定名稱(存於 Stock_I 變數中)資料表(即 1101D 資
料表);並設定 CursorType 為「adOpenStatic」常數,此為靜態 Cursor,可啟動
移動紀錄之功能(即可用 MoveNext、MovePrevious、MoveFirst、MoveLast,分
別移動紀錄到下一筆、上一筆、最前面一筆與最後面一筆);並設定 LockType
為「adLockOptimistic」常數,此常數可用於當更新資料時,鎖定紀錄;
Con_Test 為指定的連線。關於 CursorType 與 LockType 尚有其他指定常數,讀
者可以不管他,先以目前的設定即可。
8. 行(29)增加一筆新的空白紀錄。
9. 行(30)到行(35)以儲存於 Update_D 與 Up_D 陣列中的資料存入該空白紀錄之
指定欄位中。
10. 行(36)作資料更新,唯有如此,資料才真正被寫入紀錄中。

更新完後的 1101D 資料表如圖 3.5.78 所示。


讀者可以自行嘗試一次更新多檔股票與多日資料(因為有可能事情一忙或其
他原因,隔了幾天才要更新資料)。

圖 3.5.78 在資料庫中已經增添了一筆紀錄

最後,在以上程式中,使用到 SQL 語法,以下針對 SQL 語法作一簡單介紹。

You might also like