返回列表 上一主題 發帖

[發問] 集保戶股權分散表查詢 抓每週資料

[發問] 集保戶股權分散表查詢 抓每週資料

各位高手你們好 小弟在爬完很多頁面
也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
==========================================

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

TOP

回復 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
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

謝謝 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>
==================================================

TOP

感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

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
=================================

TOP

回復 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
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

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

TOP

本帖最後由 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
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

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

TOP

        靜思自在 : 修行要繫緣修心,藉事練心,隨處養心。
返回列表 上一主題