https://moneydj.emega.com.tw/z/zc/zcp/zcpa/zcpa_3322.djhtm
以前我匯入這些資料都會分行。但今天匯入時全部擠在同一行
不知道什麼原因?如圖,求解
execl網頁匯入資料問題
execl網頁匯入資料問題
以前網頁可能是真正的表格
所以可以直接抓
(以前的我沒看過,只是猜測)

目前的網頁是靠排版弄出來的
肉眼看起來很像表格
但是實際上的網頁結構不是
所以要另外找其他方式處理
剛試一下可行,步驟如下:
❶複製網頁表格。
❷貼至筆記本,重新複製。
❸貼至excel 意外完整分欄。2007版

本想貼完文字檔再用excel資料剖析功能,切割欄位〈依據空白段落〉。
wjt wrote:
剛試一下可行,步驟如下:


這個問題我有提供vba的範例
樓主在2021-12-23 21:48 #1 發問的

隔天有人在這篇
https://www.mobile01.com/topicdetail.php?f=511&t=4737630&p=118
2021-12-24 12:52 1172樓,向我發問相同的問題

我在
2021-12-24 18:11 1173樓,回答這個問題




當時,因發文時間的關係,這2個討論串,是隔壁鄰居連在一起的(上、下)

想說文章標題應該夠清楚了
加上只要換個網址,範例就能直接套用

所以我就沒有特別多回一篇文章
至於樓主有沒有順手點進去看,我就不清楚了
snare wrote:
這個問題我有提供vba(恕刪)


這個提供參考
可以真的去抓每個欄位資料
而不是用空格去判斷

喜歡爬資料的話
建議了解一下 DOM (Document Object Model)
會很有幫助
' 從暫存檔案中讀取
Function GetFromCacheFile()
Dim MyTextFile As String, TextLine As String, ResultText As String
Dim FileId As Integer

MyTextFile = "C:\tmpfile.html"
FileId = FreeFile()
ResultText = ""
Open MyTextFile For Input As FileId
While Not EOF(FileId)
Line Input #FileId, TextLine
ResultText = ResultText & Chr(10) & TextLine
Wend
GetFromCacheFile = ResultText
End Function

' 從網站抓資料
Function GetFromUrl()
Dim Url As String, GetXml As Object

Url = "http://5850web.moneydj.com/z/zc/zcr/zcra/zcra_6203.djhtm"
Set GetXml = CreateObject("msxml2.xmlhttp")
GetFromUrl = ""
With GetXml
.Open "GET", Url, False
.setRequestHeader "Cache-Control", "no-cache"
.setRequestHeader "Pragma", "no-cache"
.setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"
.send
GetFromUrl = .ResponseText
End With
End Function

'更新
Sub UpdateData()
Dim HTML As Object, TheSheet As Object
Dim Divs As Object, idx As Integer, Div As Object
Dim Spans As Object, idx2 As Integer

Set TheSheet = Sheets("工作表1")
Set HTML = CreateObject("htmlfile")

' 開發測試時可以改用 GetFromCacheFile() 從暫存檔抓資料
' 避免頻繁的發出請求
'(需要預先把網站的內容儲存到 C:\tmpfile.html)
HTML.Body.InnerHtml = GetFromUrl()

'公司名稱
Set Divs = HTML.querySelector("#oScrollHead")
TheSheet.Cells(1, 1) = Divs.ChildNodes.Item(0).textContent

'每個表
Set Divs = HTML.querySelectorAll("#oMainTable>tbody>tr>td>div")
For idx = 1 To Divs.Length - 1
Set Div = Divs.Item(idx)
If Div.classList.contains("table-caption") Then
'標題
TheSheet.Cells(idx + 1, 1) = Divs.Item(idx).textContent
Else
'列資料
Set Spans = Div.querySelectorAll("span")
For idx2 = 0 To Spans.Length - 1
TheSheet.Cells(idx + 1, idx2 + 1) = Spans.Item(idx2).textContent
Next idx2
End If
Next idx
End Sub

ren1244 wrote:
建議了解一下 DOM (Document Object Model)


真正厲害的通常少出聲,原來是潛水的高手,謝謝分享高階寫法
加5分,雖然我不知道分數有什麼用

dom我很熟,但我不曾在公開範例中用來處理表格問題
原因是,我分享範例有個原則
就是軟體在不改任何設定下的預設值,程式碼貼上就要能用
但私人用的程式到是常用

不過您的程式碼,如果excel沒有特別設定引用項目,是不能執行的
所以對這種連在一起的文字,我不用dom,通常用空白、clipboard,來處理

我很愛看高手分享的程式碼,有問題自己也知道怎麼修正
但一般初學者,對於明明高手分享的程式碼是正確的
貼上卻不能執行,只會一頭霧水,不知道要改那裡


所以,幫您補充說明一下
querySelector、querySelectorAll,這2個指令
在 CreateObject("internetexplorer.application"),使用上是沒有任何問題的


但在CreateObject("htmlfile") => 後期綁定,中是無法使用的,需做一點修正
一、
excel需先設定引用項目 Microsoft HTML Object Library ,要打勾

二、
不能用 CreateObject("htmlfile") => 後期綁定
要改成 Dim HTML As New MSHTML.HTMLDocument =>前期綁定

三、
對於不同的網站querySelector、querySelectorAll
指令後面查詢用字串也需做適當的修改
VBA 你比我熟很多
我今天只是不知道為什麼到期的 Excel 還能用
所以就試試看有沒有類似網頁元素的寫法
在這之前我其實是不知道 VBA 跟 http request 相關的元件

回饋一下我這邊的狀況
因為我之前是用 365 的
所以不知道是不是版本的關係
不做其他設定下,那樣寫可以直接跑了

至於分享寫法可能每個人觀點不同
我是覺得也許有些人看到比較進階的東西會去研究,之後就會懂了
ren1244 wrote:
回饋一下我這邊的狀況
因為我之前是用 365 的
所以不知道是不是版本的關係
不做其他設定下,那樣寫可以直接跑了


因為好奇querySelector、querySelectorAll跟新版excel相容性的問題
所以花點時間,找幾台電腦重灌測試,回饋一下測試結果


以下組合可正常執行,全部預設值,程式碼也不需修改
win10 x64+ excel 2016(x32 x64)
win10 x64+ excel 2019(x32 x64)
win10 x64+ excel 2021(x32 x64)
win10 x64+ excel 365


以下組合無法正常執行,excel 需設定引用、程式碼也要修改
win10 x64 + excel 2007(x32)
win7 x64 + excel 2003 舊版 ~ 中間略 ~ 新版 excel 2016(x32 x64)
文章分享
評分
評分
複製連結

今日熱門文章 網友點擊推薦!