我們使用3個例子分別抓網路資料的檔案來做說明,並使用Excel 2010版本來進行。
1. 抓證交所三大法人每日買賣金額統計表。
Sub 證交所三大法人買賣金額統計表() With ActiveSheet.QueryTables.Add(Connection:= _ "URL;http://www.twse.com.tw/ch/trading/fund/BFI82U/BFI82U.php", Destination:= _ Range("$A$1")) .Name = "BFI82U" .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .BackgroundQuery = True .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .WebSelectionType = xlSpecifiedTables .WebFormatting = xlWebFormattingNone .WebTables = "10" .WebPreFormattedTextToColumns = True .WebConsecutiveDelimitersAsOne = True .WebSingleBlockTextImport = False .WebDisableDateRecognition = False .WebDisableRedirections = False .Refresh BackgroundQuery:=False End With End Sub2. 抓期交所三大法人每日買賣期貨交易口數。
Sub 期交所三大法人每日期貨交易() With ActiveSheet.QueryTables.Add(Connection:= _ "URL;http://www.taifex.com.tw/chinese/3/7_12_3_tbl.asp", Destination:=Range( _ "$A$1")) .Name = "7_12_3_tbl" .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .BackgroundQuery = True .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .WebSelectionType = xlEntirePage .WebFormatting = xlWebFormattingNone .WebPreFormattedTextToColumns = True .WebConsecutiveDelimitersAsOne = True .WebSingleBlockTextImport = False .WebDisableDateRecognition = False .WebDisableRedirections = False .Refresh BackgroundQuery:=False End With End Sub3. 抓Yahoo股市裡的 2330台積電 股價。
Sub Yahoo股價資訊() With ActiveSheet.QueryTables.Add(Connection:= _ "URL;https://tw.stock.yahoo.com/q/q?s=2330", Destination:=Range("$A$1")) .Name = "q?s=2330" .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .BackgroundQuery = True .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .WebSelectionType = xlSpecifiedTables .WebFormatting = xlWebFormattingNone .WebTables = "7" .WebPreFormattedTextToColumns = True .WebConsecutiveDelimitersAsOne = True .WebSingleBlockTextImport = False .WebDisableDateRecognition = False .WebDisableRedirections = False .Refresh BackgroundQuery:=False End With End Sub以上三段程式內容只是主要執行的程式架構,但還有2個部分的地方要添加程式碼
1.檔案開啟後讓VBA自動執行。
2.執行結束後自動存檔並離開Excel。
以下就針對上述兩部分的程式碼添加做處理:
1.檔案開啟後讓VBA自動執行
分別在每個檔案的Workbook_Open()函數中呼叫執行上述三段程式碼。
(1) 抓證交所三大法人每日買賣金額統計表。
Private Sub Workbook_Open() Call 證交所三大法人買賣金額統計表 End Sub(2) 抓期交所三大法人每日買賣期貨交易口數。
Private Sub Workbook_Open() Call 期交所三大法人每日期貨交易 End Sub(3) 抓Yahoo股市裡的 2330台積電 股價。
Private Sub Workbook_Open() Call Yahoo股價資訊 End Sub
2.執行結束後自動存檔並離開Excel
分別在每個主程式End Sub之前添加以下程式碼。
If MsgBox("資料已抓取,是否要存檔並離開", vbOKCancel) = vbOK Then ActiveWorkbook.Saved = True Application.Quit End If
到了這裡已完成Excel檔案自動化的前置作業,接下來要撰寫同時開啟這3個檔案執行的Batch file。
將以下內容複製貼到RunExcel.bat存檔。
@echo off ::將Excel.exe存在的路徑,設定到環境變數中 set ExcelPath="C:\Program Files\Microsoft Office\Office14\EXCEL.EXE" ::欲平行執行的檔案路徑,請自行修改為自己電腦的路徑 set ExcelFilePath=C:\Users\Amin\Desktop\平行處理\ start "Excel" %ExcelPath% /e %ExcelFilePath%證交所三大法人買賣金額統計表.xlsm start "Excel" %ExcelPath% /e %ExcelFilePath%期交所三大法人每日期貨交易.xlsm start "Excel" %ExcelPath% /e %ExcelFilePath%Yahoo股價資訊.xlsm exit接下來就可以開始跑平行處理的動作了,開啟命令提示字元,輸入以下執行命令來看結果。
start RunExcel.bat
執行結果:
PS:以上有幾點需要請各位額外注意,以免遇到操作上的問題
1.以上範例是使用3個 Excel 去開啟3個不同的Excel檔案,才能順利執行,如果是3個Excel同時去開同一個Excel檔,會造成第2個Excel開啟檔案時,需以唯讀形式來開啟檔案
2. 上述的Batch內容,第4行與第7行,請注意行尾不能有空白出現,不然將會造成Batch file無法正常執行的問題。
3. 若Excel執行時使用相同資源進行運作,Excel的執行會有延遲及輪流執行的現象。
參考資料:
- Excel 2010 允許開多個視窗
- Office 教程:如何在單獨的視窗中打開 Excel 檔?
- 如何開啟EXCEL檔在不同視窗
- Excel:開啟Excel自動開啟額外視窗
- Command-line switches for Excel