Lấy tỷ giá ngân hàng về file Excel bằng Power Query

Liên hệ QC

Cá ngừ F1

( ͡° ͜ʖ ͡°)
Thành viên BQT
Moderator
Tham gia
1/1/08
Bài viết
2,579
Được thích
3,715
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

  • Lay TG tu VCB.xlsm
    26.7 KB · Đọc: 47
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

  • TyGiaVCB-FromTo.xlsx
    25.1 KB · Đọc: 53
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

  • TyGiaVCB-FromTo_Tuychon.xlsx
    36.3 KB · Đọc: 30
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

  • VietInBank.xlsx
    21 KB · Đọc: 51
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.
 
Web KT
Back
Top Bottom