Board logo

標題: [發問] 集保戶股權分散表查詢 抓每週資料 [打印本頁]

作者: espionage    時間: 2015-9-12 22:41     標題: 集保戶股權分散表查詢 抓每週資料

各位高手你們好 小弟在爬完很多頁面
也google 看了幾個高手的語法,想要嘗試用 VBA 去 集保戶股權分散表查詢 ,輸入一個代號,抓每週的股票股權分散表資料table,抓到Excel去分析
網址:http://www.tdcc.com.tw/smWeb/QryStock.jsp

但只會寫到怎麼把股票代號輸入,但是日期的選單實在不知要怎麼操作,網頁 "資料日期" select 找不到  .value,就停在這邊想好幾天,還是不知怎麼寫下去了
還請高手指教語法
感恩

==========================================
Sub 集保抓取()

Dim A
With CreateObject("InternetExplorer.Application")
.Visible = True
.Navigate "http://www.tdcc.com.tw/smWeb/QryStock.jsp"
Do While .Busy Or .ReadyState <> 4: DoEvents: Loop

With .document
'-----輸入要查詢的股票代碼
   For Each A In .getelementsbytagname("INPUT") '找原始碼有input參數
   If A.Name = "StockNo" Then A.Value = Range("B1").Value '找原始碼有input參數
   Next
   
End With

End With
End Sub
==========================================
作者: espionage    時間: 2015-9-13 15:29

各位高手
我補充一下問題,路徑是下面這個圖片頁面,只有2個欄位輸入資料,然後點擊查詢按鈕,會跑出一個table,把資料複製到Excel
1. 資料日期 (紅框的地方) 目前卡住,不知道該如何用VBA操作
2. 證券代號
不知是否有高手可以協助指教,謝謝
[attach]21964[/attach]
作者: GBKEE    時間: 2015-9-13 20:12

回復 2# espionage

試試看
  1. Sub Ex() '集保戶股權分散表查詢
  2.     Dim element As Object, i As Integer, k As Integer, J As Integer, jj As Integer, s As Integer
  3.     With CreateObject("InternetExplorer.Application")
  4.         .Visible = True
  5.         .Navigate "http://www.tdcc.com.tw/smWeb/QryStock.jsp"
  6.         Do While .Busy Or .ReadyState <> 4: DoEvents: Loop
  7.         With .Document
  8.             '.ALL("SqlMethod")(0).Checked = True    '勾選:證券代號
  9.            ' .All("StockNo").Value = "1101"
  10.             .ALL("SqlMethod")(1).Checked = True     '勾選:證券名稱
  11.             .ALL("StockName").Value = "聯電"
  12.             '.ALL("SCA_DATE").SELECTEDINDEX = 0     '第1個日期
  13.             .ALL("SCA_DATE").SELECTEDINDEX = 2      '第3個日期
  14.             .ALL("sub").Click                       '按下查詢鍵
  15.         End With
  16.         Do While .Busy Or .ReadyState <> 4          '等候網頁下載完畢
  17.             DoEvents
  18.             Application.SendKeys "~", True          '按 ENTER 按鍵 ,預防 "證券代號"有錯誤
  19.          Loop
  20.         Set element = .Document.getelementsbytagname("table")  '取得網頁資料區塊
  21.         If element.Length < 7 Then
  22.             MsgBox "證券代號  ??": Exit Sub
  23.         End If
  24.         With Sheets(1)
  25.             .Cells.Clear
  26.             k = k + 1
  27.             For s = 5 To 7                   '已找出網頁的table內容在 5-7 中
  28.                 For i = 0 To element(s).Rows.Length - 1                 '資料的列位
  29.                     For jj = 0 To element(s).Rows(i).Cells.Length - 1   '資料的欄位
  30.                         .Cells(k, jj + 1) = element(s).Rows(i).Cells(jj).INNERTEXT
  31.                     Next
  32.                     k = k + 1
  33.                 Next
  34.             Next
  35.         End With
  36.       '  .Quit  '關閉IE
  37.     End With
  38. End Sub
複製代碼

作者: espionage    時間: 2015-9-13 21:34

謝謝 GBKEE 大大 幫忙
.ALL("SCA_DATE").SELECTEDINDEX = 2      '第3個日期
1.  原來這個SELECTEDINDEX 語法可以改變 日期 選項,因為網頁原始檔的語法我找不到 option .value,真是受教了,但如果我想要從20150529跑到最近20150904,是不是要設定迴圈 i=0 to 14來改變SELECTEDINDEX 呢?
2.  承上,因為看過網頁選單,知道第一個選項是20150904,第二個選項是20150828,以此類推...除了人工填到Excel 之外,假使我們要把選單內的文字也一併抓出來到Excel,比方SELECTEDINDEX = 2 為20150821,可否加到語法內?
3. F or s = 5 To 7   '已找出網頁的table內容在 5-7 中,想請教GBKEE 怎麼看出來的? 因為我看不懂這一句,執行VBA,Excel會跳出MsgBox "證券代號  ??"就結束了
4. 假使我把這一段 If element.Length < 7 Then MsgBox "證券代號  ??": Exit Sub ,先移除,則VBA跑到 這一句For i = 0 To element(s).Rows.Length - 1  '資料的列位,會報錯,"沒有設定物件變數或with區塊變數 "


==================================================
                 資料日期  
                 <select size="1" name="SCA_DATE">
                       <option >20150904</option><option >20150828</option><option >20150821</option><option >20150814</option><option >20150807</option><option >20150731</option><option >20150724</option><option >20150717</option><option >20150709</option><option >20150703</option><option >20150626</option><option >20150618</option><option >20150612</option><option >20150605</option><option >20150529</option><option >20150522</option><option >20150515</option><option >20150508</option><option >20150430</option><option >20150401</option><option >20150302</option><option >20150202</option><option >20150105</option><option >20141201</option><option >20141103</option><option >20141001</option><option >20140901</option>               </select>
==================================================
作者: GBKEE    時間: 2015-9-14 05:21

回復 4# espionage
參考這些
http://forum.twbts.com/viewthread.php?tid=11817
http://forum.twbts.com/viewthread.php?tid=14561
http://forum.twbts.com/viewthread.php?tid=10515
http://forum.twbts.com/viewthread.php?tid=10392
作者: espionage    時間: 2015-9-14 17:02

GBKEE 大大
想請教一下
1. 我先執行您的VBA語法,但跑到For i = 0 To element(s).Rows.Length - 1 '資料的列位,顯示報錯,執行階段錯誤 '91': 沒有設定物件變數或 With區塊變數,請問我操作上是否有遺漏什麼?
2. 如果我加入一句,MsgBox element.Length,視窗會彈出 5,然後我先把迴圈取消,只單純加了這句,如下VBA,Cells(2, 6) = element(5).Rows(1).Cells(1).innertext,但還是報錯一樣的訊息,執行階段錯誤 '91': 沒有設定物件變數或 With區塊變數,可以請教這一句的語法我是不是錯了哪個地方?
感謝
=================================
Do While .Busy Or .ReadyState <> 4 '等候網頁下載完畢
DoEvents
Application.SendKeys "~", True '按 ENTER 按鍵 ,預防 "證券代號"有錯誤
Loop
Set element = .Document.getelementsbytagname("table") '取得網頁資料區塊
MsgBox element.Length

'If element.Length < 7 Then
'MsgBox "證券代號?": Exit Sub
'End If
With Sheets(1)
.Cells.Clear
.Cells(2, 6) = element(5).Rows(1).Cells(1).innertext
=================================
作者: GBKEE    時間: 2015-9-14 20:05

回復 6# espionage
修改一下看看
  1. Do While .Busy Or .ReadyState <> 4          '等候網頁下載完畢
  2.             DoEvents
  3.             Application.SendKeys "~", True          '按 ENTER 按鍵 ,預防 "證券代號"有錯誤
  4.         Loop
  5.         Do
  6.             Set element = .Document.getelementsbytagname("table")  '取得網頁資料區塊
  7.         Loop Until Not element Is Nothing
  8.         MsgBox element.Length
  9.         Stop
複製代碼
[attach]21975[/attach]
作者: espionage    時間: 2015-9-14 20:35

Hi GBKEE 大大
還是不行耶,底下是VBA碼
1. 跑到 Stop會停下來
2. 如果把Stop拿掉,If element.Length < 7 Then 這一段也先拿掉,程式還是跑到 For i = 0 To element(s).Rows.Length - 1 '資料的列位,這一句報錯,執行階段錯誤 '91': 沒有設定物件變數或 With區塊變數

============================================
Sub 集保抓取()

Dim A, element As Object, i As Integer, k As Integer, J As Integer, jj As Integer, s As Integer

With CreateObject("InternetExplorer.Application")
.Visible = True
.Navigate "http://www.tdcc.com.tw/smWeb/QryStock.jsp"
Do While .Busy Or .readyState <> 4: DoEvents: Loop

With .document
'-----輸入要查詢的股票代碼
   For Each A In .getelementsbytagname("INPUT") '找原始碼有input參數
   If A.Name = "StockNo" Then A.Value = Range("B1").Value '找原始碼有input參數,後面的name =StockNo
   Next
   
   .ALL("SCA_DATE").SELECTEDINDEX = 2
   .ALL("sub").Click
End With
   
Do While .Busy Or .readyState <> 4: DoEvents

Application.SendKeys "~", True '按 ENTER 按鍵 ,預防 "證券代號"有錯誤

Loop

Do
Set element = .document.getelementsbytagname("table")
Loop Until Not element Is Nothing
MsgBox element.Length
'Stop

'If element.Length < 7 Then
'MsgBox "證券代號  ??": Exit Sub
'End If

With Sheets(1)

k = k + 1
  For s = 5 To 7 '已找出網頁的table內容在 5-7 中
    For i = 0 To element(s).Rows.Length - 1 '資料的列位
      For jj = 0 To element(s).Rows(i).Cells.Length - 1   '資料的欄位
         .Cells(k, jj + 1) = element(s).Rows(i).Cells(jj).INNERTEXT
      Next
      k = k + 1
    Next
  Next
End With

End With

End Sub
作者: GBKEE    時間: 2015-9-15 05:27

本帖最後由 GBKEE 於 2015-9-15 05:56 編輯

回復 8# espionage
我只有Ie8沒這問題, Ie8 中element 的 Length =9
請有比Ie8新版的會員,看看問題在哪裡.
  1. Application.VBE.Windows("區域變數").Visible = True '請再加上
  2.     Stop  '程式停下來
  3.     '如7#的圖可以看看你的 "區域變數"視窗 中  element 的 Length 是多少
複製代碼
或是
  1. Application.Wait #12:00:05 AM#    '在程式中'等候5秒
  2.         Set element = .Document.getelementsbytagname("table")  '取得網頁資料區塊
  3.         Stop  '程式停下來,看 "區域變數"視窗 中  element 的 Length 是多少
  4.         With Sheets(1)
  5.             .Cells.Clear
  6.         
複製代碼
或是用WEB查詢
  1. Sub Ex() '集保戶股權分散表_WEB查詢
  2.     Dim Ar(), a, i As Integer, strDate As String, stkno As String, Qur As String
  3.     With CreateObject("InternetExplorer.Application")
  4.         .Navigate "http://www.tdcc.com.tw/smWeb/QryStock.jsp"
  5.         Do While .Busy Or .ReadyState <> 4: DoEvents: Loop
  6.         Set a = .Document.ALL.tags("option") '資料日期的內容
  7.         ReDim Ar(a.Length - 1)
  8.         For i = 0 To a.Length - 1
  9.             Ar(i) = a(i).innerHTML
  10.         Next
  11.         .Quit
  12.     End With
  13.     strDate = Ar(0) '導入當月日期
  14.     Do
  15.         strDate = InputBox(Join(Ar, vbTab), "集保戶股權分散表查詢 之 有效日期", strDate)
  16.         If strDate = "" Then Exit Sub
  17.      
  18.     Loop Until IsNumeric(Application.Match(strDate, Ar, 0))
  19.     stkno = InputBox("輸入股票代號", "股票代號", 2317)    '
  20.     If stkno = "" Then Exit Sub
  21.     Qur = "http://www.tdcc.com.tw/smWeb/QryStock.jsp?SCA_DATE=" & strDate & "&SqlMethod=StockNo&StockNo=" & stkno & "&StockName=&sub=%ACd%B8%DF"
  22.     With ActiveSheet
  23.         If .QueryTables.Count = 0 Then
  24.             .QueryTables.Add "URL;" & Qur, .[A1]
  25.         Else
  26.             .QueryTables(1).Connection = "URL;" & Qur
  27.         End If
  28.         With .QueryTables(1)
  29.             .WebSelectionType = xlSpecifiedTables
  30.             .WebFormatting = xlWebFormattingNone
  31.             .WebTables = "6,7,8"
  32.             .WebPreFormattedTextToColumns = True
  33.             .WebConsecutiveDelimitersAsOne = True
  34.             .WebSingleBlockTextImport = False
  35.             .WebDisableDateRecognition = False
  36.             .WebDisableRedirections = False
  37.             .Refresh BackgroundQuery:=False
  38.         End With
  39.     End With
  40. End Sub
複製代碼

作者: espionage    時間: 2015-9-15 23:06

GBKEE 大大
1. 您所提的WEB查詢,可以執行
2. 至於原本語法的修改還是不行耶,我有參考另外一封語法,也是您回覆的,http://forum.twbts.com/viewthread.php?tid=9511,兩者目的很像,一樣是輸入代號與日期,跑資料,發現這個VBA是有效,可以跑出結果,所以挺納悶的
3.  我有發現一個問題,原本我詢問的網頁,http://www.tdcc.com.tw/smWeb/QryStock.jsp,當輸入完股票代號,跑出結果之後,網頁上的股票代號就會消失不見了,而網頁原始檔的行數由167行增加為393行,如下圖紅框,[attach]21993[/attach]
4.  而另外一篇網頁 http://mops.twse.com.tw/mops/web/t164sb04,當輸入完股票代號,跑出結果之後,網頁上的股票代號不會消失,網頁原始檔的行數由704行維持為704行,如下圖紅框,[attach]21994[/attach]
5. 不知道這有沒有關係,故請教一下,我在找朋友有IE8的試試看原本的code
感謝
作者: GBKEE    時間: 2015-9-16 06:11

本帖最後由 GBKEE 於 2015-9-16 06:12 編輯

回復 10# espionage
網頁上的股票代號查詢後會不會消失不見.端看各網頁原始碼的寫法.
作者: s13983037    時間: 2015-9-27 01:33

回復 9# GBKEE

Hi GBKEE您好
看到您的程式碼 想把他修正成 個股的集保日期
當第一筆日期輸入時填入 A1欄中
但是第二筆資料輸入時填入A28欄中
以此類推每一筆資料填入後都需間隔28欄位,
目前我只有修正到可以重複填入日期的部分,請教GBKEE 前輩 不知要如何修改,可否提點迷津 感謝您\QQ/

以下為修正程式碼

    Dim Ar(), a, i As Integer, strDate As String, stkno As String, Qur As String
    With CreateObject("InternetExplorer.Application")
        .Navigate "http://www.tdcc.com.tw/smWeb/QryStock.jsp"
        Do While .Busy Or .ReadyState <> 4: DoEvents: Loop
        Set a = .Document.ALL.tags("option") '資料日期的內容
        ReDim Ar(a.Length - 1)
        For i = 0 To a.Length - 1
            Ar(i) = a(i).innerHTML
        Next
        .Quit
    End With
   
    For DateVar = 0 To 28
    strDate = Ar(DateVar) '導入當月日期
    Do
        strDate = InputBox(Join(Ar, vbTab), "集保戶股權分散表查詢 之 有效日期", strDate)
        If strDate = "" Then Exit Sub
     
    Loop Until IsNumeric(Application.Match(strDate, Ar, 0))
    stkno = InputBox("輸入股票代號", "股票代號", 2313)    '
    If stkno = "" Then Exit Sub
    Qur = "http://www.tdcc.com.tw/smWeb/QryStock.jsp?SCA_DATE=" & strDate & "&SqlMethod=StockNo&StockNo=" & stkno & "&StockName=&sub=%ACd%B8%DF"
    With ActiveSheet
                                For WriteDate = 1 To 1
                                        If .QueryTables.Count = 0 Then
                                                .QueryTables.Add "URL;" & Qur, .[A & WriteDate * 28 * (WriteDate) ]
                                        Else
                                                .QueryTables(1).Connection = "URL;" & Qur
                                        End If
                                        With .QueryTables(1)
                                                .WebSelectionType = xlSpecifiedTables
                                                .WebFormatting = xlWebFormattingNone
                                                .WebTables = "6,7,8"
                                                .WebPreFormattedTextToColumns = True
                                                .WebConsecutiveDelimitersAsOne = True
                                                .WebSingleBlockTextImport = False
                                                .WebDisableDateRecognition = False
                                                .WebDisableRedirections = False
                                                .Refresh BackgroundQuery:=False
                                        End With
                                Next
    End With
    Next
作者: GBKEE    時間: 2015-9-27 06:40

回復 12# s13983037
試試看
  1. Option Explicit
  2. Sub Ex()
  3.     Dim Ar(), a As Variant, i As Integer, stkno As String, Qur As String, DateVar As Integer, Sh As Worksheet
  4.     With CreateObject("InternetExplorer.Application")
  5.         .Navigate "http://www.tdcc.com.tw/smWeb/QryStock.jsp"
  6.         Do While .Busy Or .ReadyState <> 4: DoEvents: Loop
  7.         Set a = .Document.ALL.tags("option") '資料日期的內容
  8.         ReDim Ar(a.Length - 1)
  9.         For i = 0 To a.Length - 1
  10.             Ar(i) = a(i).innerHTML
  11.         Next
  12.         .Quit
  13.     End With
  14.     stkno = InputBox("輸入股票代號", "股票代號", 2313)    '
  15.     If stkno = "" Then Exit Sub
  16.     Set Sh = ActiveSheet             '指定工作表
  17.     With Sh
  18.         For DateVar = 0 To UBound(Ar)
  19.             Qur = "http://www.tdcc.com.tw/smWeb/QryStock.jsp?SCA_DATE=" & Ar(DateVar) & "&SqlMethod=StockNo&StockNo=" & stkno & "&StockName=&sub=%ACd%B8%DF"
  20.             .QueryTables.Add "URL;" & Qur, .Cells(1 + (DateVar * 27), "A")
  21.             '.Cells(1 + (DateVar * 27), "A")  A欄間隔 27列
  22.             With .QueryTables(1)
  23.                 .WebSelectionType = xlSpecifiedTables
  24.                 .WebFormatting = xlWebFormattingNone
  25.                 .WebTables = "6,7,8"
  26.                 .WebPreFormattedTextToColumns = True
  27.                 .WebConsecutiveDelimitersAsOne = True
  28.                 .WebSingleBlockTextImport = False
  29.                 .WebDisableDateRecognition = False
  30.                 .WebDisableRedirections = False
  31.                 .Refresh BackgroundQuery:=False
  32.                 Sh.Names(.Name).Delete '刪掉工作表上的名稱
  33.                 .Delete                '刪掉這QueryTable
  34.             End With
  35.         Next
  36.     End With
  37. End Sub
複製代碼

作者: s13983037    時間: 2015-9-27 09:33

回復 13# GBKEE
Hi GBKEE前輩
謝謝您 可以用!!!
作者: espionage    時間: 2015-9-29 11:17

Hi GBKEE 大大
我找了一台有IE8的電腦,您的原始程式可以執行,原來IE版本會有這樣的影響
謝謝指教
作者: chang0833    時間: 2017-7-15 15:42

可以請各位先進幫忙解答這問題嗎?
1.本使用著超版GBKEE所提供的程式,但最近
    在下載時,卻連網頁背景顏色都下載下來(原只有文字沒背景)
    是什麼原因造成的?
作者: GBKEE    時間: 2017-7-15 17:55

回復 16# chang0833
  1. .PreserveFormatting = False   '程式碼上加上這行
  2.                 .Refresh BackgroundQuery:=False
  3.                 Sh.Names(.Name).Delete '刪掉工作表上的名稱
複製代碼

作者: chang0833    時間: 2017-7-16 19:21

回復 17# GBKEE

謝謝版大開解^^
作者: chang0833    時間: 2017-7-16 20:07

回復 18# chang0833

在冒昧請超版GBKEE
下載會出現這格式的變動,是因為網站的網頁程式本身變動造成的嗎?
作者: chang0833    時間: 2017-7-16 21:18

不好意思,問題多了點
煩請GBKEE大大提點!!
我此次下次下載下來,連帶的連整個網頁表格的格式都一起下載下來
如何才能只下載純資料就好,不要有任何網頁表格格式?
作者: chang0833    時間: 2017-7-28 21:56

回復 20# chang0833
GBKEE版大真的還是要找你求救~"~
自己找了了很久,還是不知道QueryTable 屬性的用法
需用哪一個屬性設定才能不下載網頁儲存格格線???
麻煩版大及高手幫忙解答,感激不盡!!
作者: chang0833    時間: 2017-7-29 09:11

[attach]27559[/attach]
版大程式碼是用你的
圖左邊是加入版大後來修正的
想把格線也同時取消
一直找不到方法,麻煩版大幫忙,謝謝
作者: chang0833    時間: 2017-7-29 11:05

  1. Sub Ex1()
  2. Cells.Clear
  3.     Dim Ar(), a As Variant, i As Integer, stkno As String, Qur As String, DateVar As Integer, Sh As Worksheet
  4.     With CreateObject("InternetExplorer.Application")
  5.         .Navigate "http://www.tdcc.com.tw/smWeb/QryStock.jsp"
  6.         Do While .Busy Or .ReadyState <> 4: DoEvents: Loop
  7.         Set a = .Document.ALL.tags("option") '資料日期的內容
  8.         ReDim Ar(a.Length - 1)
  9.         For i = 0 To a.Length - 1
  10.             Ar(i) = a(i).innerHTML
  11.         Next
  12.         .Quit
  13.     End With
  14.     stkno = Sheets("目標股票").Range("B2").Value    '
  15.     If stkno = "" Then Exit Sub
  16.     Set Sh = ActiveSheet             '指定工作表
  17.     With Sh
  18.         For DateVar = 0 To UBound(Ar)
  19.             Qur = "http://www.tdcc.com.tw/smWeb/QryStock.jsp?SCA_DATE=" & Ar(DateVar) & "&SqlMethod=StockNo&StockNo=" & stkno & "&StockName=&sub=%ACd%B8%DF"
  20.             .QueryTables.Add "URL;" & Qur, .Cells(1 + (DateVar * 32), "A")
  21.             '.Cells(1 + (DateVar * 32), "A")  A欄間隔 32列
  22.             With .QueryTables(1)
  23.                 .WebSelectionType = xlSpecifiedTables
  24.                 .WebFormatting = xlWebFormattingNone
  25.                 .WebTables = "6,7,8"
  26.                 .WebPreFormattedTextToColumns = True
  27.                 .WebConsecutiveDelimitersAsOne = True
  28.                 .WebSingleBlockTextImport = False
  29.                 .WebDisableDateRecognition = False
  30.                 .WebDisableRedirections = False
  31.                 .PreserveFormatting = False
  32.                 .Refresh BackgroundQuery:=False
  33.                 Sh.Names(.Name).Delete '刪掉工作表上的名稱
  34.                 .Delete                '刪掉這QueryTable
  35.             End With
  36.         Next
  37.     End With
複製代碼
版大這是我用的程式碼。
作者: GBKEE    時間: 2017-7-29 12:54

回復 23# chang0833

我將工作表格線改成紅色,沒有下載到網頁格式顏色
你沒上傳檔案,我莫宰羊ㄚ


    [attach]27563[/attach]
作者: chang0833    時間: 2017-7-29 13:35

版大還是謝謝你,我後來用手動的把格線消除了
想說可不可以由電腦跑程式,順便學習一下,感恩^^
作者: oligo    時間: 2018-3-25 12:33

回復 9# GBKEE
GBKEE 大大的 Web 版很好用,我常常利用這個程式查詢,但前幾天該相關網頁似乎有修改過,現在如果跑程式會出現如下的錯誤:
執行階段錯誤 '9':
陣列索引超出範圍

偵錯的話會停在第9行的
ReDim Ar(a.Length - 1)

不知如何因應這個新修的網頁去修改程式?
謝謝!
作者: iamaraymond    時間: 2018-3-27 11:29

回復 26# oligo

哈囉,我剛剛上傳了一個新檔案,用來抓取改版後的資料,請參考
    http://forum.twbts.com/thread-20646-1-1.html
希望有幫到您~




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)