• 156

(不定期更新)使用VBA解決 excel web 查詢無法匯入、匯入太慢的股市資料

snare wrote:
您在沒安裝任何軟體的情況下,成功執行了範例
您認為要不要裝呢

哈,因為我昨天就已經先裝了SeleniumBasic,所以不確定是不是因為裝了之後跑程式才沒問題,不過照snare大的說法,應該是不需要裝SeleniumBasic,我會先到公司試試看。

snare wrote:
這邊您搞錯了一件事,網頁是完整打開的,只是看不見視窗
Visible=False,是因為vba有完整支援ie object,所以可以控制可見、不可見
Visible=True,ie可見下,執行會出錯,通常是程式沒寫好,可能是不可見時湊巧避開了bug

了解,因為我只學到了VBA的一些皮毛,所以當執行IE Visible=True會出錯,而IE Visible=False不會出錯,就一直用這樣去執行,不過之後應該也不會再用IE了。

snare wrote:
不行,最多控制大小,無法像ie一樣隱形

那能不能在開啟完chrome完成複製貼上的工作後再將它關閉呢?

snare wrote:
帶隨身碟偷渡SeleniumBasic相關套件去公司裝
或是包個紅包給mis,請mis偷偷開一下權限安裝
不然就想辦法學習xmlhttp

sendkey是不得已的方法,因為太容易出問題了

哈,賄絡MIS,這我倒是沒想過,不過應該是行不通啦,總之我會去詢問看看公司是否可同意安裝SeleniumBasic相關套件

對了,為什麼我的工作管理員沒辦法看到title呢?我有AppActivate title這段關掉,好像不影響執行,但是我把UrL換成另一個網址,結果有時候貼上的不是網頁內容,而是網址那串文字而已,有時候又正常,不知為何會這樣,是不是像您說的,用sendkey容易出問題?
smart3135 wrote:
為什麼我的工作管理員沒辦法看到title呢?


正常,windows10、windows11,新版的管理員看不到

smart3135 wrote:
我有AppActivate title這段關掉,好像不影響執行


只要確定每次程式開啟時
視窗一定是在最上面,是active、有focus,可省略


smart3135 wrote:
那能不能在開啟完chrome完成複製貼上的工作後再將它關閉呢?


1228樓的範例,本來就會自動關掉chrome


smart3135 wrote:
但是我把UrL換成另一個網址,結果有時候貼上的不是網頁內容,而是網址那串文字而已,有時候又正常,不知為何會這樣,是不是像您說的,用sendkey容易出問題?


是的,因為sendkey 的 ctrl+a 、ctrl+c,沒有正常動作
所以貼的是上一次,也就是您改網址時複制的內容

AppActivate、sendkey,很容易被其它程式、人為干擾而失效
所以有時需sendkey其它快捷鍵組合,例如 alt+tab,偶爾還要配合滑鼠點擊重新找回focus
同一個程式碼,在別台電腦,還不一定會正常

您的狀況也許改用 autoit 自動化軟體更適合(教學請google)
有巨集腳本功能的鍵盤滑鼠,說不定也行
snare wrote:
這邊您搞錯了一件事,網頁是完整打開的,只是看不見視窗
Visible=False,是因為vba有完整支援ie object,所以可以控制可見、不可見
Visible=True,ie可見下,執行會出錯,通常是程式沒寫好,可能是不可見時湊巧避開了bug


snare大,之前您在1230樓有提到即便IE用VBA開起來,仍是可以複製貼上網頁內容,會出錯應該是程式沒寫好,以下範例方便請您測試一下嗎?我試是會出錯,是不是有哪裡沒有寫好?

Sub IE_openweb()
Dim IE As Object
Set IE = CreateObject("InternetExplorer.application")
With IE
    .Visible = True
    .navigate "https://www.mobile01.com/topicdetail.php?f=511&t=4737630&p=123"
    Do While .Busy Or .readyState <> 4: DoEvents: Loop
.execwb 17, 2      '選取 網頁內容
     .execwb 12, 2          '複製 網頁內容

Sheets(1).Activate
            With ActiveSheet                    '指定工作表
             .Cells.Clear                    '清理 工作表
             .[a1].Select
            .PasteSpecial NoHTMLFormatting:=True
             .[a1].Select
            End With
End with
End Sub





smart3135 wrote:
會出錯應該是程式沒寫好,以下範例方便請您測試一下嗎?我試是會出錯,是不是有哪裡沒有寫好?


這種寫法,單次執行沒問題,會出錯是多次、連續執行、有多個ie…

至於Automation 錯誤,這個原因
因為ie object 是大型物件,釋放、清除記憶體需要時間
程式結束、ie關閉後,視電腦效能,有時間差,並不是立刻釋放
所以當再次執行程式時,如果記憶體中還存在未釋放物件時
就會出現Automation 錯誤,這是ie object常見的問題。

再現這個錯誤,很簡單
程式正常執行後,立刻用最快的速度,再執行一次就會遇到了


多次執行,建議改寫如下

Sub IE_openweb()

re = 0
retry:
On Error GoTo Error_debug

Dim IE As Object
Set IE = CreateObject("InternetExplorer.application")

With IE
.Visible = True
.navigate "https://www.google.com.tw/search?q=covid-19"
Do While .Busy Or .readyState <> 4: DoEvents: Loop


.execwb 17, 2
'全選、複制需要時間,建議加上適當延遲
Application.Wait (Now + TimeValue("00:00:5"))

.execwb 12, 2
'全選、複制需要時間,建議加上適當延遲
Application.Wait (Now + TimeValue("00:00:05"))

Sheets(1).Activate
With ActiveSheet
.Cells.Clear
.[a1].Select
.PasteSpecial NoHTMLFormatting:=True
.[a1].Select
End With
End With

'程式結束前,多加以下這2行比較好
IE.Quit
Set IE = Nothing

Exit Sub

Error_debug:
re = re + 1

If re > 3 Then
Debug.Print "error"
MsgBox "嚴重錯誤,程式結束", vbOKOnly, "Error"
re = 0
Set IE = Nothing
Exit Sub
End If

If Err.Number <> 0 Then
Debug.Print re, Err.Description
End If

On Error GoTo -1
Err.Clear
Set IE = Nothing

MsgBox "物件釋放中,請稍後…(第" & re & "次重試)", vbOKOnly, "Error"
'為了重現多次錯誤,這裡故意只用1秒,請視電腦效能自行修改
Application.Wait (Now + TimeValue("00:00:1"))

GoTo retry


End Sub



snare wrote:
不行,最多控制大小,無法像ie一樣隱形
帶隨身碟偷渡SeleniumBasic相關套件去公司裝
或是包個紅包給mis,請mis偷偷開一下權限安裝
不然就想辦法學習xmlhttp


Snare大,今日有詢問MIS,沒想到還真的同意安裝SeleniumBasic,我同時也安裝了chromedrive和edgedriver,用您範例套用在我的程式中跑了一下,確實可以達到複製貼上的結果,只是原本用IE可以開啟的網頁,直接複製網址貼到Edge和Chrome,都無法正常顯示,變成我複製過來的資料都是不完整的,詢問過相關人員,但未得到明確答案,只說可能是相容性的問題,然後說Chrome的狀況無解,Edge可以用下列方式顯示內容,但每次都要做一次”在Internet Explorer模式中重新載入",這個動作有辦法直接寫在VBA中嗎?還是說有什麼設定可以讓相同網址在Edge和Chrome都可完整顯示?我用其他網址貼到Edge和Chrome,都可正常顯示(和IE相同),就唯獨這個平常在跑程式會需要用到的網址無法完整呈現,另外也有發現,從IE複製過來貼到Edge和Chrome的網址,會和IE有些不同,不知道這個是不是問題所在,公司內部網址無法在公司以外的電腦正常連結,我只能將在公司執行異常的畫面貼上來,目前程式在執行方面應該都沒問題了,主要問題是網頁在IE可以完整呈現,在Edge和Chrome卻不行,如果真無法解決,那表示我的這excel vba只能暫時停止使用,直到找到網頁可以完整呈現的方法,再次感謝您。

必須要執行以下步驟才會顯示內容








從IE複製過來貼到Edge和Chrome的網址,會和IE有些不同



程式碼如下:
Sub test_Ctrla_Ctrlc()
Dim Edge As New Selenium.EdgeDriver, keys As New keys, UrL As String
UrL = "C:/FujiFlexa/Client/Report/Jobdata/job0000/NXT3_Feeder%20SetupRepIndex_T.html"
Cells.Delete
With Edge
.Get UrL
'.Window.Maximize
.Wait 5000
.Keyboard.KeyDown (keys.Control)
.SendKeys "a"
.Keyboard.KeyUp (keys.Control)
'.Wait 1000
.Keyboard.KeyDown (keys.Control)
.SendKeys "c"
.Keyboard.KeyUp (keys.Control)
'.Wait 3000
End With
With Sheets("工作表1")
.Select
' Call SheetClear("工作表1")
.Cells(1, 1).Select
.PasteSpecial Format:="Unicode 文字", NoHTMLFormatting:=True
.Cells(1, 1).Select
End With
Edge.Quit
Set Edge = Nothing
End Sub

Sub test_Ctrla_Ctrlc1()
Dim Chrome As New Selenium.ChromeDriver, keys As New keys, UrL As String
UrL = "C:/FujiFlexa/Client/Report/Jobdata/job0000/NXT3_Feeder%20SetupRepIndex_T.html"
Cells.Delete
With Chrome
.Get UrL
'.Window.Maximize
.Wait 5000
.Keyboard.KeyDown (keys.Control)
.SendKeys "a"
.Keyboard.KeyUp (keys.Control)
'.Wait 1000
.Keyboard.KeyDown (keys.Control)
.SendKeys "c"
.Keyboard.KeyUp (keys.Control)
'.Wait 3000
End With
With Sheets("工作表1")
.Select
' Call SheetClear("工作表1")
.Cells(1, 1).Select
.PasteSpecial Format:="Unicode 文字", NoHTMLFormatting:=True
.Columns.AutoFit
.Cells(1, 1).Select
End With
Chrome.Quit
Set Chrome = Nothing
End Sub
smart3135 wrote:
只說可能是相容性的問題,然後說Chrome的狀況無解,Edge可以用下列方式顯示內容,但每次都要做一次”在Internet Explorer模式中重新載入",這個動作有辦法直接寫在VBA中嗎?


這是您公司網頁還不相容新版chrome、edge
網址中的 %20 = "空白" ,編碼問題,通常可互換

edge=>設定=>預設瀏覽器=>Internet Explorer 相容性=>改成 永遠
等公司網頁改版,相容性沒問題後,再改純edge開啟就行




另外,從圖片看來,感覺只是很單純的表格
建議試看看21樓範例,使用xmlhttp的寫法來處理
snare wrote:
這種寫法,單次執行沒問題,會出錯是多次、連續執行、有多個ie…

至於Automation 錯誤,這個原因
因為ie object 是大型物件,釋放、清除記憶體需要時間
程式結束、ie關閉後,視電腦效能,有時間差,並不是立刻釋放
所以當再次執行程式時,如果記憶體中還存在未釋放物件時
就會出現Automation 錯誤,這是ie object常見的問題。

再現這個錯誤,很簡單
程式正常執行後,立刻用最快的速度,再執行一次就會遇到了


多次執行,建議改寫如下


snare大,我用您改寫的下去跑,結果在第一次跑Set IE = CreateObject("InternetExplorer.application")就出錯了,印象中之前跑到這裡都還沒問題(現在是用家中電腦),這會和安裝了SeleniumBasic有關嗎?還是我的設定引用項目哪裡設定不對嗎?








snare wrote:
這是您公司網頁還不相容新版chrome、edge
網址中的 %20 = "空白" ,編碼問題,通常可互換

edge=>設定=>預設瀏覽器=>Internet Explorer 相容性=>改成 永遠
等公司網頁改版,相容性沒問題後,再改純edge開啟就行


感謝您,明日到公司再這樣設定試試看


snare wrote:
另外,從圖片看來,感覺只是很單純的表格
建議試看看21樓範例,使用xmlhttp的寫法來處理

有看過21樓的範例了,雖然不懂xmlhttp是什麼意思,但我會好好研究一下
我有試著先用範例跑了一下,但不知為何跑到這裡出現"此處需要物件"
我有把("table")後面的(6)改成0~5,結果一樣。

smart3135 wrote:
CreateObject("InternetExplorer.application")就出錯了,印象中之前跑到這裡都還沒問題(現在是用家中電腦),這會和安裝了SeleniumBasic有關嗎?還是我的設定引用項目哪裡設定不對嗎?



InternetExplorer.application,是vba原生支援的物件,且CreateObject() 是後期綁定
就算引用項目沒勾,也可正常執行
SeleniumBasic只是很單純的“獨立”套件,正常情況下不會衝突
至少我多部電腦亂裝都沒事

如果您是用win10
一、
檢查"開啟或關閉windows功能”中的 Internet Explorer 11,有沒有打勾
二、
控制台=>帳戶=>登入選項
=>當我登出並重新登入後,自動儲存我可以重新啟動的應用程式
關閉後,重新開機
(有可能是留在背景程式中,不可見的ie,在搞怪)


smart3135 wrote:
但不知為何跑到這裡出現"此處需要物件"



不要用範例中的yahoo,沒表格了,新版yahoo改成json格式
改用別的舊網站

在這行
HTMLsourcecode.body.innerhtml = .responsetext

下面多加一行,設中斷點
debug.print HTMLsourcecode.all.tags("table").length

如果回傳值是0,代表沒表格,就換個網站練習




發現微軟出了一個好玩的東西,功能很強大,基本上不用寫程式了,有興趣可以看看

微軟 Power Automate 自動化 Web 流程
https://docs.microsoft.com/zh-tw/power-automate/desktop-flows/automation-web?WT.mc_id=M365-MVP-4029057
snare wrote:
InternetExplorer.application,是vba原生支援的物件,且CreateObject() 是後期綁定就算引用項目沒勾,也可正常執行SeleniumBasic只是很單純的“獨立”套件,正常情況下不會衝突至少我多部電腦亂裝都沒事如果您是用win10一、檢查"開啟或關閉windows功能”中的 Internet Explorer 11,有沒有打勾二、控制台=>帳戶=>登入選項=>當我登出並重新登入後,自動儲存我可以重新啟動的應用程式關閉後,重新開機(有可能是留在背景程式中,不可見的ie,在搞怪)

snare大,我看了一下我電腦的設定,似乎就和您說的設定是一樣的,結果在跑的時候還是出現"類別未登錄",公司的電腦跑就正常,蠻奇怪的。




snare wrote:
發現微軟出了一個好玩的東西,功能很強大,基本上不用寫程式了,有興趣可以看看微軟 Power Automate 自動化 Web 流程https://docs.microsoft.com/zh-tw/power-automate/desktop-flows/automation-web?WT.mc_id=M365-MVP-4029057

稍微看了一下,內容蠻複雜的,可能是我對這方面理解不足,需要再找時間好好研究看看。
snare樓主,又來請教您了,上回的問題我已經處理好了,這次又有類似的問題,目前公司有一個網頁是可以輸入數字然後按查詢帶出結果,用Get URL只能帶出原始網頁,該怎麼在輸入欄那邊填入想要輸入的數字然後按下查詢呢?之前有寫過一個VBA,程式碼內容開啟IE,結果是可以執行的,但因為現在換成用Chrome抓資料了,所以原本的程式碼已經不適用了,網頁原始碼如圖,抓資料的網頁從IE切換到Chrome,語法該如何修正,是否有範例可參考呢?再麻煩您撥空指導一下,感謝。



用VBA開啟IE,對照網頁原始碼




Chrome的網頁原始碼
  • 156
內文搜尋
X
評分
評分
複製連結
請輸入您要前往的頁數(1 ~ 156)
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?