nhờ viết dùm code vòng lập lấy data từ ngày đến ngày

Liên hệ QC

ketoan113

Thành viên hoạt động
Tham gia
10/3/07
Bài viết
199
Được thích
30
kính gửi các anh chị
em có mày mò viết vba lấy data từ web cafef.vn về, file em nó như sau:

ô B3 = mã cp
ô F3 = ngày bắt đầu (trong code em ghi là ngaybd)
ô I3 = ngày kết thúc (trong code em nghi là ngaykt)

vd ngày hiện tại em gõ = 10/11/2022, code hiện tại của em sẽ lấy data là ngày bắt đầu (10/11/2022), sau đó copy data em cần sang paste vào sheet1

nhưng em cần lấy data từ ngày đến ngày ( từ ngày bắt đầu đến ngày kết thúc) em không viết viết code sao,

em nhờ anh chị giúp em xíu, viết dùm em code vòng lập với ạ

em cảm ơn các anh chị

p/s: anh anhtuan2939 có đọc được topic của em thì giúp em với nhé, tks a ạ
 

File đính kèm

  • Chi tiet giao dich CK - Copy.xlsm
    135.3 KB · Đọc: 37
Nếu dùng Query thì phải dùng cái này này. Có sẵn ví dụ ngon lành luôn.


Mấy cái lấy dữ liệu web thì cứ Python là tiện nhất.
 
Upvote 0
Nếu dùng Query thì phải dùng cái này này. Có sẵn ví dụ ngon lành luôn.


Mấy cái lấy dữ liệu web thì cứ Python là tiện nhất.
python em ko rành ạ , e bit xíu vba thôi
 
Upvote 0
kính gửi các anh chị
em có mày mò viết vba lấy data từ web cafef.vn về, file em nó như sau:

ô B3 = mã cp
ô F3 = ngày bắt đầu (trong code em ghi là ngaybd)
ô I3 = ngày kết thúc (trong code em nghi là ngaykt)

vd ngày hiện tại em gõ = 10/11/2022, code hiện tại của em sẽ lấy data là ngày bắt đầu (10/11/2022), sau đó copy data em cần sang paste vào sheet1

nhưng em cần lấy data từ ngày đến ngày ( từ ngày bắt đầu đến ngày kết thúc) em không viết viết code sao,

em nhờ anh chị giúp em xíu, viết dùm em code vòng lập với ạ

em cảm ơn các anh chị

p/s: anh anhtuan2939 có đọc được topic của em thì giúp em với nhé, tks a ạ
bác anhtuan2939 ơi giúp em với, tks ạ
 
Upvote 0
Nếu dùng Query thì phải dùng cái này này. Có sẵn ví dụ ngon lành luôn.


Mấy cái lấy dữ liệu web thì cứ Python là tiện nhất.
Anh ơi Python thì nó có ngán cái gì đâu.
 
Upvote 0
Bạn xem thử.
Lưu ý, định dạng ngày bắt đầu và kết thúc.

PHP:
Sub getmcp()
Dim pctCompl As Single
Dim IE As Object
Dim Arr
'----------------------------------------------
    'On Error Resume Next
    Set xmlReq = CreateObject("MSXML2.XMLHTTP")
    Set htmlDoc = CreateObject("HTMLFile")
    Set WS = Sheets("Chitiet")
    Set st = WS.Range("F3")
    Set en = WS.Range("I3")
    Set maCP = WS.Range("B3")
    If st = "" Or en = "" Or maCP = "" Then MsgBox "Nhap day du thong tin": Exit Sub
    lastRow = WS.Cells(Rows.Count, "B").End(xlUp).row
    If lastRow < 5 Then lastRow = 5
    WS.Range("A6:F" & lastRow).ClearContents
    stDate = DateSerial(Year(st), Month(st), Day(st))
    enDate = DateSerial(Year(en), Month(en), Day(en))
    For ngay = stDate To enDate
            lastRow = WS.Cells(Rows.Count, "B").End(xlUp).row
            If lastRow < 5 Then lastRow = 5
            URL = "https://s.cafef.vn/Lich-su-giao-dich-" & UCase(maCP) & "-6.chn?date=" & Format(ngay, "dd/mm/yyyu")
            With xmlReq
                .Open "GET", URL, False
                .Send
            End With
            Do While xmlReq.readyState <> 4 And xmlReq.Status <> 200
            Loop
                htmlDoc.body.innerHTML = xmlReq.responseText
                Set tblData = htmlDoc.getElementById("tblData")
                If tblData Is Nothing Then
                    Debug.Print "Item not found"
                Else
                    ReDim Arr(1 To tblData.Rows.Length, 1 To 5)
                    For i = 1 To tblData.Rows.Length
                        For j = 1 To 5
                            Arr(i, j) = tblData.Rows(i - 1).Cells(j - 1).outerText
                        Next j
                    Next i
                End If
'-------------------------
    WS.Range("A" & lastRow + 1) = ngay
    WS.Range("B" & lastRow + 1).Resize(UBound(Arr), 5) = Arr
'----------------------------------------------
    Next ngay
End Sub
 
Upvote 0
Bạn không thiết lập 'time out', có lỗi kết nỗi thì 'nó' cứ đứng im mãi mãi.
bổ sung vào code dùm em vs bác, tks bác ạ
Bài đã được tự động gộp:

Bạn xem thử.
Lưu ý, định dạng ngày bắt đầu và kết thúc.

PHP:
Sub getmcp()
Dim pctCompl As Single
Dim IE As Object
Dim Arr
'----------------------------------------------
    'On Error Resume Next
    Set xmlReq = CreateObject("MSXML2.XMLHTTP")
    Set htmlDoc = CreateObject("HTMLFile")
    Set WS = Sheets("Chitiet")
    Set st = WS.Range("F3")
    Set en = WS.Range("I3")
    Set maCP = WS.Range("B3")
    If st = "" Or en = "" Or maCP = "" Then MsgBox "Nhap day du thong tin": Exit Sub
    lastRow = WS.Cells(Rows.Count, "B").End(xlUp).row
    If lastRow < 5 Then lastRow = 5
    WS.Range("A6:F" & lastRow).ClearContents
    stDate = DateSerial(Year(st), Month(st), Day(st))
    enDate = DateSerial(Year(en), Month(en), Day(en))
    For ngay = stDate To enDate
            lastRow = WS.Cells(Rows.Count, "B").End(xlUp).row
            If lastRow < 5 Then lastRow = 5
            URL = "https://s.cafef.vn/Lich-su-giao-dich-" & UCase(maCP) & "-6.chn?date=" & Format(ngay, "dd/mm/yyyu")
            With xmlReq
                .Open "GET", URL, False
                .Send
            End With
            Do While xmlReq.readyState <> 4 And xmlReq.Status <> 200
            Loop
                htmlDoc.body.innerHTML = xmlReq.responseText
                Set tblData = htmlDoc.getElementById("tblData")
                If tblData Is Nothing Then
                    Debug.Print "Item not found"
                Else
                    ReDim Arr(1 To tblData.Rows.Length, 1 To 5)
                    For i = 1 To tblData.Rows.Length
                        For j = 1 To 5
                            Arr(i, j) = tblData.Rows(i - 1).Cells(j - 1).outerText
                        Next j
                    Next i
                End If
'-------------------------
    WS.Range("A" & lastRow + 1) = ngay
    WS.Range("B" & lastRow + 1).Resize(UBound(Arr), 5) = Arr
'----------------------------------------------
    Next ngay
End Sub
e lấy phần tổng hợp thôi bác, code bác rất phần chi tiết rồi, phần tổng hợp nó ít dòng ,còn phần chi tiết nhiều dòng quá bác

tks bác
 
Lần chỉnh sửa cuối:
Upvote 0
e lấy phần tổng hợp thôi bác, code bác rất phần chi tiết rồi, phần tổng hợp nó ít dòng ,còn phần chi tiết nhiều dòng quá bác
tks bác
Chỉnh lại lấy thông tin từ bảng tổng hợp.
PHP:
Sub getmcp()
    Dim Arr
    '----------------------------------------------
    'On Error Resume Next
    Set xmlReq = CreateObject("MSXML2.XMLHTTP")
    Set htmlDoc = CreateObject("HTMLFile")
    Set WS = Sheets("Chitiet")
    Set st = WS.Range("F3")
    Set en = WS.Range("I3")
    Set maCP = WS.Range("B3")
    If st = "" Or en = "" Or maCP = "" Then MsgBox "Nhap day du thong tin": Exit Sub
    lastRow = WS.Cells(Rows.Count, "B").End(xlUp).row
    If lastRow < 5 Then lastRow = 5
    WS.Range("A6:D" & lastRow).ClearContents
    stDate = DateSerial(Year(st), Month(st), Day(st))
    enDate = DateSerial(Year(en), Month(en), Day(en))
    For ngay = stDate To enDate
        lastRow = WS.Cells(Rows.Count, "B").End(xlUp).row
        If lastRow < 5 Then lastRow = 5
        If Weekday(ngay) <> vbSaturday And Weekday(ngay) <> vbSunday Then
            URL = "https://s.cafef.vn/Lich-su-giao-dich-" & UCase(maCP) & "-6.chn?date=" & Format(ngay, "dd/mm/yyyu")
            With xmlReq
                .Open "GET", URL, False
                .Send
            End With
            Do While xmlReq.readyState <> 4 And xmlReq.Status <> 200
            Loop
            htmlDoc.body.innerHTML = xmlReq.responseText
            Set tblData = htmlDoc.getElementById("tblStats")        '("tblData")
            If tblData Is Nothing Then
                Debug.Print "Item Not found"
            Else
                ReDim Arr(1 To tblData.Rows.Length, 1 To 3)
                For i = 1 To tblData.Rows.Length
                    For j = 1 To 3
                        Arr(i, j) = tblData.Rows(i - 1).Cells(j - 1).outerText
                    Next j
                Next i
            End If
            '-------------------------
            WS.Range("A" & lastRow + 1) = ngay
            WS.Range("B" & lastRow + 1).Resize(UBound(Arr), 3) = Arr
            '----------------------------------------------
        End If
    Next ngay
End Sub
 

File đính kèm

  • Chi tiet giao dich CK-GPE_rev.xlsm
    142.4 KB · Đọc: 22
Lần chỉnh sửa cuối:
Upvote 0
Chỉnh lại lấy thông tin từ bảng tổng hợp.
PHP:
Sub getmcp()
    Dim pctCompl    As Single
    Dim IE          As Object
    Dim Arr
    '----------------------------------------------
    'On Error Resume Next
    Set xmlReq = CreateObject("MSXML2.XMLHTTP")
    Set htmlDoc = CreateObject("HTMLFile")
    Set WS = Sheets("Chitiet")
    Set st = WS.Range("F3")
    Set en = WS.Range("I3")
    Set maCP = WS.Range("B3")
    If st = "" Or en = "" Or maCP = "" Then MsgBox "Nhap day du thong tin": Exit Sub
    lastRow = WS.Cells(Rows.Count, "B").End(xlUp).row
    If lastRow < 5 Then lastRow = 5
    WS.Range("A6:D" & lastRow).ClearContents
    stDate = DateSerial(Year(st), Month(st), Day(st))
    enDate = DateSerial(Year(en), Month(en), Day(en))
    For ngay = stDate To enDate
        lastRow = WS.Cells(Rows.Count, "B").End(xlUp).row
        If lastRow < 5 Then lastRow = 5
        If Weekday(ngay) <> vbSaturday And Weekday(ngay) <> vbSunday Then
            URL = "https://s.cafef.vn/Lich-su-giao-dich-" & UCase(maCP) & "-6.chn?date=" & Format(ngay, "dd/mm/yyyu")
            With xmlReq
                .Open "GET", URL, False
                .Send
            End With
            Do While xmlReq.readyState <> 4 And xmlReq.Status <> 200
            Loop
            htmlDoc.body.innerHTML = xmlReq.responseText
            Set tblData = htmlDoc.getElementById("tblStats")        '("tblData")
            If tblData Is Nothing Then
                Debug.Print "Item Not found"
            Else
                ReDim Arr(1 To tblData.Rows.Length, 1 To 3)
                For i = 1 To tblData.Rows.Length
                    For j = 1 To 3
                        Arr(i, j) = tblData.Rows(i - 1).Cells(j - 1).outerText
                    Next j
                Next i
            End If
            '-------------------------
            WS.Range("A" & lastRow + 1) = ngay
            WS.Range("B" & lastRow + 1).Resize(UBound(Arr), 3) = Arr
            '----------------------------------------------
        End If
    Next ngay
End Sub
em chào bác huhumalu,

em tải file về và test thấy ok, code tuyệt vời bác ạ

em cảm ơn bác, chúc bác nhiều sức khoẻ nhé bác
 
Lần chỉnh sửa cuối:
Upvote 0
Bài #10 cũng chưa hoàn thiện, vì còn ngày lễ, và chưa kể lỗi timeout, data rỗng.
 
Upvote 0
Sửa lại #10 vì lỗi lặp ngày; Bổ sung ghi chú ngày không giao dịch.
PHP:
Sub getmcp()
    Dim Arr As Variant
    Dim xmlReq As Object, htmlDoc As Object
    'Dim st As String, en As String
    Dim maCP As String
    '----------------------------------------------
    'On Error Resume Next
    Set xmlReq = CreateObject("MSXML2.XMLHTTP")
    Set htmlDoc = CreateObject("HTMLFile")
    Set WS = Sheets("Chitiet")
    Set st = WS.Range("F3")
    Set en = WS.Range("I3")
    maCP = WS.Range("B3")
    If st = "" Or en = "" Or maCP = "" Then MsgBox "Nhap day du thong tin": Exit Sub
    lastRow = WS.Cells(Rows.Count, "B").End(xlUp).row
    If lastRow < 5 Then lastRow = 5
    WS.Range("A6:D" & lastRow).ClearContents
    stDate = DateSerial(Year(st), Month(st), Day(st))
    enDate = DateSerial(Year(en), Month(en), Day(en))
    For ngay = stDate To enDate
        lastRow = WS.Cells(Rows.Count, "B").End(xlUp).row
        If lastRow < 5 Then lastRow = 5
        If Weekday(ngay) <> vbSaturday And Weekday(ngay) <> vbSunday Then
            Url = "https://s.cafef.vn/Lich-su-giao-dich-" & UCase(maCP) & "-6.chn?date=" & Format(ngay, "dd/mm/yyyy")
            With xmlReq
                .Open "GET", Url, False
                .Send
            End With
            Do While xmlReq.readyState <> 4 And xmlReq.Status <> 200
            Loop
            htmlDoc.body.innerHTML = xmlReq.responseText
            If TypeName(htmlDoc.getElementById("tblStats")) = "HTMLTable" Then: Set tblData = htmlDoc.getElementById("tblStats")       '("tblData")
            If tblData Is Nothing Then
                Debug.Print "Item Not found"
                WS.Range("A" & lastRow + 1) = ngay
                WS.Range("B" & lastRow + 1) = "Ngày không giao d" & ChrW(7883) & "ch"
            Else
                ReDim Arr(1 To tblData.Rows.Length, 1 To 3)
                For i = 1 To tblData.Rows.Length
                    For j = 1 To 3
                        Arr(i, j) = tblData.Rows(i - 1).Cells(j - 1).outerText
                    Next j
                Next i
                WS.Range("A" & lastRow + 1) = ngay
                WS.Range("B" & lastRow + 1).Resize(UBound(Arr), 3) = Arr
            End If
            '----------------------------------------------
            Erase Arr
            Set tblData = Nothing
            '----------------------------------------------
        End If
    Next ngay
End Sub
 

File đính kèm

  • Chi tiet giao dich CK-GPE_rev2.xlsm
    164.1 KB · Đọc: 14
Upvote 0
Bài #10 cũng chưa hoàn thiện, vì còn ngày lễ, và chưa kể lỗi timeout, data rỗng.

1.
#10 là sao bác nhỉ??

2.
các ngày không giao dịch có ngày lễ (2/9; 30/4; tết tây, giỗ tổ hùng vương, t7, cn, ngày nghỉ lễ bù...)
những ngày ko có giao dịch thì ko có data hiển thị cũng dc nè bác

vd e gõ mà CTG , ngày 12/11/2022 đến 13/11/2022 : ko có giao dịch nên ko có data

3.
có lỗi xảy ra nhé bác, vd em gõ ngày hôm nay 15/11/2022 (tất nhien là phải gõ khi chưa có giao dịch, chưa có data, tt ck giao dịch từ 9h sáng) thì ngày 15/11/2022 nó lại lấy data ngày 14/11/2022
bác xem fix dc lỗi ko ạ? tks bác
 

File đính kèm

  • Chi tiet giao dich CK-GPE_rev2.xlsm
    143.2 KB · Đọc: 2
Lần chỉnh sửa cuối:
Upvote 0
Update 15/11 (rev3)
+ Bổ sung hyperlink dẫn đến Website --> kiểm tra đối chiếu.
+ Bỏ dòng header khối dữ liệu hàng ngày.
+ Sửa lỗi lặp ngày.
+ Cập nhật kiểm tra giờ mở phiên (09:00AM)
 

File đính kèm

  • Chi tiet giao dich CK-GPE_rev3.xlsm
    144.6 KB · Đọc: 9
Upvote 0
Update 15/11 (rev3)
+ Bổ sung hyperlink dẫn đến Website --> kiểm tra đối chiếu.
+ Bỏ dòng header khối dữ liệu hàng ngày.
+ Sửa lỗi lặp ngày.
+ Cập nhật kiểm tra giờ mở phiên (09:00AM)
hi bác huhumalu
em chân thành cảm ơn bác
em test thấy vd em gõ ngày bắt đầu = 01/01/2022 thì code bị lỗi ạ
bác check dùm em với

cảm ơn bác
 

File đính kèm

  • Chi tiet giao dich CK-GPE_rev3.xlsm
    141.1 KB · Đọc: 2
Upvote 0
PHP:
Sub getmcp()
    Dim Arr As Variant
    Dim xmlReq As Object, htmlDoc As Object
    'Dim st As String, en As String
    Dim maCP As String
    '----------------------------------------------
    'On Error Resume Next
    Set xmlReq = CreateObject("MSXML2.XMLHTTP")
    Set htmlDoc = CreateObject("HTMLFile")
    Set WS = Sheets("Chitiet")
    Set st = WS.Range("F3")
    Set en = WS.Range("I3")
    dtToday = DateSerial(Year(Date), Month(Date), Day(Date))
    maCP = WS.Range("B3")
    If st = "" Or en = "" Or maCP = "" Then MsgBox "Nhap day du thong tin": Exit Sub
    lastRow = WS.Cells(Rows.Count, "B").End(xlUp).row
    If lastRow < 5 Then lastRow = 5
    WS.Range("A6:D" & lastRow).ClearContents
    stDate = DateSerial(Year(st), Month(st), Day(st))
    enDate = DateSerial(Year(en), Month(en), Day(en))
    For ngay = stDate To enDate
        lastRow = WS.Cells(Rows.Count, "B").End(xlUp).row
        If lastRow < 5 Then lastRow = 5
        If ngay < dtToday Or (ngay = dtToday And TimeValue(Now) > TimeValue("09:00:00")) Then
            Url = "https://s.cafef.vn/Lich-su-giao-dich-" & UCase(maCP) & "-6.chn?date=" & Format(ngay, "dd/mm/yyyy")
            With xmlReq
                .Open "GET", Url, False
                .Send
            End With
            Do While xmlReq.readyState <> 4 And xmlReq.Status <> 200
            Loop
            htmlDoc.body.innerHTML = xmlReq.responseText
            WS.Range("A" & lastRow + 1) = "=HYPERLINK(""" & Url & """,""" & ngay & """)"
            If TypeName(htmlDoc.getElementById("tblStats")) <> "HTMLTable" Or Weekday(ngay) = vbSaturday Or Weekday(ngay) = vbSunday Then
                Debug.Print "Item Not found"
                WS.Range("B" & lastRow + 1) = "Ngày không giao d" & ChrW(7883) & "ch"
            Else
                Set tblData = htmlDoc.getElementById("tblStats")       '("tblData")
                ReDim Arr(1 To tblData.Rows.Length - 1, 1 To 3)
                For i = 1 To tblData.Rows.Length - 1
                    For j = 1 To 3
                        Arr(i, j) = tblData.Rows(i).Cells(j - 1).outerText
                    Next j
                Next i
                WS.Range("B" & lastRow + 1).Resize(UBound(Arr), 3) = Arr
                Erase Arr
            End If
            '----------------------------------------------
            
            Set tblData = Nothing
            '----------------------------------------------
        End If
    Next ngay
End Sub

Bạn tải lại file đính kèm.
 

File đính kèm

  • Chi tiet giao dich CK-GPE_rev4.xlsm
    147.6 KB · Đọc: 26
Upvote 0
PHP:
Sub getmcp()
    Dim Arr As Variant
    Dim xmlReq As Object, htmlDoc As Object
    'Dim st As String, en As String
    Dim maCP As String
    '----------------------------------------------
    'On Error Resume Next
    Set xmlReq = CreateObject("MSXML2.XMLHTTP")
    Set htmlDoc = CreateObject("HTMLFile")
    Set WS = Sheets("Chitiet")
    Set st = WS.Range("F3")
    Set en = WS.Range("I3")
    dtToday = DateSerial(Year(Date), Month(Date), Day(Date))
    maCP = WS.Range("B3")
    If st = "" Or en = "" Or maCP = "" Then MsgBox "Nhap day du thong tin": Exit Sub
    lastRow = WS.Cells(Rows.Count, "B").End(xlUp).row
    If lastRow < 5 Then lastRow = 5
    WS.Range("A6:D" & lastRow).ClearContents
    stDate = DateSerial(Year(st), Month(st), Day(st))
    enDate = DateSerial(Year(en), Month(en), Day(en))
    For ngay = stDate To enDate
        lastRow = WS.Cells(Rows.Count, "B").End(xlUp).row
        If lastRow < 5 Then lastRow = 5
        If ngay < dtToday Or (ngay = dtToday And TimeValue(Now) > TimeValue("09:00:00")) Then
            Url = "https://s.cafef.vn/Lich-su-giao-dich-" & UCase(maCP) & "-6.chn?date=" & Format(ngay, "dd/mm/yyyy")
            With xmlReq
                .Open "GET", Url, False
                .Send
            End With
            Do While xmlReq.readyState <> 4 And xmlReq.Status <> 200
            Loop
            htmlDoc.body.innerHTML = xmlReq.responseText
            WS.Range("A" & lastRow + 1) = "=HYPERLINK(""" & Url & """,""" & ngay & """)"
            If TypeName(htmlDoc.getElementById("tblStats")) <> "HTMLTable" Or Weekday(ngay) = vbSaturday Or Weekday(ngay) = vbSunday Then
                Debug.Print "Item Not found"
                WS.Range("B" & lastRow + 1) = "Ngày không giao d" & ChrW(7883) & "ch"
            Else
                Set tblData = htmlDoc.getElementById("tblStats")       '("tblData")
                ReDim Arr(1 To tblData.Rows.Length - 1, 1 To 3)
                For i = 1 To tblData.Rows.Length - 1
                    For j = 1 To 3
                        Arr(i, j) = tblData.Rows(i).Cells(j - 1).outerText
                    Next j
                Next i
                WS.Range("B" & lastRow + 1).Resize(UBound(Arr), 3) = Arr
                Erase Arr
            End If
            '----------------------------------------------
           
            Set tblData = Nothing
            '----------------------------------------------
        End If
    Next ngay
End Sub

Bạn tải lại file đính kèm.
cột ngày (Cột A) bác định dạng cho em chữ nghiêng luôn dc ko ạ?

cảm ơn bác
 

File đính kèm

  • Chi tiet giao dich CK-GPE_rev4.xlsm
    145.1 KB · Đọc: 9
Upvote 0
Bạn tự định dạng nguyên cột A được mà, đâu có nhất thiết phải can thiệp bằng công cụ khác.
Quan trọng bạn cứ chạy thử, các trường hợp, xem thử còn lỗi gì nữa không để chỉnh. Còn lại format này nọ làm trong bảng tính cũng được.
 
Upvote 0
Bạn tự định dạng nguyên cột A được mà, đâu có nhất thiết phải can thiệp bằng công cụ khác.
Quan trọng bạn cứ chạy thử, các trường hợp, xem thử còn lỗi gì nữa không để chỉnh. Còn lại format này nọ làm trong bảng tính cũng được.
dạ vâng
để em test xem có lỗi j nữa không, có j em báo
tks bác huhumalu nhiều ạ
 
Upvote 0
Web KT

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

Back
Top Bottom