抓取上市股票代碼如下
Sub 找尋股票代碼()
Dim i As Integer, n As Integer
Dim stockurl As String
Dim RowStart As Range, RowEnd As Range
stockurl = "http://isin.twse.com.tw/isin/C_public.jsp?strMode=2"
n = 2
If SheetExists("Temp") <> True Then
Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = "Temp" '建立指定工作到現存工作表的對後面
Else
清除工作表 "Temp"
End If
股票代碼 stockurl
With Sheet1
With Sheets("Temp")
Sheet1.Cells(1, 1) = "股票代碼"
Sheet1.Cells(1, 2) = "公司名稱"
n = 2
For i = 2 To .Cells(65535, 1).End(xlUp).Row
If Trim(.Cells(i, 6)) = "ESVUFR" Or _
Trim(.Cells(i, 6)) = "EUOMSR" Or _
Trim(.Cells(i, 6)) = "EMXXXA" Or _
Trim(.Cells(i, 6)) = "ESVUFA" Then
Sheet1.Cells(n, 1) = Split(.Cells(i, 1), " ")(0)
Sheet1.Cells(n, 2) = Split(.Cells(i, 1), " ")(1)
n = n + 1
End If
Next i
End With
End With
End Sub
Sub 儲存股票代碼(SaveDate As String)
Dim TestObj As Object
Dim CSVfile As String, CSVfolder As String
Dim TestFolder As Boolean
Set TestObj = CreateObject("Scripting.FileSystemObject")
CSVfolder = FilePath & SaveDate & "\"
CSVfile = CSVfolder & SaveDate & ".csv"
TestFolder = TestObj.FolderExists(CSVfolder)
If TestFolder = False Then TestObj.CreateFolder (CSVfolder)
On Error Resume Next
Kill CSVfile
On Error GoTo 0
Sheet1.Copy
Application.DisplayAlerts = False
ActiveWorkbook.SaveAs Filename:=CSVfile, FileFormat:=xlCSV
Application.DisplayAlerts = True
ActiveWorkbook.Close 0
End Sub
Sub 股票代碼(StockIDURL As String)
Dim xlSheet As Excel.Worksheet
Set xlSheet = Sheets("Temp")
With xlSheet.QueryTables.Add("URL;" & StockIDURL, xlSheet.Cells(1, 1))
.WebFormatting = xlWebFormattingNone
.WebTables = "2"
.Refresh 0
.Delete
If Err.Number <> 0 Then Err.Clear: MsgBox "資料查詢失敗" '被免資料抓取不成功,而顯示訊息
End With
Set xlSheet = Nothing
End Sub
抓取上市交易明細程式碼如下
Option Explicit
Dim IE As Object, doc As Object, element As Object
Dim strURL As String, table As String, Pagecount As String, stockid As String, stockname As String
Const TempName As String = "Temp"
Public FilePath As String
Public Enum IE_READYSTATE
READYSTATE_COMPLETE = 4
End Enum
Function 網頁開啟完成與否()
網頁開啟完成與否 = False
With IE
'.Visible = True
.Navigate "http://bsr.twse.com.tw/bshtm/bsMenu.aspx"
Do While .Busy Or .ReadyState <> IE_READYSTATE.READYSTATE_COMPLETE
DoEvents
Loop
Do
DoEvents
Loop Until .document.ReadyState = "complete"
End With
網頁開啟完成與否 = True
End Function
Sub 執行(pos As Integer, DownloadDate As String)
Dim i As Integer, j As Integer, n As Integer, id As Integer
Set IE = CreateObject("InternetExplorer.Application")
If Not 網頁開啟完成與否 Then
MsgBox "證交所買賣日報表查詢系統網頁無法開啟", vbExclamation
Exit Sub
End If
Application.ScreenUpdating = False
With Sheet1
n = .Cells(65536, 1).End(xlUp).Row
For id = pos To n
.Range("D2") = id
stockid = .Cells(id, 1)
stockname = .Cells(id, 2)
取得明細
Application.StatusBar = DownloadDate + " " + stockid + " " + stockname + "交易明細共有" + Pagecount + "頁"
If Pagecount <> "" Then
儲存CSV DownloadDate, stockid
If SheetExists("Temp") Then
清除工作表 TempName
End If
End If
Next
If SheetExists("Temp") Then
清除工作表 TempName
End If
.Activate
.Range("D2") = 2
End With
IE.Quit
Application.ScreenUpdating = True
Set IE = Nothing
End Sub
Sub 取得明細()
Dim i As Integer, j As Integer
取得交易明細總頁數
If Pagecount = "" Then Exit Sub
strURL = "http://bsr.twse.com.tw/bshtm/bsContent.aspx?StartNumber=" & stockid & "&FocusIndex=All_" + Pagecount
If Pagecount > 655 Then
MsgBox "股票編號" & stockid & "的總交易頁數超出工作表可以儲存的範圍"
Exit Sub
End If
table = "5"
For i = 0 To Pagecount + 1
For j = 0 To 1
table = table & "," & CStr(7 + 9 * i + j)
Next j
Next i
If SheetExists(TempName) <> True Then
Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = TempName '建立指定工作到現存工作表的對後面
Else
清除工作表 TempName
End If
取得交易明細 strURL, table
刪空特定列
End Sub
Sub 取得交易明細總頁數()
Dim Retry As Integer
Retry = 0
Do
Set doc = IE.document
Loop While doc Is Nothing
Do
Pagecount = ""
Do
Do
Set element = doc.getElementsByName("txtTASKNO")
Loop While element Is Nothing
element.Item(0).Value = stockid
Set element = doc.getElementsByName("txtTASKNO")
Loop While element.Item(0).Value <> stockid
Do
Do
Set element = doc.getElementsByName("btnOK")
Loop While element Is Nothing
element.Item(0).Click
Do
Delay 0.5
Set element = doc.getElementsByName("sp_ListCount")
Loop While element Is Nothing
Retry = Retry + 1
If Retry = 10 Then Exit Sub
Loop While element Is Nothing
Delay 0.5
Pagecount = element.Item(0).innerText
Loop While Pagecount = ""
Set doc = Nothing
Set element = Nothing
End Sub
Sub 取得交易明細1(strURL As String, table As String)
Dim xlSheet As Excel.Worksheet
Set xlSheet = Sheets("Temp")
With xlSheet.QueryTables.Add("URL;" & strURL, xlSheet.Cells(1, 1))
.WebFormatting = xlWebFormattingNone
.WebTables = table
Do
Delay 0.5
On Error Resume Next
.Refresh 0
On Error GoTo 0
Loop While Application.Count(.ResultRange) = 0
.Delete
'If Err.Number <> 0 Then Err.Clear: MsgBox Err.Number '被免資料抓取不成功,而顯示訊息
End With
End Sub
Sub 取得交易明細(strURL As String, table As String)
Dim xlSheet As Excel.Worksheet
Set xlSheet = Sheets("Temp")
Do
Application.DisplayAlerts = False
With xlSheet.QueryTables.Add("URL;" & strURL, xlSheet.Cells(1, 1))
.WebFormatting = xlWebFormattingNone
.WebTables = table
On Error Resume Next
Do
Err.Clear
.Refresh 0
If Err.Number Then
Application.Wait Now + TimeValue("00:00:01")
End If
Loop Until Err.Number = 0
.Delete
'If Err.Number <> 0 Then Err.Clear: MsgBox Err.Number '被免資料抓取不成功,而顯示訊息
On Error GoTo 0
End With
If Err.Number = 0 Then
Application.DisplayAlerts = True
Exit Sub
End If
Loop
End Sub
Sub 刪空特定列()
Dim i As Integer, j As Integer, Record As Integer
Worksheets(TempName).Select
Record = Cells(65536, 1).End(xlUp).Row
j = 0
For i = 6 To Record
Rows(i & ":" & i).Select
If ActiveCell.Value = Empty Or ActiveCell.Value = "序" Then
j = j + 1
Selection.EntireRow.Delete Shift:=xlUp
If Record - j >= i Then
i = i - 1
End If
End If
Next
End Sub
Sub 儲存CSV(SaveDate As String, CSVname As String)
Dim TestObj As Object
Dim CSVfile As String, CSVfolder As String
Dim TestFolder As Boolean
CSVfolder = FilePath & SaveDate & "\"
CSVfile = CSVfolder & CSVname & "_" & SaveDate & ".csv"
Set TestObj = CreateObject("Scripting.FileSystemObject")
TestFolder = TestObj.FolderExists(CSVfolder)
If TestFolder = False Then TestObj.CreateFolder (CSVfolder)
On Error Resume Next
Kill CSVfile
On Error GoTo 0
Worksheets(TempName).Copy
Application.DisplayAlerts = False
With ActiveWorkbook
.SaveAs Filename:=CSVfile, FileFormat:=xlCSV
.Close 0
End With
Application.DisplayAlerts = True
End Sub
Function 清除工作表(xlWSName As String)
Dim qyt As QueryTable
With Worksheets(xlWSName)
For Each qyt In .QueryTables
qyt.Delete
Next
.Cells.Clear
.Cells.ClearContents
End With
End Function
Function SheetExists(strWSName As String) As Boolean
Dim Temp As Worksheet
On Error Resume Next
Set Temp = Worksheets(strWSName)
If Not Temp Is Nothing Then
SheetExists = True
On Error GoTo 0
Exit Function
End If
SheetExists = False
On Error GoTo 0
End Function
Function 刪除工作表(sheetname As String)
Application.DisplayAlerts = False '關閉警告視窗
Worksheets(sheetname).Select
Worksheets(sheetname).Delete '刪除作用中的工作表
Application.DisplayAlerts = True '恢復警告視窗
End Function
Public Sub Delay(DelayTime As Single)
Dim BeginTime As Single
BeginTime = Timer
While Timer < BeginTime + DelayTime
DoEvents
Wend
End Sub

iInfo大大,
回覆刪除VBA抓取上市交易明細的程式碼沒有找到 CommandButtom相關的程式碼. 懇求!能將檔案寄送給我參考嗎! 感恩~~~
hotjoe888@hotmail.com
CommandButton你可自行添加
刪除目前有 "Excel VBA 投資數據存取" 課程,會敎基本的VBA語法
有需要可以參考"Excel VBA 投資數據存取" http://white5168.blogspot.tw/2012/11/excel-vba.html