Board logo

標題: [發問] 如何將從EXCEL內的資料貼入網站中(過程都由VBA自動執行) [打印本頁]

作者: icestormer    時間: 2013-10-18 13:29     標題: 如何將從EXCEL內的資料貼入網站中(過程都由VBA自動執行)

[attach]16366[/attach]
主要想讓紅圈處 的資料  複制>>打開右上方的網址>再貼上後按下 submit  


最好還能將下面紅圈處二筆ISK 也都傳回EXCEL上

不知有沒有法子能做到呢? 感謝幫忙了


作者: stillfish00    時間: 2013-10-18 16:20

本帖最後由 stillfish00 於 2013-10-18 16:22 編輯

回復 1# icestormer
  1. Sub Test()
  2.   Dim oIe, myData As DataObject, x
  3.   
  4.   Set myData = New DataObject  '需引用 MS Form Object Library
  5.   
  6.   With Sheets("問題")
  7.     .Range(.[A4], .[F4].End(xlDown)).Copy
  8.   End With
  9.   myData.GetFromClipboard
  10.   
  11.   Set oIe = CreateObject("internetExplorer.Application")
  12.   With oIe
  13.     '.Visible = False
  14.     .navigate "http://www.evepraisal.com"
  15.     Do While oIe.readystate <> 4: DoEvents: Loop
  16.    
  17.     .document.getElementById("raw_textarea").innerText = myData.GetText '填入
  18.     .document.getElementById("result_submit").Click 'submit
  19.    
  20.     Application.Wait Now + TimeValue("00:00:05")  '等待5秒完成
  21.    
  22.     Set x = .document.getElementById("result_container")
  23.     MsgBox x.All.tags("h4")(0).innerText
  24.     .Quit
  25.   End With
  26.   
  27. End Sub
複製代碼

作者: icestormer    時間: 2013-10-18 23:32

回復 2# stillfish00


   


你好 我不太懂問題出在那 但我才跑第一行就出現 上圖的問題 請問我要怎做呢??
作者: c_c_lai    時間: 2013-10-19 06:58

回復 3# icestormer
如 stillfish00 之解說: 使用 DataObject 宣告,須引用 Microsoft Form Object Library
你先檢查該 Library 是否已經勾選, 否則執行時會產生 "未定義" 的訊息,我將如何引用
的方法,說明如下,希望對你會有所幫助。
  1. 1.  開發人員  --->   工具   --->  設定引用項目   --->   可引用的項目(A)
  2. 2.  然後觀察 Micorsoft Forms 2.0 Ojbect Library 有否勾選?
  3. 3.  如果該項目不存在!
  4. 4.  則點選 "瀏覽" 選鈕   --->   新增引用項目 - VBAProject,
  5.     搜尋位置(I) 指向 Windows/System32\FM20.dll, 接著再點選
  6.     "開啟" 便會自動勾選 Micorsoft Forms 2.0 Ojbect Library 了。
複製代碼
祝你一帆風順!
作者: icestormer    時間: 2013-10-19 07:53

回復 4# c_c_lai


   你好  我是用2003的 但我找不到你說的 開發人員 選項呢
作者: c_c_lai    時間: 2013-10-19 08:04

回復 5# icestormer
我手頭上並沒有 2003 的版本,有關這方面
你可能要去請教 GBKEE 版大了,因為他也是
使用 2003 的版本。
作者: icestormer    時間: 2013-10-19 08:17

回復  icestormer
我手頭上並沒有 2003 的版本,有關這方面
你可能要去請教 GBKEE 版大了,因為他也是
...
c_c_lai 發表於 2013-10-19 08:04



   那請問我要怎找他呢? 是寫信給他? (我還沒用過這類的功能~~)
作者: c_c_lai    時間: 2013-10-19 08:38

回復 7# icestormer
我只會對案例回復,至於平常如何呼叫真的不知如何聯繫。
但我找到了兩篇有關解決方案,提供你參考:
  1. Actually it's a member of msforms library, not from native vba.

  2. you can use it without a userform but you'll need a reference
  3. to Microsoft Forms Object Library. The reference is automatically added
  4. to a workbook when you insert a Userform from VBeditor's Insert menu.
複製代碼
  1. Problem

  2. An Excel VBA subroutine that involves interaction with the Windows Clipboard fails to run with the error:
  3. “Compile error: User-defined type not defined.”  The line of code highlighted by Excel as
  4. being the cause of the error includes a reference to the “DataObject” object type.

  5. Solution

  6. (Tested on my machine with Excel 2003 SP3)

  7. In the Microsoft Visual Basic editor:

  8.     Stop debugging by clicking the “Stop” button on the toolbar (if debugging isn’t already stopped).
  9.     Tools menu | References
  10.     In the list of available references, find “Microsoft Forms 2.0 Object Library”, check it, and click OK.  (For me, this was the 2nd unchecked item from the top of the list; it wasn’t sorted alphabetically in the list like most of the rest of the listed items.)
  11.     Run the macro again.

  12. That’s it!  Hope this helps!
複製代碼

作者: c_c_lai    時間: 2013-10-19 14:38

回復 7# icestormer
為方便閱覽,特將它翻譯如下:
  1.     Actually it's a member of msforms library, not from native vba.
  2.     (確實它是微軟表單程式庫的乙員,而非 VBA 的生成元件)

  3.     you can use it without a userform but you'll need a reference
  4.     to Microsoft Forms Object Library. The reference is automatically added
  5.     to a workbook when you insert a Userform from VBeditor's Insert menu.
  6.     (你可以不需表單而去使用它,但是你還是須要參考到微軟的表單物件程式庫。
  7.      當你從VB編輯插入選單內插入一張表單時,此參考項會自動加入到活頁簿裡。)


  8.     Problem (問題)

  9.     An Excel VBA subroutine that involves interaction with the Windows Clipboard fails to run with the error:
  10.     “Compile error: User-defined type not defined.”  The line of code highlighted by Excel as
  11.     being the cause of the error includes a reference to the “DataObject” object type.
  12.     (當一個試算表 VBA 程式段內涵蓋視窗剪貼簿之鏈結於執行時產生錯誤:"程式編輯錯誤:使用者自訂型態尚未定義"。
  13.      反白標示發生錯誤的這行是在說明它在參照 "資料物件 (“DataObject”)" 時發生了參照錯誤。)

  14.     Solution (解決方案)

  15.     (Tested on my machine with Excel 2003 SP3) (已經在Excel 2003 SP3測試過)

  16.     In the Microsoft Visual Basic editor: (在微軟的 VB 編輯器內)

  17.         Stop debugging by clicking the “Stop” button on the toolbar (if debugging isn't already stopped).
  18.         (停止偵錯模式,即選按工作列上的 "停止" 鈕終止偵錯)
  19.         Tools menu | References  (工具菜單  |  參考項目 )
  20.         In the list of available references, find “Microsoft Forms 2.0 Object Library”, check it, and click OK.
  21.         在參考列示項目選單內,找尋“Microsoft Forms 2.0 Object Library”,找到後點選它就完成了。
  22.         (For me, this was the 2nd unchecked item from the top of the list; it wasn't sorted alphabetically
  23.          in the list like most of the rest of the listed items.)
  24.         Run the macro again. (再重新執行巨集)

  25.     That's it!  Hope this helps!  (就這樣! 希望對你有所幫助!)
複製代碼

作者: GBKEE    時間: 2013-10-19 16:36

本帖最後由 GBKEE 於 2013-10-19 16:39 編輯

回復 7# icestormer
模組插入表單就可以了

[attach]16376[/attach]
作者: icestormer    時間: 2013-10-19 21:23

本帖最後由 icestormer 於 2013-10-19 21:26 編輯

Sub Test()
  Dim oIe, myData As DataObject, x
  
  Set myData = New DataObject  '需引用 MS Form Object Library
  
  With Sheets("問題")
    .Range(.[A4], .[F4].End(xlDown)).Copy
  End With
  myData.GetFromClipboard
  
  Set oIe = CreateObject("internetExplorer.Application")
  With oIe
    '.Visible = False
    .navigate "http://www.evepraisal.com"
    Do While oIe.readystate <> 4: DoEvents: Loop
   
    .document.getElementById("raw_textarea").innerText = myData.GetText '填入
    .document.getElementById("result_submit").Click 'submit
   
    Application.Wait Now + TimeValue("00:00:05")  '等待5秒完成
   
    Set x = .document.getElementById("result_container")
  MsgBox x.All.tags("h4")(0).innerText

請問一下 MSGBOX這行 如果要把結果寫入 L22格內 要怎寫 呢?(不要顯示在MSGBOX上) 感謝

    .Quit
  End With
  
End Sub
作者: c_c_lai    時間: 2013-10-20 06:43

回復 11# icestormer
  1.       '  MsgBox x.All.tags("h4")(0).innerText
  2.       [L22] = x.All.tags("h4")(0).innerText
複製代碼

作者: icestormer    時間: 2013-10-20 09:08

回復 12# c_c_lai


   問題都解決了 感謝各位!
作者: handsometrowa    時間: 2013-10-21 10:19

回復 2# stillfish00


    Dear S 大

我想請問  關於網頁物件的這個寫法裡面

.document.getElementById("raw_textarea").innerText = myData.GetText '填入
    .document.getElementById("result_submit").Click 'submit

這兩行字的解釋,應該要去msdn的哪裡查詢  或是從哪個物件去了解

我常常看到你們與G大&H大 都能夠運用自如

我還在學習的過程當中,發現查找資料是最難的一環,剩下來的應用,看範例應該都能略知一二 慢慢理解

請問這個部分 假設我是新手,想要了解網頁物件用法,應該從哪個地方切入

謝謝您的指教^^
作者: icestormer    時間: 2013-10-21 14:44

Sub Test()
  Dim oIe, myData As DataObject, x
  
  Set myData = New DataObject  '需引用 MS Form Object Library
  
  With Sheets("問題")
    .Range(.[A4], .[F4].End(xlDown)).Copy
  End With
  myData.GetFromClipboard
  
  Set oIe = CreateObject("internetExplorer.Application")
  With oIe
    '.Visible = False
    .navigate "http://www.evepraisal.com"
    Do While oIe.readystate <> 4: DoEvents: Loop
   
    .document.getElementById("raw_textarea").innerText = myData.GetText '填入
    .document.getElementById("result_submit").Click 'submit
   
    Application.Wait Now + TimeValue("00:00:05")  '等待5秒完成
   
    Set x = .document.getElementById("result_container")


如果想分別捉取紅圈處亖個 1 total sell value  2 total buy value   3 total volume   分別存入 L22 L23 L24 格中[/size]''

請問要怎改呢? 感謝~




    MsgBox x.All.tags("h4")(0).innerText
    .Quit
  End With
  
End Sub
作者: stillfish00    時間: 2013-10-21 16:48

本帖最後由 stillfish00 於 2013-10-21 16:50 編輯

回復 14# handsometrowa
http://www.w3school.com.cn/html/index.asp 可以先看一下 HTML 的元素、標籤、屬性
http://www.w3school.com.cn/htmldom/index.asp 再看看節點、訪問方法(這是歸類在javascript下的,但都大同小異)

然後比對看過的範例,再對照原始碼可能會比較有收穫,其實就是在樹中根據特定屬性找節點。
作者: stillfish00    時間: 2013-10-21 16:51

回復 15# icestormer
  1.     Set x = .document.getElementById("results").tFoot.all.tags("span")
  2.     [L22].Value = x(0).innerText & " : " & x(3).innerText
  3.     [L23].Value = x(1).innerText & " : " & x(4).innerText
  4.     [L24].Value = x(2).innerText & " : " & x(5).innerText
複製代碼

作者: GBKEE    時間: 2013-10-21 17:00

回復 14# handsometrowa
搜尋   CreateObject("InternetExplorer.APPLICATION") 或 getElementById   會有答案的
作者: handsometrowa    時間: 2013-10-22 09:09

回復 18# GBKEE
回復 16# stillfish00

先感謝兩位前輩回覆我的問題,(題外話,請問怎麼一口氣回復兩個人阿,我是用複製貼上每次的回覆連結的@@")

昨天查找了一天,有點做白工的感覺,好像無頭蒼蠅  沒有想到G大跟我講的關鍵字 我單純搜尋就好,
(昨日用GOOGLE 瀏覽器 打上了Document.getElementsByName    跑到原文網站去,怎麼看怎麼不解起因結果)

今天得知兩位,上網爬了一下文章,轉載一下網址 ,希望給各位分享
原來網站是由每個元素構成的,每個元素都有自己的ID且不重複,(但是這個ID還可以不存在....)
難怪G大每次在抓網站資料的時候,要利用類似陣列元素一個一個抓
以下的網址  轉載了2006年的男丁格爾網站
http://blog.xuite.net/abgne/diary1/5896789#message_header
的簡單解釋,看了一下,稍能略知一二

原始的getElementsByName  
我先找到個網站http://blog.longwin.com.tw/2007/08/javascript_set_id_style_method_2007/
GetID 這個用法與stillfish00在16樓回我的依樣,是架設在JAVA 程式語言裡面的
沒有想到,碰個VBA,連其他軟體都要略知一二了

以上先跟各位分享,我慢慢再查找資料。
作者: icestormer    時間: 2013-10-22 19:37

回復 17# stillfish00


   感謝 你及大家的幫忙!

作者: icestormer    時間: 2013-10-28 08:44



原本都沒有題但昨天跟今左開始如上圖的錯誤 然後 錯行碼停在
   
    Application.Wait Now + TimeValue("00:00:05")  '等待5秒完成
Set x = .document.getElementById("results").tFoot.all.tags("span") 在這一行?

這種問題是網站來不及處理的問題  對吧?? 能怎處理呢? 把5秒變10或更長可行??
作者: icestormer    時間: 2013-10-28 09:32

回復 21# icestormer


  忘了說 網站有時 可以用有時又不行..不知是不是剛好很多人用在忙中
作者: icestormer    時間: 2013-10-29 21:47



我用以下的程式碼 出現以上圖的錯(之前不會有這問題) 另外奇怪的是 只要我是手動貼入 再手動點擊SUMBIT 網站都不會出錯呢 不知 如果改用FIREFOX 或GOOGLE的會好些?
有人能幫忙嗎?

Sub Test()
  Dim oIe, myData As DataObject, x
  
  Set myData = New DataObject  '需引用 MS Form Object Library
  
  With Sheets("自動計算表")
    .Range(.[A4], .[F4].End(xlDown)).Copy
  End With
  myData.GetFromClipboard
  
  Set oIe = CreateObject("internetExplorer.Application")
  With oIe
    '.Visible = False
    .navigate "http://www.evepraisal.com"
    Do While oIe.readystate <> 4: DoEvents: Loop
   
    .document.getElementById("raw_textarea").innerText = myData.GetText '填入
    .document.getElementById("result_submit").Click 'submit
   
    Application.Wait Now + TimeValue("00:00:05")  '等待5秒完成
   
       Set x = .document.getElementById("results").tFoot.all.tags("span")
    [L22].Value = x(0).innerText & " : " & x(3).innerText
    [L23].Value = x(1).innerText & " : " & x(4).innerText
    [L24].Value = x(2).innerText & " : " & x(5).innerText
    .Quit
  End With
  
End Sub




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