nhờ viết dùm code vòng lập lấy data từ ngày đến ngày (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

ketoan113

Thành viên thường trực
Tham gia
10/3/07
Bài viết
211
Được thích
33
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

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

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

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

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

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

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

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

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
Nếu dùng code lấy dữ liệu từ web, chi bằng lấy bằng M-code của Power query.

PHP:
let
    MaGD= Excel.CurrentWorkbook(){[Name = "MaGD"]}[Content][Column1]{0},
    DFrom = Excel.CurrentWorkbook(){[Name = "DFrom"]}[Content][Column1]{0},
    DTo = Excel.CurrentWorkbook(){[Name = "DTo"]}[Content][Column1]{0},
    Initialweb = "https://s.cafef.vn/Lich-su-giao-dich-",
    EndWeb ="-6.chn?date=",
    List0 = {0..Number.From(DTo) - Number.From(DFrom)},
    List1 = {Number.From(DFrom)..Number.From(DTo)},
   
    Source = List.Transform(List0, (d) =>
    let
        D1 = Date.ToText(Date.From(List1{d}),"dd/MM/yyyy"),
        WebAdd = Initialweb & MaGD & EndWeb & D1,
        Source0 = Web.Page(Web.Contents(WebAdd))[Data]{0},
        Source1 = Table.AddColumn(Source0, "Date", each Date.From(List1{d}))
    in Source1),
    ColumnList = Table.ColumnNames(Source{0}),
    SourceN= Table.FromList(Source,Splitter.SplitByNothing()),
    Result =Table.ExpandTableColumn(SourceN,"Column1",ColumnList),
    ReplaceP = Table.ReplaceValue(Result," (%)","",Replacer.ReplaceText,{"Tỷ trọng"}),
    DataType = Table.TransformColumnTypes(ReplaceP,{{"Giá", type number}, {"Khối lượng", type number}, {"Date", type date}, {"Tỷ trọng", type number}})

in
    DataType

Tôi cho rằng Power query lấy đủ dữ liệu hơn VBA code, lại còn có thể thêm cột ngày

1668502026135.png
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Nếu dùng code lấy dữ liệu từ web, chi bằng lấy bằng M-code của Power query.

PHP:
let
    MaGD= Excel.CurrentWorkbook(){[Name = "MaGD"]}[Content][Column1]{0},
    DFrom = Excel.CurrentWorkbook(){[Name = "DFrom"]}[Content][Column1]{0},
    DTo = Excel.CurrentWorkbook(){[Name = "DTo"]}[Content][Column1]{0},
    Initialweb = "https://s.cafef.vn/Lich-su-giao-dich-",
    EndWeb ="-6.chn?date=",
    List0 = {0..Number.From(DTo) - Number.From(DFrom)},
    List1 = {Number.From(DFrom)..Number.From(DTo)},
  
    Source = List.Transform(List0, (d) =>
    let
        D1 = Date.ToText(Date.From(List1{d}),"dd/MM/yyyy"),
        WebAdd = Initialweb & MaGD & EndWeb & D1,
        Source0 = Web.Page(Web.Contents(WebAdd))[Data]{0},
        Source1 = Table.AddColumn(Source0, "Date", each Date.From(List1{d}))
    in Source1),
    ColumnList = Table.ColumnNames(Source{0}),
    SourceN= Table.FromList(Source,Splitter.SplitByNothing()),
    Result =Table.ExpandTableColumn(SourceN,"Column1",ColumnList),
    ReplaceP = Table.ReplaceValue(Result," (%)","",Replacer.ReplaceText,{"Tỷ trọng"}),
    DataType = Table.TransformColumnTypes(ReplaceP,{{"Giá", type number}, {"Khối lượng", type number}, {"Date", type date}, {"Tỷ trọng", type number}})

in
    DataType

Tôi cho rằng Power query lấy đủ dữ liệu hơn VBA code, lại còn có thể thêm cột ngày

View attachment 283367
1668502663406.png


file bác em tải về check thấy báo lỗi bác ơi
tks
 
Upvote 0
Anh gửi lại file giúp với. Em load file bị lỗi.
Cái M-code của Power query là em hoàn toàn không có biết gì.
 
Upvote 0
Bạn hiểu mấy từ ấy hả? Chúc mừng đã đạt cảnh giới. :p
Cảnh giới có sẵn :P :P, chỉ là có khó chịu hay không thôi.
em chạy nó cũng ra như vây
file này ko ổn bằng của bác huhumalu ạ
Bạn thử cả 2 file chưa? Lấy xlsx này, còn xlsm đã sửa lỗi ở trên. Lỗi xảy ra do dùng file của bạn ở bài 1 và viết power query, phải lưu mở lên lại 2, 3 lần để excel tự sửa lỗi
 

File đính kèm

Upvote 0
Cảnh giới có sẵn :p :p, chỉ là có khó chịu hay không thôi.

Bạn thử cả 2 file chưa? Lấy xlsx này, còn xlsm đã sửa lỗi ở trên. Lỗi xảy ra do dùng file của bạn ở bài 1 và viết power query, phải lưu mở lên l1668557379527.pngại 2, 3 lần để excel tự sửa lỗi
em chạy nó báo gì vậy bác ??
Bài đã được tự động gộp:

Cảnh giới có sẵn :p :p, chỉ là có khó chịu hay không thôi.

Bạn thử cả 2 file chưa? Lấy xlsx này, còn xlsm đã sửa lỗi ở trên. Lỗi xảy ra do dùng file của bạn ở bài 1 và viết power query, phải lưu mở lên lại 2, 3 lần để excel tự sửa lỗi
1668557650257.png
em gõ ngày không có giao dịch (vd ngày 12/11/2022 ko giao dịch) thì báo lỗi ko lấy dược ạ

nếu được chỉnh dùm em cột date để sang bên trái (cot A) được ko ạ? em cảm ơn bác
 
Lần chỉnh sửa cuối:
Upvote 0
Lấy lại file. Sửa được lỗi khi ngày bắt đầu là ngày không giao dịch, chưa sửa được trường hợp ngày cuối. Có gì nếu nó báo lỗi chọn dư vài ngày
Cứ thử với mã công ty khác
PHP:
let
    MaGD= Excel.CurrentWorkbook(){[Name = "MaGD"]}[Content][Column1]{0},
    DFrom = Excel.CurrentWorkbook(){[Name = "DFrom"]}[Content][Column1]{0},
    DTo = Excel.CurrentWorkbook(){[Name = "DTo"]}[Content][Column1]{0},
    Initialweb = "https://s.cafef.vn/Lich-su-giao-dich-",
    EndWeb ="-6.chn?date=",
    List0 = {0..Number.From(DTo) - Number.From(DFrom)},
    List1 = {Number.From(DFrom)..Number.From(DTo)},
   
    Source = List.Transform(List0, (d) =>
    let
        D1 = Date.ToText(Date.From(List1{d}),"dd/MM/yyyy"),
        WebAdd = Initialweb & MaGD & EndWeb & D1,
        Source0 = Web.Page(Web.Contents(WebAdd))[Data]{0},
        Source1 = Table.AddColumn(Source0, "Date", each Date.From(List1{d}))
    in Source1),
    ColumnList = Table.ColumnNames(Source{List.Count(Source)-1}),
    SourceN= Table.FromList(Source,Splitter.SplitByNothing()),
    Result =Table.ExpandTableColumn(SourceN,"Column1",ColumnList),
    ReplaceP = Table.ReplaceValue(Result," (%)","",Replacer.ReplaceText,{"Tỷ trọng"}),
    ReplacePr = Table.ReplaceValue(ReplaceP,"Giá",null,Replacer.ReplaceValue,{"Giá"}),
    ReplaceTT = Table.ReplaceValue(ReplacePr,"Tỷ trọng",null,Replacer.ReplaceValue,{"Tỷ trọng"}),
    DataType = Table.TransformColumnTypes(ReplaceTT,{{"Giá", type number}, {"Khối lượng", type number}, {"Date", type date}, {"Tỷ trọng", type number}}),
    Reorder = Table.ReorderColumns(DataType,{"Date", "Giá", "Khối lượng", "Tỷ trọng"})

in
    Reorder
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Lấy lại file. Sửa được lỗi khi ngày bắt đầu là ngày không giao dịch, chưa sửa được trường hợp ngày cuối. Có gì nếu nó báo lỗi chọn dư vài ngày
Cứ thử với mã công ty khác
Do cái web này :
+ Ngày không giao dịch nó vẫn ra cái header chỉ không có dữ liệu.
+ Ngày hiện tại (hôm nay) trước 9h sáng (giờ mở phiên) thì vẫn lấy kết quả của ngày trước đó.
Em cũng phải sửa đi sửa lại mấy lần.
 
Upvote 0
tks = cám ơn bác

tôi báo cáo admin về comment của bác rồi nhá

bác rảnh quá
Tôi reject cái báo cáo của bạn. Trong bài #34 tôi có ghi là "có khó chịu hay không", nghĩa là nếu bình thường tôi sẽ khó chịu khi bài viết được viết tắt kiển chat chit như ko, dc, ntn, ... hoặc chêm từ tiếng Anh như tks, hi, thank, ...
Chêm tiếng Anh là không lịch sự đối với người Việt, và viết tắt không định nghĩa trước thì người ta có quyền đoán nghĩa. Khi đoán nghĩa sai thì người hỏi bị thiệt thòi. Huống hồ kiểu chat chit là vi phạm nội quy.
 
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.

Thực ra vụ lấy dữ liệu từ web thì vba cũng đẳng cấp lắm đó, xử lý vào file cũng đơn giản hơn việc dùng python
 
Upvote 0
Tôi reject cái báo cáo của bạn. Trong bài #34 tôi có ghi là "có khó chịu hay không", nghĩa là nếu bình thường tôi sẽ khó chịu khi bài viết được viết tắt kiển chat chit như ko, dc, ntn, ... hoặc chêm từ tiếng Anh như tks, hi, thank, ...
Chêm tiếng Anh là không lịch sự đối với người Việt, và viết tắt không định nghĩa trước thì người ta có quyền đoán nghĩa. Khi đoán nghĩa sai thì người hỏi bị thiệt thòi. Huống hồ kiểu chat chit là vi phạm nội quy.
kính gửi các bác

do em không biết nên vi phạm nên các bác thông cảm bỏ qua cho em ạ
em xin rút kinh nghiệm
Bài đã được tự động gộp:

Thực ra vụ lấy dữ liệu từ web thì vba cũng đẳng cấp lắm đó, xử lý vào file cũng đơn giản hơn việc dùng python
vba excel hay mà bác
hihi
Bài đã được tự động gộp:

Do cái web này :
+ Ngày không giao dịch nó vẫn ra cái header chỉ không có dữ liệu.
+ Ngày hiện tại (hôm nay) trước 9h sáng (giờ mở phiên) thì vẫn lấy kết quả của ngày trước đó.
Em cũng phải sửa đi sửa lại mấy lần.
đúng rồi bác
file của bác huhumalu giải quyết được các vấn đề đó ạ
 
Lần chỉnh sửa cuối:
Upvote 0
Lấy lại file. Sửa được lỗi khi ngày bắt đầu là ngày không giao dịch, chưa sửa được trường hợp ngày cuối. Có gì nếu nó báo lỗi chọn dư vài ngày
Cứ thử với mã công ty khác
PHP:
let
    MaGD= Excel.CurrentWorkbook(){[Name = "MaGD"]}[Content][Column1]{0},
    DFrom = Excel.CurrentWorkbook(){[Name = "DFrom"]}[Content][Column1]{0},
    DTo = Excel.CurrentWorkbook(){[Name = "DTo"]}[Content][Column1]{0},
    Initialweb = "https://s.cafef.vn/Lich-su-giao-dich-",
    EndWeb ="-6.chn?date=",
    List0 = {0..Number.From(DTo) - Number.From(DFrom)},
    List1 = {Number.From(DFrom)..Number.From(DTo)},
 
    Source = List.Transform(List0, (d) =>
    let
        D1 = Date.ToText(Date.From(List1{d}),"dd/MM/yyyy"),
        WebAdd = Initialweb & MaGD & EndWeb & D1,
        Source0 = Web.Page(Web.Contents(WebAdd))[Data]{0},
        Source1 = Table.AddColumn(Source0, "Date", each Date.From(List1{d}))
    in Source1),
    ColumnList = Table.ColumnNames(Source{List.Count(Source)-1}),
    SourceN= Table.FromList(Source,Splitter.SplitByNothing()),
    Result =Table.ExpandTableColumn(SourceN,"Column1",ColumnList),
    ReplaceP = Table.ReplaceValue(Result," (%)","",Replacer.ReplaceText,{"Tỷ trọng"}),
    ReplacePr = Table.ReplaceValue(ReplaceP,"Giá",null,Replacer.ReplaceValue,{"Giá"}),
    ReplaceTT = Table.ReplaceValue(ReplacePr,"Tỷ trọng",null,Replacer.ReplaceValue,{"Tỷ trọng"}),
    DataType = Table.TransformColumnTypes(ReplaceTT,{{"Giá", type number}, {"Khối lượng", type number}, {"Date", type date}, {"Tỷ trọng", type number}}),
    Reorder = Table.ReorderColumns(DataType,{"Date", "Giá", "Khối lượng", "Tỷ trọng"})

in
    Reorder
em thấy file này có vài điểm như sau ạ:
1. dùng cách của bác @ptm0412 cũng hay, dùng power query thì trong quá trình lấy data excel vẫn có thể làm việc khác

tuy nhiên em thấy lấy data có vẻ hơi chậm hơn file của bác @huhumalu

2. file của bác @huhumalu thì sửa được các lỗi em thấy phát sinh, file của bác @ptm0412 thì chưa sửa được lỗi trường hợp ngày cuối

em chân thành cảm ơn 2 bác @ptm0412, @huhumalu
 
Upvote 0
file của bác @ptm0412 thì chưa sửa được lỗi trường hợp ngày cuối
Được nọ thì mất kia: Sửa lỗi không có dữ liệu ngày đầu ngày cuối thì ngày lỗi lại không xuất hiện 1 dòng trống. Trang web này kỳ ở chỗ không có dữ liệu thì số cột và tên cột lại khác so với những ngày có dữ liệu.
PHP:
let
    MaGD= Excel.CurrentWorkbook(){[Name = "MaGD"]}[Content][Column1]{0},
    DFrom = Excel.CurrentWorkbook(){[Name = "DFrom"]}[Content][Column1]{0},
    DTo = Excel.CurrentWorkbook(){[Name = "DTo"]}[Content][Column1]{0},
    Initialweb = "https://s.cafef.vn/Lich-su-giao-dich-",
    EndWeb ="-6.chn?date=",
    List0 = {0..Number.From(DTo) - Number.From(DFrom)},
    List1 = {Number.From(DFrom)..Number.From(DTo)},
    
    Source = List.Transform(List0, (d) =>
    let
        D1 = Date.ToText(Date.From(List1{d}),"dd/MM/yyyy"),
        WebAdd = Initialweb & MaGD & EndWeb & D1,
        Source0 = Web.Page(Web.Contents(WebAdd))[Data]{0},
        Source1 = Table.AddColumn(Source0, "Date", each Date.From(List1{d}))
    in Source1),
    SourceN= Table.FromList(Source,Splitter.SplitByNothing()),
    SourceCheck = Table.AddColumn(SourceN,"Check", each if
    List.Count(Table.ColumnNames([Column1])) = 4 then 1 else 2),
    SourceFilter = Table.SelectColumns(Table.SelectRows(SourceCheck, each [Check] = 1),{"Column1"}),
    ColumnList = Table.ColumnNames(SourceFilter[Column1]{0}),
    Result =Table.ExpandTableColumn(SourceFilter,"Column1",ColumnList),
    ReplaceP = Table.ReplaceValue(Result," (%)","",Replacer.ReplaceText,{"Tỷ trọng"}),
    ReplaceTT = Table.ReplaceValue(ReplaceP,"Tỷ trọng",null,Replacer.ReplaceValue,{"Tỷ trọng"}),
    DataType = Table.TransformColumnTypes(ReplaceTT,{{"Giá", type number}, {"Khối lượng", type number}, {"Date", type date}, {"Tỷ trọng", type number}}),
    Reorder = Table.ReorderColumns(DataType,{"Date", "Giá", "Khối lượng", "Tỷ trọng"})

in
    Reorder
 
Upvote 0
Được nọ thì mất kia: Sửa lỗi không có dữ liệu ngày đầu ngày cuối thì ngày lỗi lại không xuất hiện 1 dòng trống. Trang web này kỳ ở chỗ không có dữ liệu thì số cột và tên cột lại khác so với những ngày có dữ liệu.
PHP:
let
    MaGD= Excel.CurrentWorkbook(){[Name = "MaGD"]}[Content][Column1]{0},
    DFrom = Excel.CurrentWorkbook(){[Name = "DFrom"]}[Content][Column1]{0},
    DTo = Excel.CurrentWorkbook(){[Name = "DTo"]}[Content][Column1]{0},
    Initialweb = "https://s.cafef.vn/Lich-su-giao-dich-",
    EndWeb ="-6.chn?date=",
    List0 = {0..Number.From(DTo) - Number.From(DFrom)},
    List1 = {Number.From(DFrom)..Number.From(DTo)},
   
    Source = List.Transform(List0, (d) =>
    let
        D1 = Date.ToText(Date.From(List1{d}),"dd/MM/yyyy"),
        WebAdd = Initialweb & MaGD & EndWeb & D1,
        Source0 = Web.Page(Web.Contents(WebAdd))[Data]{0},
        Source1 = Table.AddColumn(Source0, "Date", each Date.From(List1{d}))
    in Source1),
    SourceN= Table.FromList(Source,Splitter.SplitByNothing()),
    SourceCheck = Table.AddColumn(SourceN,"Check", each if
    List.Count(Table.ColumnNames([Column1])) = 4 then 1 else 2),
    SourceFilter = Table.SelectColumns(Table.SelectRows(SourceCheck, each [Check] = 1),{"Column1"}),
    ColumnList = Table.ColumnNames(SourceFilter[Column1]{0}),
    Result =Table.ExpandTableColumn(SourceFilter,"Column1",ColumnList),
    ReplaceP = Table.ReplaceValue(Result," (%)","",Replacer.ReplaceText,{"Tỷ trọng"}),
    ReplaceTT = Table.ReplaceValue(ReplaceP,"Tỷ trọng",null,Replacer.ReplaceValue,{"Tỷ trọng"}),
    DataType = Table.TransformColumnTypes(ReplaceTT,{{"Giá", type number}, {"Khối lượng", type number}, {"Date", type date}, {"Tỷ trọng", type number}}),
    Reorder = Table.ReorderColumns(DataType,{"Date", "Giá", "Khối lượng", "Tỷ trọng"})

in
    Reorder
bác @ptm0412 cho em hỏi cái code này bác viết để vào đâu để nó chạy vậy? em cảm ơn bác
 
Upvote 0
Nếu dùng code lấy dữ liệu từ web, chi bằng lấy bằng M-code của Power query.

PHP:
let
    MaGD= Excel.CurrentWorkbook(){[Name = "MaGD"]}[Content][Column1]{0},
    DFrom = Excel.CurrentWorkbook(){[Name = "DFrom"]}[Content][Column1]{0},
    DTo = Excel.CurrentWorkbook(){[Name = "DTo"]}[Content][Column1]{0},
    Initialweb = "https://s.cafef.vn/Lich-su-giao-dich-",
    EndWeb ="-6.chn?date=",
    List0 = {0..Number.From(DTo) - Number.From(DFrom)},
    List1 = {Number.From(DFrom)..Number.From(DTo)},
 
    Source = List.Transform(List0, (d) =>
    let
        D1 = Date.ToText(Date.From(List1{d}),"dd/MM/yyyy"),
        WebAdd = Initialweb & MaGD & EndWeb & D1,
        Source0 = Web.Page(Web.Contents(WebAdd))[Data]{0},
        Source1 = Table.AddColumn(Source0, "Date", each Date.From(List1{d}))
    in Source1),
    ColumnList = Table.ColumnNames(Source{0}),
    SourceN= Table.FromList(Source,Splitter.SplitByNothing()),
    Result =Table.ExpandTableColumn(SourceN,"Column1",ColumnList),
    ReplaceP = Table.ReplaceValue(Result," (%)","",Replacer.ReplaceText,{"Tỷ trọng"}),
    DataType = Table.TransformColumnTypes(ReplaceP,{{"Giá", type number}, {"Khối lượng", type number}, {"Date", type date}, {"Tỷ trọng", type number}})

in
    DataType

Tôi cho rằng Power query lấy đủ dữ liệu hơn VBA code, lại còn có thể thêm cột ngày

View attachment 283367
kính gửi bác @ptm0412 , nhân tiện nói lấy data từ web bằng power query, em đang làm 1 file lấy data từ google sheet về excel nhưng đang vướng 1 số mong bác giúp em với ạ

1. đặt dữ liệu tại ô A6

2. trong lúc edit data lấy về, sao em không xoá được dòng 1 bác nhỉ (dòng 1 là column1, column2....), làm sao xoá được dòng 1 ạ?

3. data sẽ lấy theo mã cổ phiếu (trong file là ô B4), làm sao để link mã cổ phiếu tại 1 ô trên excel với google sheets bác nhỉ? code M-code bác viết cho power query em thấy bác làm được ạ

nếu được bác giải thích chi tiết dùm em thắc mắc em hỏi với ạ, tại vì em sẽ áp dụng cho các file khác ( em còn dự định làm nhiều file lấy data từ google sheet về excel nữa ạ)

bác coi file đính kèm dùm em ạ

em cảm ơn bác @ptm0412


link youtube em tham khảo:
Liên kết: https://www.youtube.com/watch?v=cF06J-yhhas
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
kính gửi bác @ptm0412 , nhân tiện nói lấy data từ web bằng power query, em đang làm 1 file lấy data từ google sheet về excel nhưng đang vướng 1 số mong bác giúp em với ạ
1. ô A6: Thì cứ chèn bên trên 5 dòng
2. Dùng hàm Table.Skip
3. Đặt 1 name là 1 ô chứa mã CP
PHP:
let
    MaCP= Excel.CurrentWorkbook(){[Name = "MaCP"]}[Content][Column1]{0},
    Source = Excel.Workbook(Web.Contents("https://docs.google.com/spreadsheets/d/1ix3Fphw_qdIF6kEj3UYiIVemmkpGZpyRGkVWB_xw5tg/export?format=xlsx"), null, true),
    Source1 = Source{[Item="dinh gia cp",Kind="Sheet"]}[Data],
    Source2 = Table.PromoteHeaders(Table.Skip(Source1,3)),
    Types= Table.TransformColumnTypes(Source2,{{"Data Reportprice", type number}, {"Data Targetprice", type number}, {"Data Avgtargetprice", type number}, {"Target Discount 10%", type number}, {"Target Discount 15%", type number}, {"Target Discount 20%", type number}}),
    FilterCP = Table.SelectRows(Types, each ([Data Code] = MaCP))
in
    FilterCP
 
Upvote 0
1. ô A6: Thì cứ chèn bên trên 5 dòng
2. Dùng hàm Table.Skip
3. Đặt 1 name là 1 ô chứa mã CP
PHP:
let
    MaCP= Excel.CurrentWorkbook(){[Name = "MaCP"]}[Content][Column1]{0},
    Source = Excel.Workbook(Web.Contents("https://docs.google.com/spreadsheets/d/1ix3Fphw_qdIF6kEj3UYiIVemmkpGZpyRGkVWB_xw5tg/export?format=xlsx"), null, true),
    Source1 = Source{[Item="dinh gia cp",Kind="Sheet"]}[Data],
    Source2 = Table.PromoteHeaders(Table.Skip(Source1,3)),
    Types= Table.TransformColumnTypes(Source2,{{"Data Reportprice", type number}, {"Data Targetprice", type number}, {"Data Avgtargetprice", type number}, {"Target Discount 10%", type number}, {"Target Discount 15%", type number}, {"Target Discount 20%", type number}}),
    FilterCP = Table.SelectRows(Types, each ([Data Code] = MaCP))
in
    FilterCP
code này để vào đâu, và code hoạt động sao vậy bác? em chưa biết , em cảm ơn bác

bị lỗi bác ơi @ptm0412

1668863421233.png
 
Lần chỉnh sửa cuối:
Upvote 0
Lấy từ GG Sheet chi bằng lấy trực tiếp từ Web (vì GG Sheet lấy từ web, phải refresh 2 lần, lấy từ GG Sheet còn phải xóa bớt dòng thừa)
Các tùy chọn:
1. Chọn mã (ô C3), nếu bỏ trống lấy hết các mã
2. Chọn xem báo cáo từ ngày (ô E3): ngày của năm càng cũ thì càng nhiều dữ liệu
3. Chọn số dòng tối đa sẽ lấy (ô H3): Lấy hết mã, xem từ 01/01/2010 khoảng trên 6000 dòng, chỉ chọn 1 mã sẽ có khoảng dưới 100 hoặc 200 dòng

Không chọn mã để lấy hết (trên 6000 dòng)

1668879838658.png

Chọn 1 mã và 200 dòng

1668879756881.png

PHP:
let
        MaCP= Excel.CurrentWorkbook(){[Name = "Ma"]}[Content][Column1]{0},
        ReportDate = Date.From(Excel.CurrentWorkbook(){[Name = "DReport"]}[Content][Column1]{0}),
        RowsData = Number.ToText(Excel.CurrentWorkbook(){[Name = "RowsData"]}[Content][Column1]{0}),
        Source = Json.Document(Web.Contents("https://finfo-api.vndirect.com.vn/v4/recommendations?" & (if
            MaCP <> null then "q=code:" & MaCP else "") & "~reportDate:gte:" & Date.ToText(ReportDate,"yyyy-MM-dd") & "&size=" & RowsData & "&sort=reportDate:ASC")),
    List1 = Record.ToTable(Source)[Value]{0},
    Table1 = Table.FromList(List1, Splitter.SplitByNothing()),
    Expanded = Table.ExpandRecordColumn(Table1, "Column1", {"code", "firm", "type", "reportDate", "source", "analyst", "reportPrice", "targetPrice", "avgTargetPrice"}),
    Types = Table.TransformColumnTypes(Expanded,{{"reportDate", type date}, {"reportPrice", type number}, {"targetPrice", type number}, {"avgTargetPrice", type number}})
in
    Types
 

File đính kèm

Upvote 0
Lấy từ GG Sheet chi bằng lấy trực tiếp từ Web (vì GG Sheet lấy từ web, phải refresh 2 lần, lấy từ GG Sheet còn phải xóa bớt dòng thừa)
Các tùy chọn:
1. Chọn mã (ô C3), nếu bỏ trống lấy hết các mã
2. Chọn xem báo cáo từ ngày (ô E3): ngày của năm càng cũ thì càng nhiều dữ liệu
3. Chọn số dòng tối đa sẽ lấy (ô H3): Lấy hết mã, xem từ 01/01/2010 khoảng trên 6000 dòng, chỉ chọn 1 mã sẽ có khoảng dưới 100 hoặc 200 dòng

Không chọn mã để lấy hết (trên 6000 dòng)

View attachment 283614

Chọn 1 mã và 200 dòng

View attachment 283613

PHP:
let
        MaCP= Excel.CurrentWorkbook(){[Name = "Ma"]}[Content][Column1]{0},
        ReportDate = Date.From(Excel.CurrentWorkbook(){[Name = "DReport"]}[Content][Column1]{0}),
        RowsData = Number.ToText(Excel.CurrentWorkbook(){[Name = "RowsData"]}[Content][Column1]{0}),
        Source = Json.Document(Web.Contents("https://finfo-api.vndirect.com.vn/v4/recommendations?" & (if
            MaCP <> null then "q=code:" & MaCP else "") & "~reportDate:gte:" & Date.ToText(ReportDate,"yyyy-MM-dd") & "&size=" & RowsData & "&sort=reportDate:ASC")),
    List1 = Record.ToTable(Source)[Value]{0},
    Table1 = Table.FromList(List1, Splitter.SplitByNothing()),
    Expanded = Table.ExpandRecordColumn(Table1, "Column1", {"code", "firm", "type", "reportDate", "source", "analyst", "reportPrice", "targetPrice", "avgTargetPrice"}),
    Types = Table.TransformColumnTypes(Expanded,{{"reportDate", type date}, {"reportPrice", type number}, {"targetPrice", type number}, {"avgTargetPrice", type number}})
in
    Types
em cảm ơn bác @ptm0412, em xin trả lời thắc mắc của bác ạ

1.
tại vì em tay ngang, nghiệp dư nên em không biết cách lấy trực tiếp data từ web về excel ,nên em đi đường vòng mất thời gian là vậy ạ

2.
các tuỳ chọn trong file của bác giúp em : mục số 1 giữ lại, mục 2 và 3 bỏ đi dùm em được không ạ (có nhiêu lấy hết bấy nhiêu luôn cho khoẻ, chạy file không điền vào ô E3, H3 thì file báo lỗi ạ)

3.
chọn mã (ô C3) bác viết trong code dòng nào vậy? giải thích dùm em với ạ


Khi em lấy data từ web về có mấy dạng như sau ạ (do cấu trúc web có thể khác nhau):
(vì là tay ngang nên cách nào dễ thì em làm được, khó em đành bó tay nhờ trợ giúp ạ)

cách 1: record vba (data > from web), sau đó chỉnh sửa lại code theo ý của mình

cách 2: anh @Nguyễn Duy Tuân có video hướng dẫn lấy được data dạng id table nên em cũng học theo (cách này lấy nhanh hơn cách 1, khi lấy data dạng này thì excel vẫn làm việc khác được)

Liên kết: https://www.youtube.com/watch?v=OSfcpLGVLOk



cách 3. khi web em không lấy được dạng 1 và 2, em thấy trên mạng có lấy về được google sheets nên em học theo (web > google sheets > excel) nên em mới biết ít về google app script, power query

(các bác là chuyên gia thì vấn đề được giải quyết 1 cách dễ dàng, còn em thì tay ngang nên mày mò code lâu lắm, phải xem code ý nghĩa sao để áp dụng cho các file khác em làm về sau nữa ạ)
@huhumalu

Lỗi khi chạy file

1668899906246.png
 
Lần chỉnh sửa cuối:
Upvote 0
em cảm ơn bác @ptm0412, em xin trả lời thắc mắc của bác ạ
Muốn lấy hết thì E3 ghi 01/01/2000, H3 ghi 10000 (tôi thấy tối đa có 6000)
Các mã đều nằm trong code. Bạn mới biết ít thì học thêm sẽ biết nhiều. Tải tài liệu của tôi viết về đọc trong đó có nhiều các thủ thuật nhỏ nhỏ. Kể cả xóa dòng, lấy tiêu đề, lấy name trên sheet, ... Chứ cái clip bạn xem chỉ lấy được duy nhất 1 kiểu, được sao để vậy, cột dư không chỉ dẫn cách xóa, dòng dư không biết làm.
 
Upvote 0
Muốn lấy hết thì E3 ghi 01/01/2000, H3 ghi 10000 (tôi thấy tối đa có 6000)
Các mã đều nằm trong code. Bạn mới biết ít thì học thêm sẽ biết nhiều. Tải tài liệu của tôi viết về đọc trong đó có nhiều các thủ thuật nhỏ nhỏ. Kể cả xóa dòng, lấy tiêu đề, lấy name trên sheet, ... Chứ cái clip bạn xem chỉ lấy được duy nhất 1 kiểu, được sao để vậy, cột dư không chỉ dẫn cách xóa, dòng dư không biết làm.
dạ vâng em cảm ơn bác @ptm412

vì cách làm cũ em không làm được nên em mới tìm cách mới, và tìm thấy power query, em cảm ơn bác Phạm Thành Mỹ

nhân tiện em nhờ bác @ptm412 nếu bác có thời gian lấy dùm em data từ link fialda về excel ( em lấy được về ggsheets thôi ạ, về excel em bó tay, em nhờ nhiều quá em cũng ngại)

link json: https://fwtapi1.fialda.com/api/services/app/TechnicalAnalysis/GetFinancialHighlights?symbol=hpg

(3 kí tự cuối hpg là mã cổ phiếu, bác thiết kế dùm em 1 ô trên excel để em gõ vào các mã cổ phiếu nhé bác)

các thuật ngữ tài chính:

sale: doanh thu
profit: lợi nhuận
grossprofitmargin: biên lợi nhuận gộp
eps: lợi nhuận trên mỗi cổ phiếu
growth_yoy: tăng trưởng quý này so với quý trước

Link hiện trên web

1668941766514.png

Kết quả em lấy trên ggsheets

1668941925584.png

em cám ơn bác @ptm0412
 
Lần chỉnh sửa cuối:
Upvote 0
Gợi ý:
Đọc tài liệu Power query ở đây:
Xem thí dụ về lấy dữ liệu web nhiều trang, nhiều mã, ... có sử dụng name trên sheet làm tham số
 
Upvote 0
Gợi ý:
Đọc tài liệu Power query ở đây:
Xem thí dụ về lấy dữ liệu web nhiều trang, nhiều mã, ... có sử dụng name trên sheet làm tham số
đa tạ bác @ptm0412
chúc bác nhiều sức khoẻ, mọi việc tốt đẹp ạ
 
Upvote 0
Trong tài liệu phần lấy dữ liệu từ web có các nội dung cần lưu ý:
- Đặt name cho 1 ô, sau đó lấy giá trị của ô vào PQ
- Tách địa chỉ web thành 2 hoặc nhiều phần, trong đó có phần text tĩnh và phần động lấy giá trị của name. Nối lại ra địa chỉ động.
- Lấy tên cột từ List, expand list theo danh sách tên cột.
Tuy nhiên lấy dữ liệu từ json của web có hơi khác:
- Kết quả của json là 1 record
- Chuyển record thành table phải tìm dòng chứa list để lấy ra 1 list
- Chuyển list thành table, vẫn là các record
- Lấy tên cột từ Record (hàm Record.FieldNames, thay vì Table.ColumnNames)
- Expand record (dùng hàm Table.ExpandRecordColumn thay vì Table.ExpandTableColumns)

Code:
PHP:
let
    MaCP= Excel.CurrentWorkbook(){[Name = "Ma"]}[Content][Column1]{0},
        Source = Json.Document(Web.Contents("https://fwtapi1.fialda.com/api/services/app/TechnicalAnalysis/GetFinancialHighlights?symbol=" &  MaCP)),
    List1 = Record.ToTable(Source)[Value]{1},
    Table1 = Table.FromList(List1, Splitter.SplitByNothing()),
    ColList = Record.FieldNames(Table1[Column1]{0}),
    Expanded = Table.ExpandRecordColumn(Table1, "Column1", List.FirstN(ColList,47)),
in
    Expanded

Do có 52 cột mà tôi chỉ muốn lấy 47 cột nên dùng thêm hàm List.FirstN
 

File đính kèm

Upvote 0
Trong tài liệu phần lấy dữ liệu từ web có các nội dung cần lưu ý:
- Đặt name cho 1 ô, sau đó lấy giá trị của ô vào PQ
- Tách địa chỉ web thành 2 hoặc nhiều phần, trong đó có phần text tĩnh và phần động lấy giá trị của name. Nối lại ra địa chỉ động.
- Lấy tên cột từ List, expand list theo danh sách tên cột.
Tuy nhiên lấy dữ liệu từ json của web có hơi khác:
- Kết quả của json là 1 record
- Chuyển record thành table phải tìm dòng chứa list để lấy ra 1 list
- Chuyển list thành table, vẫn là các record
- Lấy tên cột từ Record (hàm Record.FieldNames, thay vì Table.ColumnNames)
- Expand record (dùng hàm Table.ExpandRecordColumn thay vì Table.ExpandTableColumns)

Code:
PHP:
let
    MaCP= Excel.CurrentWorkbook(){[Name = "Ma"]}[Content][Column1]{0},
        Source = Json.Document(Web.Contents("https://fwtapi1.fialda.com/api/services/app/TechnicalAnalysis/GetFinancialHighlights?symbol=" &  MaCP)),
    List1 = Record.ToTable(Source)[Value]{1},
    Table1 = Table.FromList(List1, Splitter.SplitByNothing()),
    ColList = Record.FieldNames(Table1[Column1]{0}),
    Expanded = Table.ExpandRecordColumn(Table1, "Column1", List.FirstN(ColList,47)),
in
    Expanded

Do có 52 cột mà tôi chỉ muốn lấy 47 cột nên dùng thêm hàm List.FirstN
em chân thành cảm ơn và đa tạ bác @ptm0412
Trong tài liệu phần lấy dữ liệu từ web có các nội dung cần lưu ý:
- Đặt name cho 1 ô, sau đó lấy giá trị của ô vào PQ
- Tách địa chỉ web thành 2 hoặc nhiều phần, trong đó có phần text tĩnh và phần động lấy giá trị của name. Nối lại ra địa chỉ động.
- Lấy tên cột từ List, expand list theo danh sách tên cột.
Tuy nhiên lấy dữ liệu từ json của web có hơi khác:
- Kết quả của json là 1 record
- Chuyển record thành table phải tìm dòng chứa list để lấy ra 1 list
- Chuyển list thành table, vẫn là các record
- Lấy tên cột từ Record (hàm Record.FieldNames, thay vì Table.ColumnNames)
- Expand record (dùng hàm Table.ExpandRecordColumn thay vì Table.ExpandTableColumns)

Code:
PHP:
let
    MaCP= Excel.CurrentWorkbook(){[Name = "Ma"]}[Content][Column1]{0},
        Source = Json.Document(Web.Contents("https://fwtapi1.fialda.com/api/services/app/TechnicalAnalysis/GetFinancialHighlights?symbol=" &  MaCP)),
    List1 = Record.ToTable(Source)[Value]{1},
    Table1 = Table.FromList(List1, Splitter.SplitByNothing()),
    ColList = Record.FieldNames(Table1[Column1]{0}),
    Expanded = Table.ExpandRecordColumn(Table1, "Column1", List.FirstN(ColList,47)),
in
    Expanded

Do có 52 cột mà tôi chỉ muốn lấy 47 cột nên dùng thêm hàm List.FirstN
cảm ơn bác @ptm0412
em nhờ bác giúp em thêm:

1.
viết dùm em code khi thay đổi mã ở ô C2 của sheet Data, thì tự dộng refesh lấy dữ liệu luôn ạ ( gõ nhiều mã refesh nhiều lần mất thêm thời gian ạ).

2.
em có làm thểm cái pivot table và pivot chart bên sheet Chart, nếu được bác viết dùm em code khi gõ mã vào ô C2 của sheet Data thì sẽ tự động refesh bên pivot chart luôn.

bác xem file đính kèm nhé.

em cảm ơn bác.
 

File đính kèm

Upvote 0
em chân thành cảm ơn và đa tạ bác @ptm0412

cảm ơn bác @ptm0412
Cái Data Validation của tôi ở ô C2 bạn vất đi đâu rồi?
Code đặt tại Sheet Data:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("C2")) Is Nothing Then ActiveWorkbook.Connections("Query - Data").Refresh
End Sub
Code đặt tại sheet Chart
PHP:
Private Sub Worksheet_Activate()
PivotTables(1).PivotCache.Refresh
End Sub
 
Upvote 0
Cái Data Validation của tôi ở ô C2 bạn vất đi đâu rồi?
Code đặt tại Sheet Data:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("C2")) Is Nothing Then ActiveWorkbook.Connections("Query - Data").Refresh
End Sub
Code đặt tại sheet Chart
PHP:
Private Sub Worksheet_Activate()
PivotTables(1).PivotCache.Refresh
End Sub

Cái Data Validation của tôi ở ô C2 bạn vất đi đâu rồi?
em cám ơn bác @ptm0412 , cái Data Validation em clear đi rồi ạ

em đang làm cái power query nhưng đang bị lỗi, bác xem dùm em lỗi gì với ạ (bác xem file đính kèm nhé), cám ơn bác ptm

Link:

https://fiin-fundamental.ssi.com.vn/FinancialAnalysis/GetFinancialRatioV2?language=vi&Type=Company&OrganCode=HPG&Timeline=2022_1&Timeline=2022_2&Timeline=2022_3&Timeline=2021_4

Hình ảnh báo lỗi:

1669386388600.png
 

File đính kèm

Upvote 0
dạ đơn giản thôi bác, do thói quen thôi
do em quen với các mã rồi, còn bác thì chưa quen nên cần cái danh sách đó để chọn ạ
Đó là cách trả lời quá đơn giản. Tôi không thích cái cách trả lời, chứ không phải là không thích việc không dùng validation. Tôi sẽ không làm gì cho bạn nữa, vì bạn là người:
- Không có chí học hỏi. Qua 2 bài mẫu và tài liệu có sẵn mà không học hỏi để tự làm.
- Bạn có tính cẩu thả. Mã cổ phiếu luôn luôn là chữ in hoa, bạn chuyên gõ chữ thường
- Bạn sống hời hợt. Tôi bỏ công chạy query từ file khác để lấy danh sách mã làm nguồn cho validation, bạn thẳng tay xóa. Khi được hỏi thì thản nhiên trả lời cụt ngủn không thêm 1 lời giải thích (clear rồi). Bạn quen mã kệ bạn, tôi làm không phải cho tôi xài, cũng không phải làm cho 1 mình bạn xài. Bỏ công ra làm để những người khác trên GPE có bài tham khảo.
- Bạn có ý lợi dụng người khác làm cho mình, không quan tâm tâm trạng người khác: Cứ làm đi, tôi thích thì tôi xóa, giờ tôi hỏi thêm đây, trả lời đi, đừng có mà "không thích"

Sự kiên nhẫn của con người cũng có giới hạn, bạn chờ xem có người nào khác đủ kiên nhẫn làm tiếp cho bạn hết bài này sang bài kia, với cùng 1 dạng như nhau.
 
Lần chỉnh sửa cuối:
Upvote 0

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

Back
Top Bottom