Lấy dữ liệu từ Website vào Excel

Liên hệ QC

PacificPR

Thành viên mới
Tham gia
6/5/16
Bài viết
1,997
Được thích
2,747
Xin chào các Anh (Chị):
Kính mong Anh(Chị) viết dùm em Code lấy dữ liệu từ Website vào Excel
Hiện tại em đang muốn lấy thông tin thời tiết từ ngày ... đến ngày ... tại trang https://www.accuweather.com vào trong Exel để lấy thông tin ngày mưa của địa phương mà công trình thi công.
Như File đính kèm thì ô B2 là ngày bắt đầu, ô D2 là ngày kết thúc và ô B3 là đường Link của địa phương công trình đang thi công nhưng chưa biết hướng giải quyết phải như thế nào.
Em xin chân thành cảm ơn./
 

File đính kèm

  • Thong tin thoi tiet.xls
    43.5 KB · Đọc: 99
Sử dụng Data, From Web là được nè.
Cho kết quả vào sheet tạm, rồi mình xử lý mở hỗn độn đó theo ý muốn. :D

upload_2018-1-5_17-12-54.png
 
Upvote 0
Xin chào các Anh (Chị):
Kính mong Anh(Chị) viết dùm em Code lấy dữ liệu từ Website vào Excel
Hiện tại em đang muốn lấy thông tin thời tiết từ ngày ... đến ngày ... tại trang https://www.accuweather.com vào trong Exel để lấy thông tin ngày mưa của địa phương mà công trình thi công.
Như File đính kèm thì ô B2 là ngày bắt đầu, ô D2 là ngày kết thúc và ô B3 là đường Link của địa phương công trình đang thi công nhưng chưa biết hướng giải quyết phải như thế nào.
Em xin chân thành cảm ơn./
Cái này khả năng lấy được, khi nào rảnh mình thử sức xem thế nào. Lấy dữ liệu web thì mình thấy có 2 bác này làm tốt doveandrose và Autoreply
 
Upvote 0
Em có tìm được Code này
PHP:
Option Explicit
Sub HTMLTable()
    Dim htm As Object
    Dim Tr As Object
    Dim Td As Object
    Dim Tab1 As Object
    Dim URL As String
    Dim Colstart As Long
    Dim HTML As Variant
    Dim i As Long
    Dim j As Long
    Dim n As Long
Application.ScreenUpdating = False
URL = VBA.Trim(Sheets(1).Cells(3, 2))
Set HTML = CreateObject("htmlfile")
With CreateObject("msxml2.xmlhttp")
    .Open "GET", URL, False
    .send
    HTML.Body.Innerhtml = .responseText
End With
Colstart = 1
j = 5
i = Colstart
n = 0

For Each Tab1 In HTML.getElementsByTagName("table")
    With HTML.getElementsByTagName("table")(n)
        For Each Tr In .Rows
            For Each Td In Tr.Cells
                Sheet1.Cells(j, i) = Td.innerText
                i = i + 1
            Next Td
            i = Colstart
            j = j + 1
        Next Tr
    End With
    n = n + 1
    i = Colstart
    j = j + 1
Next Tab1
Application.ScreenUpdating = True
End Sub
Nhờ Anh (Chị) sửa dùm em cho Code trên lấy dữ liệu theo tháng mình nhập vào ô B2 và D2 Không ạ

Em Cám ơn các Anh(Chị rất nhiều)
 

File đính kèm

  • Thong tin thoi tiet (1).xls
    49.5 KB · Đọc: 33
Lần chỉnh sửa cuối:
Upvote 0
Xin chào các Anh (Chị):
Kính mong Anh(Chị) viết dùm em Code lấy dữ liệu từ Website vào Excel
Hiện tại em đang muốn lấy thông tin thời tiết từ ngày ... đến ngày ... tại trang https://www.accuweather.com vào trong Exel để lấy thông tin ngày mưa của địa phương mà công trình thi công.
Như File đính kèm thì ô B2 là ngày bắt đầu, ô D2 là ngày kết thúc và ô B3 là đường Link của địa phương công trình đang thi công nhưng chưa biết hướng giải quyết phải như thế nào.
Em xin chân thành cảm ơn./
Bạn thử code này xem:
PHP:
Sub getdataweb()
Application.ScreenUpdating = False
Dim hrq As Object, html As Object, url As String, str As String, result, result1, dated As Date
Dim i As Long, j As Long, k As Long, nmonth As Long, wf As WorksheetFunction
Set wf = WorksheetFunction
Set hrq = CreateObject("msxml2.xmlhttp")
Set html = CreateObject("htmlfile")
[a4:g65000].Clear
With CreateObject("vbscript.regexp")
    .Global = True: .Pattern = "^(.+\s(\d{2}\/\d{2}))((.+°)(\d{1,2}\smm)(\d{1,2}\sCM)\s?(\D*))?(.+)$"
    For nmonth = 0 To DateDiff("m", wf.EoMonth([b1], -1) + 1, wf.EoMonth([d1], 0) + 1)
        url = "https://www.accuweather.com/vi/vn/thai-binh/356177/january-weather/356177?monyr=" _
        & Format(wf.EDate([b1], nmonth), "m/d/yyyy") & "&view=table"
        With hrq
            .Open "GET", url, False
            .send
            Do While .readystate <> 4
                DoEvents
            Loop
           html.body.innerhtml = .responsetext
        End With
        result = Split(html.getelementsbytagname("table")(0).innertext, vbNewLine)
        ReDim result1(1 To UBound(result) + 1, 1 To 7): k = 0
        For i = 1 To UBound(result1) - 1
            dated = DateValue(Trim(.Replace(result(i), "$2")) & "/" & Year(wf.EDate([b1], nmonth)))
            If dated >= [b1] And dated <= [d1] Then
                k = k + 1
                result1(k, 2) = .Replace(result(i), "$1"): result1(k, 3) = .Replace(result(i), "$4")
                result1(k, 4) = .Replace(result(i), "$5"): result1(k, 5) = .Replace(result(i), "$6")
                result1(k, 7) = Trim(.Replace(result(i), "$8")): result1(k, 1) = Format(wf.EDate([b1], nmonth), "mm/yyyy")
                result1(k, 6) = .Replace(result(i), "$7")
            End If
        Next i
        If k Then [a3].Offset([A65000].End(xlUp).Row - 2).Resize(k, 7) = result1
    Next nmonth
End With
[a4].CurrentRegion.Borders.LineStyle = 1
Set hrq = Nothing
Set html = Nothing
Application.ScreenUpdating = True
MsgBox "Done!"
End Sub
 

File đính kèm

  • Thong tin thoi tiet (1).xlsb
    34.1 KB · Đọc: 75
Lần chỉnh sửa cuối:
Upvote 0
Kết quả thật là tuyệt vời quá :yahoo:. Em cám ơn Anh @excel_lv1.5, Anh @befaint. Thầy @VetMin và Chị @NguyenNgocThuHien rất nhiều ạ. Chúc mọi người 1 ngày cuối tuần vui vẻ và hạnh phúc./
Cái lấy dữ liệu thời tiết này hay quá bác PacificPR ơi, tuy nhiên em tải file của bác excel_lv1.5 thì không chạy nhưng rất chậm. Bác Up lại file lên giúp em với được không? Em xin cảm ơn
 
Lần chỉnh sửa cuối:
Upvote 0
Em có tìm được Code này
PHP:
Option Explicit
Sub HTMLTable()
    Dim htm As Object
    Dim Tr As Object
    Dim Td As Object
    Dim Tab1 As Object
    Dim URL As String
    Dim Colstart As Long
    Dim HTML As Variant
    Dim i As Long
    Dim j As Long
    Dim n As Long
Application.ScreenUpdating = False
URL = VBA.Trim(Sheets(1).Cells(3, 2))
Set HTML = CreateObject("htmlfile")
With CreateObject("msxml2.xmlhttp")
    .Open "GET", URL, False
    .send
    HTML.Body.Innerhtml = .responseText
End With
Colstart = 1
j = 5
i = Colstart
n = 0

For Each Tab1 In HTML.getElementsByTagName("table")
    With HTML.getElementsByTagName("table")(n)
        For Each Tr In .Rows
            For Each Td In Tr.Cells
                Sheet1.Cells(j, i) = Td.innerText
                i = i + 1
            Next Td
            i = Colstart
            j = j + 1
        Next Tr
    End With
    n = n + 1
    i = Colstart
    j = j + 1
Next Tab1
Application.ScreenUpdating = True
End Sub
Nhờ Anh (Chị) sửa dùm em cho Code trên lấy dữ liệu theo tháng mình nhập vào ô B2 và D2 Không ạ

Em Cám ơn các Anh(Chị rất nhiều)
Dựa vào code của bạn
Mã:
Dim arr(1 To 1000, 1 To 6), n As Long
Sub main()
    Dim datefilter As Date, diffmonth As Integer, darr(1 To 1000, 1 To 6)
    Dim startday, endday As Long, i, j, k As Long
    Range("A5:F2000").Clear
    diffmonth = DateDiff("m", Cells(2, 2), Cells(2, 4))
    n = 1
    For k = 0 To diffmonth
        Call HTMLTable("https://www.accuweather.com/vi/vn/thai-binh/356177/march-weather/356177?monyr=", Format(DateAdd("m", k, Cells(2, 2)), "m/d/yyyy"))
    Next
    For i = 1 To UBound(arr)
        If arr(i, 1) <> "" Then
        If Val(Right(Split(arr(i, 1), "/")(0), 2)) = Day(Cells(2, 2)) Then
            startday = i
            Exit For
        End If
        End If
    Next
    For i = UBound(arr) To 1 Step -1
        If arr(i, 1) <> "" Then
        If Val(Right(Split(arr(i, 1), "/")(0), 2)) = Day(Cells(2, 4)) Then
            endday = i
            Exit For
        End If
        End If
    Next
    For i = startday To endday
        j = j + 1
        For k = 1 To 6
            darr(j, k) = arr(i, k)
        Next
    Next
    Range("A5").Resize(1000, 6) = darr
End Sub

Sub HTMLTable(url As String, month As String)
    Dim htm As Object
    Dim Tr As Object
    Dim Td As Object
    Dim Tab1 As Object
    Dim url1 As String
    Dim Colstart As Long
    Dim HTML As Variant
    Dim r, c As Integer
    url1 = url & month & "&view=table"
    Set HTML = CreateObject("htmlfile")
    With CreateObject("msxml2.xmlhttp")
        .Open "GET", url1, False
        .send
        Do While .readystate <> 4
            DoEvents
        Loop
        HTML.Body.Innerhtml = .responseText
    End With
    With HTML.getElementsByTagName("table")(0)
        For r = 1 To .Rows.Length - 1
            For c = 0 To .Rows(r).Cells.Length - 1
                arr(n, c + 1) = .Rows(r).Cells(c).innerText
            Next
            n = n + 1
        Next
    End With
End Sub
 
Upvote 0
Dựa vào code của bạn
Mã:
Dim arr(1 To 1000, 1 To 6), n As Long
Sub main()
    Dim datefilter As Date, diffmonth As Integer, darr(1 To 1000, 1 To 6)
    Dim startday, endday As Long, i, j, k As Long
    Range("A5:F2000").Clear
    diffmonth = DateDiff("m", Cells(2, 2), Cells(2, 4))
    n = 1
    For k = 0 To diffmonth
        Call HTMLTable("https://www.accuweather.com/vi/vn/thai-binh/356177/march-weather/356177?monyr=", Format(DateAdd("m", k, Cells(2, 2)), "m/d/yyyy"))
    Next
    For i = 1 To UBound(arr)
        If arr(i, 1) <> "" Then
        If Val(Right(Split(arr(i, 1), "/")(0), 2)) = Day(Cells(2, 2)) Then
            startday = i
            Exit For
        End If
        End If
    Next
    For i = UBound(arr) To 1 Step -1
        If arr(i, 1) <> "" Then
        If Val(Right(Split(arr(i, 1), "/")(0), 2)) = Day(Cells(2, 4)) Then
            endday = i
            Exit For
        End If
        End If
    Next
    For i = startday To endday
        j = j + 1
        For k = 1 To 6
            darr(j, k) = arr(i, k)
        Next
    Next
    Range("A5").Resize(1000, 6) = darr
End Sub

Sub HTMLTable(url As String, month As String)
    Dim htm As Object
    Dim Tr As Object
    Dim Td As Object
    Dim Tab1 As Object
    Dim url1 As String
    Dim Colstart As Long
    Dim HTML As Variant
    Dim r, c As Integer
    url1 = url & month & "&view=table"
    Set HTML = CreateObject("htmlfile")
    With CreateObject("msxml2.xmlhttp")
        .Open "GET", url1, False
        .send
        Do While .readystate <> 4
            DoEvents
        Loop
        HTML.Body.Innerhtml = .responseText
    End With
    With HTML.getElementsByTagName("table")(0)
        For r = 1 To .Rows.Length - 1
            For c = 0 To .Rows(r).Cells.Length - 1
                arr(n, c + 1) = .Rows(r).Cells(c).innerText
            Next
            n = n + 1
        Next
    End With
End Sub
Dạ. Em cám ơn @quanluu1989 nhiều ạ
 
Upvote 0
Em có tìm được Code này
PHP:
Option Explicit
Sub HTMLTable()
    Dim htm As Object
    Dim Tr As Object
    Dim Td As Object
    Dim Tab1 As Object
    Dim URL As String
    Dim Colstart As Long
    Dim HTML As Variant
    Dim i As Long
    Dim j As Long
    Dim n As Long
Application.ScreenUpdating = False
URL = VBA.Trim(Sheets(1).Cells(3, 2))
Set HTML = CreateObject("htmlfile")
With CreateObject("msxml2.xmlhttp")
    .Open "GET", URL, False
    .send
    HTML.Body.Innerhtml = .responseText
End With
Colstart = 1
j = 5
i = Colstart
n = 0

For Each Tab1 In HTML.getElementsByTagName("table")
    With HTML.getElementsByTagName("table")(n)
        For Each Tr In .Rows
            For Each Td In Tr.Cells
                Sheet1.Cells(j, i) = Td.innerText
                i = i + 1
            Next Td
            i = Colstart
            j = j + 1
        Next Tr
    End With
    n = n + 1
    i = Colstart
    j = j + 1
Next Tab1
Application.ScreenUpdating = True
End Sub
Nhờ Anh (Chị) sửa dùm em cho Code trên lấy dữ liệu theo tháng mình nhập vào ô B2 và D2 Không ạ

Em Cám ơn các Anh(Chị rất nhiều)
Tôi chỉnh lại code này của bạn chút:
PHP:
Sub getdataweb()
Application.ScreenUpdating = False
Dim hrq As Object, html As Object, url As String, dated As Date, row As Object, cell As Object
Dim i As Long, j As Long, k As Long, nmonth As Long, wf As WorksheetFunction
Set wf = WorksheetFunction
Set hrq = CreateObject("msxml2.xmlhttp")
Set html = CreateObject("htmlfile")
[a6:g65000].Clear
For nmonth = 0 To DateDiff("m", wf.EoMonth([b2], -1) + 1, wf.EoMonth([d2], 0) + 1)
    url = "https://www.accuweather.com/vi/vn/thai-binh/356177/january-weather/356177?monyr=" _
    & Format(wf.EDate([b2], nmonth), "m/d/yyyy") & "&view=table"
    With hrq
        .Open "GET", url, False
        .send
        Do While .readystate <> 4
            DoEvents
        Loop
       html.body.innerhtml = .responsetext
    End With
    For Each row In html.getelementsbytagname("tbody")(0).Rows
        dated = DateValue(Split(Trim(row.Cells(0).innertext), " ")(1) & "/" & Year(wf.EDate([b2], nmonth)))
        If dated >= [b2] And dated <= [d2] Then
            i = i + 1: j = 0
            For Each cell In row.Cells
                j = j + 1
                Cells(i + 5, j) = cell.innertext: Cells(i + 5, 7) = Format(wf.EDate([b2], nmonth), "mm/yyyy")
            Next
        End If
    Next
Next nmonth
[a6].CurrentRegion.Borders.LineStyle = 1
Set hrq = Nothing
Set html = Nothing
Application.ScreenUpdating = True
MsgBox "Done!"
End Sub
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom