Board logo

標題: 請問如何將網頁的圖片存檔 [打印本頁]

作者: flask    時間: 2014-12-9 22:08     標題: 請問如何將網頁的圖片存檔

With CreateObject("InternetExplorer.application")           
        .Visible = True                                       
        .Navigate "http://www.gretai.org.tw/web/stock/aftertrading/broker_trading/brokerBS.php?l=zh-tw"
      
        Do Until .ReadyState = 4               
            DoEvents
        Loop
Set img = .document.all.tags("img")(0)
end with
請問我如何把img這個圖存成c:\2.png
作者: GBKEE    時間: 2014-12-10 14:21

回復 1# flask
最近股票公開網頁資訊的下載,都有驗證碼防止自動下載.
由於驗證碼不好破解,可試試半自動下載
1請在工作表上插入一圖片(命名:驗證圖)
2圖片巨集指定為 ,Sheet1.圖形更新,這程式

為使VBA入門者,有實作經驗,故僅附上程式碼.

[attach]19741[/attach]

ThisWorkbook模組的程式碼
  1. Option Explicit
  2. Private Sub Workbook_Open()
  3.     Sheet1.Msg = True
  4.     Run "Sheet1.圖形更新"
  5. End Sub
  6. Private Sub Workbook_BeforeClose(Cancel As Boolean)
  7.     On Error Resume Next
  8.     If Not Sheet1.IE Is Nothing Then Sheet1.IE.Quit
  9. End Sub
複製代碼
Sheet1模組的程式碼
  1. Option Explicit
  2. Public IE As Object, Msg As Boolean
  3. Const 圖形 = "d:\驗證圖.jpg"
  4. Const 證券代號 = "F2"
  5. Const 驗證碼 = "F4"
  6. Private Sub Worksheet_Change(ByVal Target As Range)
  7.     Range(證券代號).Interior.ColorIndex = IIf(Range(證券代號).Value = "", 2, 36)
  8.     With Target.Cells(1)
  9.          If .Address(0, 0) = 驗證碼 Then .Interior.ColorIndex = IIf(Len(Trim(.Cells)) = 5, 36, 2)
  10.          If .Address(0, 0) = 驗證碼 And Len(Trim(.Cells)) = 5 And Range(證券代號).Value <> "" Then
  11.             If IE Is Nothing Then
  12.                 Target = ""
  13.                 Msg = True
  14.                 圖形更新
  15.                 Exit Sub
  16.             End If
  17.             Application.EnableEvents = False
  18.             日報表載入
  19.             Target = ""
  20.             Application.EnableEvents = True
  21.         End If
  22.     End With
  23. End Sub
  24. Private Sub 日報表載入()
  25.     Dim e As Object, a As Object, K  As Integer, i As Integer, ii As Integer, s As String
  26.     If IE Is Nothing Then
  27.         圖形更新
  28.         MsgBox "驗證圖已更新"
  29.         Exit Sub
  30.     End If
  31.     With IE
  32.         .Document.ALL.tags("INPUT")("stk_code").Value = Range(證券代號)
  33.         .Document.ALL.tags("INPUT")("auth_num").Value = Trim(Range(驗證碼))
  34.         Set a = .Document.ALL.tags("BUTTON")
  35.         For Each e In a
  36.             If Trim(e.innertext) = "查詢" And e.ID = "" Then
  37.             e.Click
  38.             Exit For
  39.             End If
  40.         Next
  41.         Do While .Busy Or .readyState <> 4: DoEvents: Loop
  42.         K = 6
  43.         UsedRange.Offset(6).Clear
  44.         If .Document.body.innertext Like "***該股票該日無交易資訊***" Then s = "***該股票該日無交易資訊***"
  45.         If .Document.body.innertext Like "***驗證碼錯誤,請重新查詢。***" Then s = "***驗證碼錯誤,請重新查詢。*** "
  46.         If s <> "" Then
  47.             Range("a" & K + 1) = s
  48.             MsgBox s
  49.             GoTo NN
  50.         End If
  51.         Set a = .Document.ALL.tags("table")(0)
  52.         For i = 0 To a.Rows.Length - 1
  53.             K = K + 1
  54.             For ii = 0 To a.Rows(i).Cells.Length - 1
  55.                 Cells(K, ii + 1) = a.Rows(i).Cells(ii).innertext
  56.             Next
  57.         Next
  58.         Set a = .Document.ALL.tags("table")(2)
  59.         K = K + 1
  60.         For i = 0 To a.Rows.Length - 1
  61.             K = K + 1
  62.             For ii = 0 To a.Rows(i).Cells.Length - 1
  63.                 Cells(K, ii + 1) = a.Rows(i).Cells(ii).innertext
  64.             Next
  65.         Next
  66.         Set a = .Document.ALL.tags("table")(3)
  67.         For i = 1 To a.Rows.Length - 1
  68.             K = K + 1
  69.             For ii = 0 To a.Rows(i).Cells.Length - 1
  70.                 Cells(K, ii + 1) = a.Rows(i).Cells(ii).innertext
  71.             Next
  72.         Next
  73.         MsgBox Range("d7") & " 日報表載入 完畢!!"
  74. NN:
  75.         .Quit
  76.     End With
  77.     Set IE = Nothing
  78.     圖形更新
  79. End Sub
  80. Private Sub Get_Ie()
  81.     Set IE = CreateObject("InternetExplorer.Application")
  82.     With IE
  83.        ' .Visible = True
  84.         '券商買賣證券日報表查詢系統(一般交易)
  85.         .Navigate "http://www.gretai.org.tw/web/stock/aftertrading/broker_trading/brokerBS.php?l=zh-tw"
  86.         Do While .Busy Or .readyState <> 4: DoEvents: Loop
  87.     End With
  88. End Sub
  89. Private Sub 圖形更新()
  90.     If IE Is Nothing Then Get_Ie
  91.     If Msg Then MsgBox "驗證圖 更新完畢"
  92.     Msg = False
  93.     With IE
  94.         .Refresh
  95.         Do While .Busy Or .readyState <> 4: DoEvents: Loop
  96.         網路圖片存檔 .Document.ALL.tags("IMG")(0).href
  97.     End With
  98.     Sheet1.Shapes("驗證圖").Fill.UserPicture 圖形    '
  99. End Sub
  100. Private Sub 網路圖片存檔(img As String)
  101.     Dim xml As Object     '用來取得網頁資料
  102.     Dim stream            'As ADODB.stream   '用來儲存二進位檔案
  103.     Set xml = CreateObject("Microsoft.XMLHTTP")
  104.     Set stream = CreateObject("ADODB.stream")
  105.     xml.Open "GET", img, 0
  106.     xml.send
  107.     With stream
  108.         .Open
  109.         .Type = 1
  110.         .write xml.ResponseBody
  111.         If Dir(圖形) <> "" Then Kill 圖形
  112.         .SaveToFile (圖形)
  113.         .Close
  114.     End With
  115. End Sub
複製代碼

作者: flask    時間: 2014-12-10 19:29

感謝GBKEE大大的回答!
Private Sub 網路圖片存檔(img As String)
    Dim xml As Object     '用來取得網頁資料
    Dim stream            'As ADODB.stream   '用來儲存二進位檔案
    Set xml = CreateObject("Microsoft.XMLHTTP")
    Set stream = CreateObject("ADODB.stream")
    xml.Open "GET", img, 0
    xml.send
    With stream
        .Open
        .Type = 1
        .write xml.ResponseBody
        If Dir(圖形) <> "" Then Kill 圖形
        .SaveToFile (圖形)
        .Close
    End With
End Sub
以這方式下載的圖片與IE頁面的圖不是相同的圖
要如何下載回來的是IE頁面的圖,因為它是PNG檔
我試了幾種方式都沒辦法是IE頁面的圖,驗證碼的
圖要轉成BMP格式才能做2值化的處理.如果不是PNG
檔的話用GetClipboardData就可以處理了!一直想
破頭個人的功力實在太淺了還在學習中!希望老師
能提點一下!
作者: flask    時間: 2014-12-11 02:39

測試完發現驗證碼輸入頁面上的碼與存檔圖上的碼都是OK的??
作者: flask    時間: 2014-12-11 21:06

下載的圖片與IE頁面的圖不是相同的圖
導入都會"驗證碼已逾期,請重新查詢"
失敗!如何抓下來圖是ie頁面顯示的圖片咧?
作者: GBKEE    時間: 2014-12-12 05:38

回復 5# flask
程式執行如圖



    [attach]19763[/attach]
作者: flask    時間: 2014-12-12 08:31

原來是驗證碼tessdata-OCR視別錯誤!
作者: wufonna    時間: 2014-12-13 11:51

回復 6# GBKEE
請問 版大這是那裡出錯
謝謝
作者: GBKEE    時間: 2014-12-13 13:23

本帖最後由 GBKEE 於 2014-12-13 13:24 編輯

回復 8# wufonna
這錯誤是你將 IE關閉了
VBA按下重設,重新執行程式
  1. Private Sub Get_Ie()
  2.     Set IE = CreateObject("InternetExplorer.Application")
  3.     With IE
  4.        ' .Visible = True  *** 不顯示就是防止使用者關閉IE
  5.         '券商買賣證券日報表查詢系統(一般交易)
  6.         .Navigate "http://www.gretai.org.tw/web/stock/aftertrading/broker_trading/brokerBS.php?l=zh-tw"
  7.         Do While .Busy Or .readyState <> 4: DoEvents: Loop
  8.     End With
  9. End Sub
複製代碼
[attach]19776[/attach]

插入的圖片需使用繪圖的圖片
  1. 工作表1.Shapes("驗證圖").Fill.UserPicture 圖形
複製代碼
附檔插入的圖片沒改名稱 驗證圖
也可以使用 Shapes(索引值)->如Shapes(1)
作者: wufonna    時間: 2014-12-13 14:38

回復 9# GBKEE

GBKEE 大
執行有開啟IE
錯諤碼如下,還是我有那一步做了,謝謝

檔安同放D:\ 根目下
作者: GBKEE    時間: 2014-12-13 15:04

回復 10# wufonna

你的附檔
插入的圖片需使用繪圖的圖片
一樣你的附檔 的圖片沒改名稱為 "驗證圖"
給你除錯程式碼
  1. Private Sub 圖形更新()
  2.    On Error GoTo ER
  3.     If IE Is Nothing Then Get_Ie
  4.     If Msg Then MsgBox "驗證圖 更新完畢"
  5.     Msg = False
  6.     With IE
  7.         .Refresh
  8.         Do While .Busy Or .readyState <> 4: DoEvents: Loop
  9.         網路圖片存檔 .Document.ALL.tags("IMG")(0).href
  10.     End With
  11.     MsgBox 工作表1.Shapes("驗證圖").Name
  12.    
  13.     工作表1.Shapes("驗證圖").Fill.UserPicture 圖形    '
  14.   Exit Sub
  15. ER:
  16.     MsgBox Err & vbLf & Err.Description
  17.     Stop
  18.     MsgBox 工作表1.Shapes(1).Name
  19.     Resume
  20. End Sub

複製代碼

作者: wufonna    時間: 2014-12-13 17:24

回復 11# GBKEE
GBKEE 大大
2010版的找不到圖片如何更名,
這程式是要先看圖片的字再輸入 F2 和 f4 才可輸出嗎
程式還不清楚,研究看看 不會再請教 大大
謝謝  GBKEE 版大
作者: wufonna    時間: 2014-12-13 19:28

回復 11# GBKEE

謝謝 GBKEE 大大
* 使用繪圖的圖片
可以了 ^_^
作者: GBKEE    時間: 2014-12-14 05:45

回復 12# wufonna
2010版的找不到圖片如何更名
如圖 到名稱方塊中修改


[attach]19787[/attach]



VBA修改
  1. With 工作表1
  2.     .Shapes(1).Name = "驗證圖"
  3.     .Shapes("驗證圖").Fill.UserPicture 圖形    '
  4. End With
複製代碼

作者: HSIEN6001    時間: 2014-12-14 12:24

回復 14# GBKEE

[attach]19789[/attach]

請問,該如何載入其他頁次
若不用寫入Excel,而直接 .Click 下載CSV檔(BIG5) 檔案
語法該怎麼修正
  1.         Set aa = .Document.getElementsByTAGName("INPUT")
  2.         For R = 0 To aa.Length - 1
  3.             If aa(R).Value = "下載CSV檔(BIG5)" And aa(R).Type = "button" Then
  4.                 aa(R).Click   '有 "下載CSV檔(BIG5)" 的按鈕
  5.                     Do While .Busy Or .ReadyState <> 4: DoEvents: Loop
  6.             End If
  7.         Next
複製代碼

作者: wufonna    時間: 2014-12-14 13:05

回復 14# GBKEE

原來就在面前 哈
謝謝 GBKEE 大大
作者: wufonna    時間: 2014-12-14 15:00

本帖最後由 wufonna 於 2014-12-14 15:09 編輯

回復 14# GBKEE


    請問 大大 第一段對應的是這程式碼嗎,那第二段的我這樣改為何查無該股票代碼資料
諸問 大大 如何有誤,改如何做練習,謝謝


<button type="submit" class="btn btn-default"><span class="glyphicon glyphicon-search" aria-hidden="true"></span>&nbsp;查詢</button>

      Set a = .Document.ALL.tags("BUTTON")
        For Each e In a
            If Trim(e.innertext) = "查詢" And e.ID = "" Then
            e.Click
            Exit For
            End If
        Next

<input type="radio" id="rdo_search_stk" tabindex="14" name="rdo_search" value="1" class="input-radio-search" checked><span>個股查詢</span>
<button id="header_search_btn" tabindex="17" class="input-button ui-corner-all" tabindex="13">搜尋</button>       

Sub test()
Dim e As Object, a As Object
    Set IE = CreateObject("InternetExplorer.Application")
   
    With IE
        .Visible = True
        '券商買賣證券日報表查詢系統(一般交易)
        .Navigate "http://www.gretai.org.tw/web/stock/aftertrading/broker_trading/brokerBS.php?l=zh-tw"
        Do While .Busy Or .readyState <> 4: DoEvents: Loop
        .Document.ALL.tags("INPUT")("rdo_search_stk").Value = 1
        .Document.ALL.tags("INPUT")("input_search_site").Value = Trim(1258)
        Set a = .Document.ALL.tags("BUTTON")
        For Each e In a
        If e.ID = "header_search_btn" Then
            e.Click
            Exit For
        End If
        Next
    End With
End Sub
作者: wufonna    時間: 2014-12-14 18:08

回復 14# GBKEE


    謝謝 GBKEE 版大
   是我看錯了
   
        .Document.ALL.tags("INPUT")("input_search_stk").Value = Trim(1258)
作者: GBKEE    時間: 2014-12-16 10:20

回復 15# HSIEN6001

若不用寫入Excel,而直接 .Click 下載CSV檔(BIG5) 檔案
對IE的涉獵尚淺找不出下載CSV檔的參數,有請高手指點

載入其他頁次
Dim IEx As Object  '工作表模組
  1. Private Sub 日報表載入()
  2.     Dim e As Object, A As Object, k  As Integer, i As Integer, S As String
  3.     If IE Is Nothing Then
  4.         圖形更新
  5.         MsgBox "驗證圖已更新"
  6.         Exit Sub
  7.     End If
  8.     With IE
  9.         .Document.all.tags("INPUT")("stk_code").Value = Range(證券代號)
  10.         .Document.all.tags("INPUT")("auth_num").Value = Trim(Range(驗證碼))
  11.         Set A = .Document.all.tags("BUTTON")
  12.         For Each e In A
  13.             If Trim(e.Innertext) = "查詢" And e.ID = "" Then
  14.             e.Click
  15.             Exit For
  16.             End If
  17.         Next
  18.         Do While .Busy Or .readyState <> 4: DoEvents: Loop
  19.         UsedRange.Offset(6).Clear
  20.         Range("a" & k + 1) = S
  21.         If .Document.body.Innertext Like "***該股票該日無交易資訊***" Then S = "***該股票該日無交易資訊***"
  22.         If .Document.body.Innertext Like "***驗證碼錯誤,請重新查詢。***" Then S = "***驗證碼錯誤,請重新查詢。*** "
  23.         If S <> "" Then
  24.             Range("a" & k + 1) = S
  25.             MsgBox S
  26.             GoTo NN
  27.         End If
  28.         Set IEx = CreateObject("InternetExplorer.Application")
  29.         IEx.Navigate "about:Tabs"
  30.         Set A = .Document.all.tags("A")
  31.         單頁載入 .Document.all.tags("table")(0).outerHTML
  32.         [A6].Select
  33.         '********程式碼寫在工作表模組: Me 指這工作表模組
  34.         Me.PasteSpecial Format:="HTML", Link:=False, DisplayAsIcon:=False, NoHTMLFormatting:=True
  35.         '****************************************
  36.         If A.Length = 459 Then
  37.             For i = 2 To 3
  38.                 單頁載入 .Document.all.tags("table")(i).outerHTML
  39.                 With Range("A" & Rows.Count).End(xlUp).Offset(1)
  40.                     .Select
  41.                     Me.PasteSpecial Format:="HTML", Link:=False, DisplayAsIcon:=False, NoHTMLFormatting:=True
  42.                 End With
  43.             Next
  44.         Else
  45.             For k = 0 To A.Length - 1
  46.                 If Val(A(k).Innertext) >= 1 Then
  47.                     Debug.Print A(k).Innertext
  48.                     A(k).Click
  49.                     Do While .Busy Or .readyState <> 4: DoEvents: Loop
  50.                     Set A = .Document.all.tags("A")
  51.                     Do While .Busy Or .readyState <> 4: DoEvents: Loop
  52.                     For i = 2 To 3
  53.                         單頁載入 .Document.all.tags("table")(i).outerHTML
  54.                         With Range("A" & Rows.Count).End(xlUp).Offset(1)
  55.                             .Select
  56.                             Me.PasteSpecial Format:="HTML", Link:=False, DisplayAsIcon:=False, NoHTMLFormatting:=True
  57.                         End With
  58.                     Next
  59.                 End If
  60.             Next
  61.         End If
  62.         IEx.Quit
  63.         Set IEx = Nothing
  64.         整理
  65. NN:
  66.         .Quit
  67.     End With
  68.     Set IE = Nothing
  69.     圖形更新
  70. End Sub
  71. Private Sub 單頁載入(S)
  72.     With IEx
  73.         .Document.body.innerHTML = S
  74.         .ExecWB 17, 2       '  Select All
  75.         .ExecWB 12, 2       '  Copy selection
  76.     End With
  77. End Sub
  78. Private Sub 整理()
  79.     On Error Resume Next
  80.     Application.EnableEvents = False
  81.     With UsedRange.Offset(10)
  82.         .Replace "序號", "=ex", xlWhole
  83.         .SpecialCells(xlCellTypeFormulas, xlErrors).EntireRow.Delete
  84.     End With
  85.     UsedRange(1).Select
  86.     Application.EnableEvents = True
  87. End Sub
複製代碼

作者: HSIEN6001    時間: 2014-12-16 12:29

回復 19# GBKEE

耶!成了

謝謝您的指導!
程式語言,博大精深
對我來說很艱難,因為好用,還是很努力的盡量多吸收一些
還沒看懂的部分,也先收集起來,待日後消化

~感恩~
作者: joey0415    時間: 2014-12-16 13:05

回復 19# GBKEE

請問在第一段的

If IE Is Nothing Then

說此處需要物件,請問超版如何修正呢?
作者: HSIEN6001    時間: 2014-12-16 14:38

回復 21# joey0415

整段語法是這樣的 , 綜合 #2 & #9
ThisWorkbook模組的程式碼
  1. Option Explicit
  2. Private Sub Workbook_Open()
  3.     Sheet1.Msg = True
  4.     Run "Sheet1.圖形更新"
  5. End Sub
  6. Private Sub Workbook_BeforeClose(Cancel As Boolean)
  7.     On Error Resume Next
  8.     If Not Sheet1.IE Is Nothing Then Sheet1.IE.Quit
  9. End Sub
複製代碼
Sheet1模組的程式碼
  1. Option Explicit
  2. Public IE As Object, Msg As Boolean, IEx As Object
  3. Const 圖形 = "C:\驗證圖.jpg"
  4. Const 證券代號 = "F2"
  5. Const 驗證碼 = "F4"
  6. Private Sub Worksheet_Change(ByVal Target As Range)
  7.     Range(證券代號).Interior.ColorIndex = IIf(Range(證券代號).Value = "", 2, 36)
  8.     With Target.Cells(1)
  9.          If .Address(0, 0) = 驗證碼 Then .Interior.ColorIndex = IIf(Len(Trim(.Cells)) = 5, 36, 2)
  10.          If .Address(0, 0) = 驗證碼 And Len(Trim(.Cells)) = 5 And Range(證券代號).Value <> "" Then
  11.             If IE Is Nothing Then
  12.                 Target = ""
  13.                 Msg = True
  14.                 圖形更新
  15.                 Exit Sub
  16.             End If
  17.             Application.EnableEvents = False
  18.             日報表載入
  19.             Target = ""
  20.             Application.EnableEvents = True
  21.         End If
  22.     End With
  23. End Sub
  24. Private Sub 日報表載入()
  25.     Dim e As Object, A As Object, k  As Integer, i As Integer, S As String
  26.     If IE Is Nothing Then
  27.         圖形更新
  28.         MsgBox "驗證圖已更新"
  29.         Exit Sub
  30.     End If
  31.     With IE
  32.         .Document.all.tags("INPUT")("stk_code").Value = Range(證券代號)
  33.         .Document.all.tags("INPUT")("auth_num").Value = Trim(Range(驗證碼))
  34.         Set A = .Document.all.tags("BUTTON")
  35.         For Each e In A
  36.             If Trim(e.Innertext) = "查詢" And e.ID = "" Then
  37.             e.Click
  38.             Exit For
  39.             End If
  40.         Next
  41.         Do While .Busy Or .readyState <> 4: DoEvents: Loop
  42.         UsedRange.Offset(6).Clear
  43.         Range("a" & k + 1) = S
  44.         If .Document.body.Innertext Like "***該股票該日無交易資訊***" Then S = "***該股票該日無交易資訊***"
  45.         If .Document.body.Innertext Like "***驗證碼錯誤,請重新查詢。***" Then S = "***驗證碼錯誤,請重新查詢。*** "
  46.         If S <> "" Then
  47.             Range("a" & k + 1) = S
  48.             MsgBox S
  49.             GoTo NN
  50.         End If
  51.         Set IEx = CreateObject("InternetExplorer.Application")
  52.         IEx.Navigate "about:Tabs"
  53.         Set A = .Document.all.tags("A")
  54.         單頁載入 .Document.all.tags("table")(0).outerHTML
  55.         [A6].Select
  56.         '********程式碼寫在工作表模組: Me 指這工作表模組
  57.         Me.PasteSpecial Format:="HTML", Link:=False, DisplayAsIcon:=False, NoHTMLFormatting:=True
  58.         '****************************************
  59.         If A.Length = 459 Then
  60.             For i = 2 To 3
  61.                 單頁載入 .Document.all.tags("table")(i).outerHTML
  62.                 With Range("A" & Rows.Count).End(xlUp).Offset(1)
  63.                     .Select
  64.                     Me.PasteSpecial Format:="HTML", Link:=False, DisplayAsIcon:=False, NoHTMLFormatting:=True
  65.                 End With
  66.             Next
  67.         Else
  68.             For k = 0 To A.Length - 1
  69.                 If Val(A(k).Innertext) >= 1 Then
  70.                     Debug.Print A(k).Innertext
  71.                     A(k).Click
  72.                     Do While .Busy Or .readyState <> 4: DoEvents: Loop
  73.                     Set A = .Document.all.tags("A")
  74.                     Do While .Busy Or .readyState <> 4: DoEvents: Loop
  75.                     For i = 2 To 3
  76.                         單頁載入 .Document.all.tags("table")(i).outerHTML
  77.                         With Range("A" & Rows.Count).End(xlUp).Offset(1)
  78.                             .Select
  79.                             Me.PasteSpecial Format:="HTML", Link:=False, DisplayAsIcon:=False, NoHTMLFormatting:=True
  80.                         End With
  81.                     Next
  82.                 End If
  83.             Next
  84.         End If
  85.         IEx.Quit
  86.         Set IEx = Nothing
  87.         整理
  88. NN:
  89.         .Quit
  90.     End With
  91.     Set IE = Nothing
  92.     圖形更新
  93. End Sub
  94. Private Sub 單頁載入(S)
  95.     With IEx
  96.         .Document.body.innerHTML = S
  97.         .ExecWB 17, 2       '  Select All
  98.         .ExecWB 12, 2       '  Copy selection
  99.     End With
  100. End Sub
  101. Private Sub 整理()
  102.     On Error Resume Next
  103.     Application.EnableEvents = False
  104.     With UsedRange.Offset(10)
  105.         .Replace "序號", "=ex", xlWhole
  106.         .SpecialCells(xlCellTypeFormulas, xlErrors).EntireRow.Delete
  107.     End With
  108.     UsedRange(1).Select
  109.     Application.EnableEvents = True
  110. End Sub
  111. Private Sub Get_Ie()
  112.     Set IE = CreateObject("InternetExplorer.Application")
  113.     With IE
  114.        ' .Visible = True
  115.         '券商買賣證券日報表查詢系統(一般交易)
  116.         .Navigate "http://www.gretai.org.tw/web/stock/aftertrading/broker_trading/brokerBS.php?l=zh-tw"
  117.         Do While .Busy Or .readyState <> 4: DoEvents: Loop
  118.     End With
  119. End Sub
  120. Private Sub 圖形更新()
  121.     If IE Is Nothing Then Get_Ie
  122.     If Msg Then MsgBox "驗證圖 更新完畢"
  123.     Msg = False
  124.     With IE
  125.         .Refresh
  126.         Do While .Busy Or .readyState <> 4: DoEvents: Loop
  127.         網路圖片存檔 .Document.all.tags("IMG")(0).href
  128.     End With
  129.     Sheet1.Shapes("驗證圖").Fill.UserPicture 圖形    '
  130. End Sub
  131. Private Sub 網路圖片存檔(img As String)
  132.     Dim xml As Object     '用來取得網頁資料
  133.     Dim stream            'As ADODB.stream   '用來儲存二進位檔案
  134.     Set xml = CreateObject("Microsoft.XMLHTTP")
  135.     Set stream = CreateObject("ADODB.stream")
  136.     xml.Open "GET", img, 0
  137.     xml.send
  138.     With stream
  139.         .Open
  140.         .Type = 1
  141.         .write xml.ResponseBody
  142.         If Dir(圖形) <> "" Then Kill 圖形
  143.         .SaveToFile (圖形)
  144.         .Close
  145.     End With
  146. End Sub
複製代碼

作者: HSIEN6001    時間: 2014-12-16 15:04

本帖最後由 HSIEN6001 於 2014-12-16 15:06 編輯

回復 19# GBKEE

您好,我已經找到CSV下載的參數
GET
URL = "http://www.gretai.org.tw/web/stock/aftertrading/broker_trading/download_ALLCSV.php?curstk=" & 證券代號 & "&stk_date=" & 日期 & "&auth=" & 驗證碼

我把表身匯入改成這段
  1.     Dim xml As Object     '用來取得網頁資料
  2.     Dim stream            'As ADODB.stream   '用來儲存二進位檔案
  3.     Set xml = CreateObject("Microsoft.XMLHTTP")
  4.     Set stream = CreateObject("ADODB.stream")

  5. Dim path As String, url
  6. path = "C:\"
  7.     Dim 日期 As String
  8.     日期 = "1031215"

  9. 'GET http://www.gretai.org.tw/web/stock/aftertrading/broker_trading/download_ALLCSV.php?curstk=股票代號&stk_date=日期&auth=驗證碼

  10.     url = "http://www.gretai.org.tw/web/stock/aftertrading/broker_trading/download_ALLCSV.php?curstk=" & Sheets("Sheet1").[F2] & "&stk_date=" & 日期 & "&auth=" & Sheets("Sheet1").[F4]
  11.         xml.Open "GET", url, 0
  12.         xml.send
  13.     With stream
  14.         .Type = 1
  15.         .Open
  16.         .write xml.responseBody
  17.         If Dir(path & Sheets("Sheet1").[F2] & ".csv") <> "" Then Kill (path & Sheets("Sheet1").[F2] & ".csv")
  18.         .SaveToFile (path & Sheets("Sheet1").[F2] & ".csv")
  19.         .Close
  20.     End With
複製代碼
非常謝謝您的指導!!
^__^
作者: joey0415    時間: 2014-12-16 18:20

回復 23# HSIEN6001
可不可分享一個做好的zip檔,方便研究嗎?

這麼多Private Sub,不太會與修改

謝謝啦
作者: flask    時間: 2014-12-16 19:21

Sheets("上櫃股票").Activate
    With CreateObject("InternetExplorer.application")           '創建一個空的ie
        .Visible = True                                         '讓ie可見
        .Navigate "http://www.gretai.org.tw/web/stock/aftertrading/broker_trading/brokerBS.php?l=zh-tw"
        Do Until .ReadyState = 4               '等待ie完畢載入
            DoEvents
        Loop
         code = InputBox("輸入驗證碼", "code", code)
        For Each stock In Range([a2], [a65536].End(xlUp))'股票代號

        .Document.ALL("stk_code").Value = stock '填寫股票代號
        .Document.ALL("auth_num").Value = code '填寫驗證碼
     
    With Sheets("web")
      .Cells.Delete
      .QueryTables.Add Connection:="URL;", Destination:=.Range("A1")
      
    With .QueryTables.Add(Connection:="URL;http://www.gretai.org.tw/web/stock/aftertrading/broker_trading/download_ALLCSV.php?curstk=" & stock & "&stk_date=" & 日期 & "&auth=" & code & "", Destination:=.[a1])
        .AdjustColumnWidth = False
        .WebFormatting = xlWebFormattingNone
        .WebDisableDateRecognition = False
        .Refresh BackgroundQuery:=False
    End With
   
    .Columns("A:A").TextToColumns Destination:=.Range("A1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
        Semicolon:=False, Comma:=True, Space:=False, Other:=False, FieldInfo _
        :=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), _
        Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1)), _
        TrailingMinusNumbers:=True
        
    End With
End With
上櫃驗證碼有60秒的有效性,只要打個10來次就可下載完!
作者: flask    時間: 2014-12-16 19:46

Sheets("上櫃股票").Activate
    With CreateObject("InternetExplorer.application")           '創建一個空的ie
        .Visible = True                                         '讓ie可見
        .Navigate "http://www.gretai.org.tw/web/stock/aftertrading/broker_trading/brokerBS.php?l=zh-tw"
      
        Do Until .ReadyState = 4               '等待ie完畢載入
            DoEvents
        Loop
       code = InputBox("輸入查詢code", "code", code)
        For Each stock In Range([a2], [a65536].End(xlUp))
        .document.All("stk_code").Value = stock
        .document.All("auth_num").Value = code 'Cells(1, 1)
   
    With Sheets("web")
    .Cells.Delete
      .QueryTables.Add Connection:="URL;", Destination:=.Range("A1")
       DoEvents
    With .QueryTables.Add(Connection:="URL;http://www.gretai.org.tw/web/stock/aftertrading/broker_trading/download_ALLCSV.php?curstk=" & stock & "&stk_date=" & 日期 & "&auth=" & code & "", Destination:=.[a1])
        .AdjustColumnWidth = False
        .WebFormatting = xlWebFormattingNone
        .WebDisableDateRecognition = False
        .Refresh BackgroundQuery:=False
    End With
   
    .Columns("A:A").TextToColumns Destination:=.Range("A1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
        Semicolon:=False, Comma:=True, Space:=False, Other:=False, FieldInfo _
        :=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), _
        Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1)), _
        TrailingMinusNumbers:=True
        If .[a4] = " " Then .Cells.Delete: GoTo a
    End With
        If Sheets("web").[a4] = "驗證碼已逾期,請重新查詢" Then
        stock.Offset(, 2) = "ng"
        .Quit
        
        .Visible = True                                         '讓ie可見
        .Navigate "http://www.gretai.org.tw/web/stock/aftertrading/broker_trading/brokerBS.php?l=zh-tw"
        Do Until .ReadyState = 4               '等待ie完畢載入
            DoEvents
        Loop
      
         code = InputBox("輸入查詢code", "code", code)
                GoTo a
        End If
    整頁下載    '資訊整理
    a:
     Next
      End With
程序很亂相互參考一下!
作者: HSIEN6001    時間: 2014-12-16 20:09

回復 25# flask

   .Columns("A:A").TextToColumns Destination:=.Range("A1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
        Semicolon:=False, Comma:=True, Space:=False, Other:=False, FieldInfo _
        :=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), _
        Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1)), _
        TrailingMinusNumbers:=True

    請問這段怎麼應用,我也想要zip檔
可否給參考,謝謝
作者: HSIEN6001    時間: 2014-12-16 20:10

回復 24# joey0415

存檔位置自行修正
參考!
    [attach]19831[/attach]
作者: GBKEE    時間: 2014-12-16 21:56

本帖最後由 GBKEE 於 2014-12-16 22:02 編輯

回復 28# HSIEN6001
還有 Workbooks.Open 可用
  1. Option Explicit
  2. Public IE As Object, Msg As Boolean
  3. Const 圖形 = "d:\驗證圖.jpg"
  4. Const 證券代號 = "F2"
  5. Const 驗證碼 = "F4"
  6. Private Sub Worksheet_Change(ByVal Target As Range)
  7.     Range(證券代號).Interior.ColorIndex = IIf(Range(證券代號).Value = "", 2, 36)
  8.     With Target.Cells(1)
  9.          If .Address(0, 0) = 驗證碼 Then .Interior.ColorIndex = IIf(Len(Trim(.Cells)) = 5, 36, 2)
  10.          If .Address(0, 0) = 驗證碼 And Len(Trim(.Cells)) = 5 And Range(證券代號).Value <> "" Then
  11.             If IE Is Nothing Then
  12.                 Target = ""
  13.                 Msg = True
  14.                 圖形更新
  15.                 Exit Sub
  16.             End If
  17.             Application.EnableEvents = False
  18.             '日報表載入
  19.           CSV載入
  20.             Target = ""
  21.             Application.EnableEvents = True
  22.         End If
  23.     End With
  24. End Sub

  25. Private Sub Get_Ie()
  26.     Set IE = CreateObject("InternetExplorer.Application")
  27.     With IE
  28.         .Visible = True
  29.         '券商買賣證券日報表查詢系統(一般交易)
  30.         .Navigate "http://www.gretai.org.tw/web/stock/aftertrading/broker_trading/brokerBS.php?l=zh-tw"
  31.         Do While .Busy Or .readyState <> 4: DoEvents: Loop
  32.     End With
  33. End Sub

  34. Private Sub 圖形更新()
  35.     If IE Is Nothing Then Get_Ie
  36.     If Msg Then MsgBox "驗證圖 更新完畢"
  37.     Msg = False
  38.     With IE
  39.         .Refresh
  40.         Do While .Busy Or .readyState <> 4: DoEvents: Loop
  41.         網路圖片存檔 .Document.all.tags("IMG")(0).href
  42.     End With
  43.     Sheet1.Shapes("驗證圖").Fill.UserPicture 圖形    '
  44. End Sub

  45. Private Sub 網路圖片存檔(img As String)
  46.     Dim xml As Object     '用來取得網頁資料
  47.     Dim stream            'As ADODB.stream   '用來儲存二進位檔案
  48.     Set xml = CreateObject("Microsoft.XMLHTTP")
  49.     Set stream = CreateObject("ADODB.stream")
  50.     xml.Open "GET", img, 0
  51.     xml.send
  52.     With stream
  53.         .Open
  54.         .Type = 1
  55.         .write xml.responseBody
  56.         If Dir(圖形) <> "" Then Kill 圖形
  57.         .SaveToFile (圖形)
  58.         .Close
  59.     End With
  60. End Sub

  61. Private Sub CSV載入()
  62.     Dim e As Object, A As Object, kDate As String, S As String
  63.     Application.EnableEvents = True
  64.     If IE Is Nothing Then
  65.         圖形更新
  66.         MsgBox "驗證圖已更新"
  67.         Exit Sub
  68.     End If
  69.     With IE
  70.         .Document.all.tags("INPUT")("stk_code").Value = Range(證券代號)
  71.         .Document.all.tags("INPUT")("auth_num").Value = Trim(Range(驗證碼))
  72.         Set A = .Document.all.tags("BUTTON")
  73.         For Each e In A
  74.             If Trim(e.Innertext) = "查詢" And e.ID = "" Then
  75.             e.Click
  76.             Exit For
  77.             End If
  78.         Next
  79.         Do While .Busy Or .readyState <> 4: DoEvents: Loop
  80.         If .Document.body.Innertext Like "***該股票該日無交易資訊***" Then S = "***該股票該日無交易資訊***"
  81.         If .Document.body.Innertext Like "***驗證碼錯誤,請重新查詢。***" Then S = "***驗證碼錯誤,請重新查詢。*** "
  82.         If S <> "" Then
  83.             'Range("a" & k + 1) = S
  84.             MsgBox S
  85.             GoTo NN
  86.         End If
  87.         kDate = Format(Date, "emmdd")
  88.         Application.DisplayAlerts = False
  89.         With Workbooks.Open("http://www.gretai.org.tw/web/stock/aftertrading/broker_trading/download_ALLCSV.php?curstk=" & Range(證券代號) & "&stk_date=" & kDate & "&&auth=" & Range(驗證碼))
  90.             .SaveAs "D:\" & Range(證券代號)
  91.             With .Sheets(1)
  92.                 .UsedRange.Range("G:K").SpecialCells(xlCellTypeConstants).Offset(1).Copy .Cells(.Rows.Count, 1).End(xlUp).Offset(1)
  93.                 .UsedRange.Range("G:K").Clear
  94.             End With
  95.             .Close True
  96.         End With
  97.         Application.DisplayAlerts = True
  98.         MsgBox "證券代號 : " & Range(證券代號) & " CSV 載入完畢"
  99. NN:
  100.         .Quit
  101.     End With
  102.     Set IE = Nothing
  103.     圖形更新
  104. End Sub
複製代碼

作者: HSIEN6001    時間: 2014-12-17 01:10

回復 25# flask

我已經看懂了,太厲害了
真的很快!!謝謝
作者: HSIEN6001    時間: 2014-12-17 01:13

回復 29# GBKEE

版大 Workbook open 匯入CSV的方式 , 收下囉!謝謝~
作者: HSIEN6001    時間: 2014-12-17 17:50

回復 29# GBKEE
您好,這裡一直出現缺 With 不知道哪裡要修改
麻煩幫忙校正問題
  1. Sub 下載CSV()
  2. Dim path As String, 日期 As String, URL As String, 代號
  3. path = "C:\myStock\"
  4. 日期 = Format(Date, "emmdd")
  5. Dim Rng As Range
  6. AA:
  7.     Set Rng = [C:C].Find("NG", , , xlWhole)
  8.     Sheets("下載依據").Activate
  9.     With CreateObject("InternetExplorer.application")
  10.         .Visible = True
  11.         .navigate "http://www.gretai.org.tw/web/stock/aftertrading/broker_trading/brokerBS.php?l=zh-tw"
  12.             Do Until .readyState = 4
  13.                 DoEvents
  14.             Loop
  15.         驗證碼 = InputBox("輸入查詢驗證碼", "驗證碼", code)   '驗證碼 = InputBox
  16.         For Each 代號 In Range(Rng.Offset(0, -2), [E65536].End(xlUp))
  17.             .document.all("stk_code").Value = 代號
  18.             .document.all("auth_num").Value = 驗證碼
  19.         '**** 直接下載CSV ****
  20.         Dim xml As Object
  21.         Dim stream
  22.         Set xml = CreateObject("Microsoft.XMLHTTP")
  23.         Set stream = CreateObject("ADODB.stream")
  24.             'GET http://www.gretai.org.tw/web/stock/aftertrading/broker_trading/download_ALLCSV.php?curstk=8069&stk_date=1031215&auth=驗證碼
  25.             URL = "http://www.gretai.org.tw/web/stock/aftertrading/broker_trading/download_ALLCSV.php?curstk=" & 代號 & "&stk_date=" & 日期 & "&auth=" & 驗證碼
  26.                 xml.Open "GET", URL, 0
  27.                 xml.send
  28.             With stream
  29.                 .Type = 1
  30.                 .Open
  31.                 .write xml.responseBody
  32.                 '**** 判斷讀取資料   ****************************************************************
  33.                 If .document.body.Innertext Like "*該日無交易資訊*" Then
  34.                     GoTo NN  'Goto 下一個
  35.                 ElseIf .document.body.Innertext Like "*驗證碼錯誤,請重新查詢*" Then
  36.                     Sheets("下載依據").Range("C:C").Delete      '清除舊的NG記號
  37.                     代號.Offset(, 2) = "NG"                     '新增斷點
  38.                     .Quit   '關閉 IE 視窗
  39.                     GoTo AA
  40.                  ElseIf .document.body.Innertext Like "*驗證碼已逾期,請重新查詢*" Then
  41.                     Sheets("下載依據").Range("C:C").Delete      '清除舊的NG記號
  42.                     代號.Offset(, 2) = "NG"                     '新增斷點
  43.                     .Quit   '關閉 IE 視窗
  44.                     GoTo AA
  45.                 '***** 判斷讀取資料  End *************************************************************
  46.                 .SaveToFile (path & 代號 & ".csv")
  47.                 .Close
  48.             End With
  49. NN:
  50.     Next
  51.         .Quit   '關閉 IE 視窗
  52.     End With
  53.     Range("C2") = "NG"  '重新作記號,方便下回下載
  54. End Sub
複製代碼

作者: GBKEE    時間: 2014-12-18 05:45

回復 32# HSIEN6001
  1.     '***** 判斷讀取資料  End *************************************************************
  2.             End If  '沒有With 少這 End If
複製代碼
但這程式尚有缺失需修改.

  1. Set Rng = [C:C].Find("NG", , , xlWhole)  '找不時的處置???
  2. For Each 代號 In Range(Rng.Offset(0, -2), [E65536].End(xlUp)) '須在前面
  3.         With CreateObject("InternetExplorer.application") '在For Each 代號 迴圈內
  4.          
  5.          '少掉查詢按鍵
  6.          if ....
  7.          '這段 IF 判斷要放在
  8.        End If   

  9.        沒有dir檢查 存檔之檔案是否存在
  10.          .SaveToFile (path & 代號 & ".csv")
複製代碼

作者: HSIEN6001    時間: 2014-12-18 08:44

回復 33# GBKEE


    出現執行階段錯誤'438 , 物件不支援此屬性或方法
跟這一段判斷式有關,不知道該怎麼改 ?
沒判斷內容,會下載到空值
  1.                 .write xml.responseBody
  2.                 '**** 判斷讀取資料   ****************************************************************
  3.                 If .document.body.Innertext Like "*該日無交易資訊*" Then
  4.                     GoTo NN  'Goto 下一個
  5.                 ElseIf .document.body.Innertext Like "*驗證碼錯誤,請重新查詢*" Then
  6.                      '代號.Offset(, 2) = "NG"
  7.                      GoTo AA ''視窗不關閉 & 重新輸入驗證碼 & 代號
  8.                 ElseIf .document.body.Innertext Like "*驗證碼已逾期,請重新查詢*" Then
  9.                     Sheets("下載依據").Range("F:F").Delete      '清除舊的NG記號
  10.                     代號.Offset(, 1) = "NG"                     '在隔壁 第1欄位標註 "NG" , 方便重新抓取時,避開已經下載的資料
  11.                     .Quit   '關閉 IE 視窗
  12.                      GoTo AA ''視窗重新開啟 & 重新輸入驗證碼 & 代號
  13.                 End If
  14.                 '***** 判斷讀取資料  End *************************************************************
複製代碼

作者: GBKEE    時間: 2014-12-18 12:33

回復 34# HSIEN6001
  1.   With stream   '在這With下
  2.                .Type = 1
  3.                 .Open
  4.                 .write xml.responseBody
  5.                 '**** 判斷讀取資料   ****************************************************************
  6.                 If .document.body.Innertext Like "*該日無交易資訊*" Then
  7.                  '*******  .document 是IE的子物件******
  8.                     GoTo NN  'Goto 下一個
複製代碼

作者: HSIEN6001    時間: 2014-12-18 14:53

回復 35# GBKEE


如果用 .responseText
怎麼寫,達到 IF ...Then...ElseIF.... EndIf
作者: kenkid    時間: 2014-12-28 15:48

太強了...我正好想破頭了T_T...沒想到有大大分享解決辦法^^




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