Lấy tỷ giá ngân hàng về file Excel bằng Power Query (2 người xem)

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

  • Cá ngừ F1

    ( ͡° ͜ʖ ͡°)
    Thành viên BQT
    Moderator
    Tham gia
    1/1/08
    Bài viết
    2,580
    Được thích
    3,723
    Donate (Momo)
    Donate
    Giới tính
    Nam
    Nghề nghiệp
    Quan hệ.. và quan hệ..
    Dùng Power Query lấy được tỷ giá 1 ngày từ trang Web của VCB
    Bạn chọn ngày ô B4 (Bôi vàng) click RUN để lấy dữ liệu từ web về.
     

    File đính kèm

    Chỉnh sửa lần cuối bởi điều hành viên:
    Dùng vòng lặp trong Power Query để lấy từ ngày đến ngày (VCB)
    PHP:
    let
        WebAddress = Excel.CurrentWorkbook(){[Name="WebAdd"]}[Content]{0}[Column1] ,
        DateFrom = Number.From(Excel.CurrentWorkbook(){[Name="DFrom"]}[Content]{0}[Column1]) ,
        DateTo = Number.From(Excel.CurrentWorkbook(){[Name="DTo"]}[Content]{0}[Column1]) ,
        DaysNo = {0..DateTo - DateFrom},
        abc=Date.ToText(Date.From(DaysNo{0}+DateFrom),"dd/MM/yyyy"),
        DataW = List.Transform(DaysNo, (wd) =>
        let
            Datewd=DaysNo{wd}+DateFrom,
            Source = Web.Page(Web.Contents(WebAddress & Date.ToText(Date.From(Datewd),"dd/MM/yyyy"))),
            Data0 = Source{0}[Data],
            RenamedColumns = Table.RenameColumns(Data0,{{"Ngoại tệ Tên ngoại tệ", "Tên Ngoại tệ"}, {"Ngoại tệ Mã NT", "Mã ngoại tệ"}}),
            RemoveRows = Table.Skip(RenamedColumns,2),
            ReplaceValue = Table.ReplaceValue(RemoveRows,"-","0",Replacer.ReplaceText,{"Mua Tiền mặt"}),
            ChangeType = Table.TransformColumnTypes(ReplaceValue,{{"Mua Tiền mặt", type number}, {"Mua Chuyển khoản", type number},
                  {"Bán", type number}}),
            AddDate = Table.AddColumn(ChangeType, "Date", each Date.From(Datewd), Date.Type)
        in AddDate),
        List2 =Table.FromList(DataW,Splitter.SplitByNothing()),
        ListColumns2 = Table.ColumnNames(DataW{0}),
        KetQua1 = Table.ReorderColumns(Table.ExpandTableColumn(List2, "Column1", ListColumns2),
              {"Date", "Tên Ngoại tệ", "Mã ngoại tệ", "Mua Tiền mặt", "Mua Chuyển khoản", "Bán"})
     KetQua = if Curr = null then KetQua1 else Table.SelectRows(KetQua1, each [Mã ngoại tệ] = Curr)
    in
        KetQua

    Chọn từ ngày đến ngày và refresh

    1629428757754.png
     

    File đính kèm

    Lần chỉnh sửa cuối:
    Em thử một giải pháp khác,
    Khởi tạo 1 Parameter theo ngày, sử dụng chức năng Invoke Custom Function.
    Ở Sheet Note có thể chọn bất kỳ ngày nào muốn lấy tỷ giá. Sau khi chọn ngày, sang Sheet CaNguF1 và Refresh.
    Nếu muốn lấy thêm ngày thì nhập tiếp vào dòng cuối cùng.
     

    File đính kèm

    Dùng vòng lặp để lấy từ trang web của VietinBank https://www.vietinbank.vn/web/home/vn/ty-gia
    Vietinbank chỉ có tỷ giá cho các ngày không phải thứ bảy chủ nhật nên ngày đầu cần kiểm tra. Ô ngoại tệ nếu chọn 1 loại ngoại tệ thì lọc theo ngoại tệ đó, nếu bỏ trống thì lấy hết.
    PHP:
    let
        WebInitial = Excel.CurrentWorkbook(){[Name="WebAdd"]}[Content]{0}[Column1],
        Curr = Excel.CurrentWorkbook(){[Name="Currency"]}[Content]{0}[Column1],
        DateFrom = Date.From(Excel.CurrentWorkbook(){[Name="DFrom"]}[Content]{0}[Column1]),
        DateTo = Date.From(Excel.CurrentWorkbook(){[Name="DTo"]}[Content]{0}[Column1]),
        List0 = {0..Number.From(DateTo) - Number.From(DateFrom)},
        List1 = {Number.From(DateFrom)..Number.From(DateTo)},
        DataW =List.Transform(List0, (wd) => 
        let
            Date1 = Date.ToText(Date.From( List1{wd}), "ddMMyyyy"),
                WebAddress = WebInitial & Text.Start(Date1,2) & "%2F" & Text.Middle(Date1,2,2) & "%2F" & Text.End(Date1,4),
                Source = Web.Page(Web.Contents(WebAddress)),
                Data0 = Table.PromoteHeaders(Table.Skip(Source{0}[Data],1)),
                Data=Table.AddColumn(Table.SelectRows(Data0, each [Ngoại tệ] <> null), "Ngày", each Date.From( List1{wd}))
        in Data),
        List2 =Table.FromList(DataW,Splitter.SplitByNothing()),
        ColumnList= Table.ColumnNames(DataW{0}),
        Ketqua0=Table.SelectRows(Table.ExpandTableColumn(List2, "Column1", ColumnList), each [Ngày] <> null),
        Ketqua1 = Table.RenameColumns(Ketqua0,{{"Tiền mặt & Séc", "Mua Tiền mặt & Séc"}, {"Chuyển khoản", "Mua Chuyển khoản"}}),
        Ketqua= if Curr = null then Ketqua1 else Table.SelectRows(Ketqua1, each [Ngoại tệ]= Curr)
    in
        Ketqua
     

    File đính kèm

    Bổ sung: Vòng lặp có kiểm tra thứ 7 và chủ nhật. Bao gồm kiểm tra ngày bắt đầu, khuyến cáo duy nhất là chọn ít nhất 3 ngày
    Code bài #4 là ăn gian
    PHP:
    DataW =List.Transform(List0, (wd) =>  
        if Date.DayOfWeek(Date.From( List1{wd}),Day.Monday) < 5 then
        let
            Date1 = Date.ToText(Date.From( List1{wd}), "ddMMyyyy"), 
                WebAddress = WebInitial & Text.Start(Date1,2) & "%2F" & Text.Middle(Date1,2,2) & "%2F" & Text.End(Date1,4),
                Source = Web.Page(Web.Contents(WebAddress)),
                Data0 = Table.PromoteHeaders(Table.Skip(Source{0}[Data],1)),
                Data=Table.AddColumn(Table.SelectRows(Data0, each [Ngoại tệ] <> null), "Ngày", each Date.From( List1{wd}))
        in Data
        else null),
        List2 =Table.FromList(DataW,Splitter.SplitByNothing()),
        ColumnList= Table.ColumnNames(if DataW{0} = null and DataW{1} <> null then DataW{1}
            else if DataW{1} = null then DataW{2} 
            else null),
     
    Lần chỉnh sửa cuối:
    Các bác cho dữ liệu tỷ giá 1 tháng và đo tốc độ chạy của Power Query chia sẻ cho mọi người tham khảo.
     
    Các bác cho dữ liệu tỷ giá 1 tháng và đo tốc độ chạy của Power Query chia sẻ cho mọi người tham khảo.
    Hiện tôi chưa bắt được sự kiện refresh complete. Câu lệnh Refresh đã xong, code đã thoát, nhưng còn thời gian update query chạy ngầm không tính được.
     
    Các bác cho dữ liệu tỷ giá 1 tháng và đo tốc độ chạy của Power Query chia sẻ cho mọi người tham khảo.
    Tôi lấy thử 1 tháng, đo hơi thủ công (do không biết đo thời gian chạy Background như thế nào)
    Chạy lần đầu, do có kết nối load .Net Framework, tổng thời gian cả refresh code + Running Background khoảng 10 giây.
    Mà chạy lại lần sau thì khoảng 4 giây.
    Bạn có giải pháp nhanh hơn, mạnh hơn Power Query chăng?
     
    Tôi lấy thử 1 tháng, đo hơi thủ công (do không biết đo thời gian chạy Background như thế nào)
    Chạy lần đầu, do có kết nối load .Net Framework, tổng thời gian cả refresh code + Running Background khoảng 10 giây.
    Mà chạy lại lần sau thì khoảng 4 giây.
    Bạn có giải pháp nhanh hơn, mạnh hơn Power Query chăng?
    Em thấy học về Power Query này xem video dễ hiểu hơn,
    Chứ code kia em nhìn hoa hết mắt mà chả hiểu gì.
    Mấy vụ tổng hợp nhiều sheet, nhiều file 1 foder em làm hàng ngày,
    Nhưng xem bài hướng dẫn em ko hiểu được gì.
     
    Em thấy học về Power Query này xem video dễ hiểu hơn,
    Video tốt nhất cũng là 1 clip cho 1 bài cụ thể, muốn áp dụng cho mình cũng phải thực hành từng bước như trong hướng dẫn thôi. Quan trọng là phải thấy vấn đề cần xử lý, biết cách xử lý vấn đề đó, mà không trường hợp nào giống trường hợp nào. Học cái gì liên quan đến xử lý dữ liệu đều cần nhất cái tư duy chứ không phải cầm tay chỉ việc.
     
    Dùng vòng lặp để lấy từ trang web của VietinBank https://www.vietinbank.vn/web/home/vn/ty-gia
    Vietinbank chỉ có tỷ giá cho các ngày không phải thứ bảy chủ nhật nên ngày đầu cần kiểm tra. Ô ngoại tệ nếu chọn 1 loại ngoại tệ thì lọc theo ngoại tệ đó, nếu bỏ trống thì lấy hết.
    PHP:
    let
        WebInitial = Excel.CurrentWorkbook(){[Name="WebAdd"]}[Content]{0}[Column1],
        Curr = Excel.CurrentWorkbook(){[Name="Currency"]}[Content]{0}[Column1],
        DateFrom = Date.From(Excel.CurrentWorkbook(){[Name="DFrom"]}[Content]{0}[Column1]),
        DateTo = Date.From(Excel.CurrentWorkbook(){[Name="DTo"]}[Content]{0}[Column1]),
        List0 = {0..Number.From(DateTo) - Number.From(DateFrom)},
        List1 = {Number.From(DateFrom)..Number.From(DateTo)},
        DataW =List.Transform(List0, (wd) =>
        let
            Date1 = Date.ToText(Date.From( List1{wd}), "ddMMyyyy"),
                WebAddress = WebInitial & Text.Start(Date1,2) & "%2F" & Text.Middle(Date1,2,2) & "%2F" & Text.End(Date1,4),
                Source = Web.Page(Web.Contents(WebAddress)),
                Data0 = Table.PromoteHeaders(Table.Skip(Source{0}[Data],1)),
                Data=Table.AddColumn(Table.SelectRows(Data0, each [Ngoại tệ] <> null), "Ngày", each Date.From( List1{wd}))
        in Data),
        List2 =Table.FromList(DataW,Splitter.SplitByNothing()),
        ColumnList= Table.ColumnNames(DataW{0}),
        Ketqua0=Table.SelectRows(Table.ExpandTableColumn(List2, "Column1", ColumnList), each [Ngày] <> null),
        Ketqua1 = Table.RenameColumns(Ketqua0,{{"Tiền mặt & Séc", "Mua Tiền mặt & Séc"}, {"Chuyển khoản", "Mua Chuyển khoản"}}),
        Ketqua= if Curr = null then Ketqua1 else Table.SelectRows(Ketqua1, each [Ngoại tệ]= Curr)
    in
        Ketqua
    File này giờ còn dùng được nữa không ad ơi. e cần lấy danh sách tỷ giá vietinbank theo tháng.hiện tại e vẫn vào web lấy thủ công. nếu chạy được nhờ ad cập nhật giúp e với ạ. e cám ơn ad
     

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

    Back
    Top Bottom