返回列表 上一主題 發帖

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

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

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

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

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

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

Hi GBKEE 大大
我找了一台有IE8的電腦,您的原始程式可以執行,原來IE版本會有這樣的影響
謝謝指教

TOP

        靜思自在 : 受人點水之恩,須當湧泉以報。
返回列表 上一主題