Lấy tỷ giá VCB về file excel (1 người xem)

  • Thread starter Thread starter AnhNQT
  • Ngày gửi Ngày gửi
Liên hệ QC

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

AnhNQT

Thành viên chính thức
Tham gia
6/11/18
Bài viết
61
Được thích
5
Giới tính
Nam
Xin chào các Bác GPE,
Em cần giúp để lấy tỷ giá VCB về excel theo một vài mã cần và theo ngày ạ. Nếu được thì ngày nào cũng tự lấy về thì càng tốt ạ.
Em cảm ơn!
 

File đính kèm

Tôi đang viết ứng dụng về tỉ giá, bao gồm tỉ giá ngoại tệ, lãi xuất, tiền điện tử, tiền tệ, giá vàng

Nếu bạn có thời gian thì tham khảo qua để phát triển ứng dụng cho riêng bạn:


Annotation 2021-08-12 121755.jpg
 
Upvote 0
Tôi đang viết ứng dụng về tỉ giá, bao gồm tỉ giá ngoại tệ, lãi xuất, tiền điện tử, tiền tệ, giá vàng

Nếu bạn có thời gian thì tham khảo qua để phát triển ứng dụng cho riêng bạn:


View attachment 263966
Của bác chuyên nghiệp quá, em chưa biết gì nhiều về VBA nên chưa ứng dụng ngay được.
 
Upvote 0
Dùng Power Query lấy được từ trang này
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

Upvote 0
@Cá ngừ F1:
Bạn cho tôi hỏi là để lấy được Link trong ô B3 thì bạn đã làm như thế nào?
Cảm ơn.
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Theo tôi, trước tiên để có căn bản về Power Query, bạn đọc tài liệu về PQ của sư phụ @ptm0412 (tài liệu miễn phí mừng sinh nhật GPE lần 13)
Tôi có tìm hiểu về Power Query rồi. Việc cập nhật dữ liệu lấy theo Folder hay Web tôi nắm sơ sơ.
Vấn đề tôi hỏi bạn là bạn làm thế nào để có Link ô B3 như trong File.
Link trong B3 khác Link mà chủ Topic đưa ra.
Nếu như như tôi dùng Link của bài #2 copy và dán vào URL từ cửa sổ From Web cũng có kết quả như của bạn.
Bạn chưa trả lời vào trọng tâm câu hỏi của tôi.
 
Upvote 0
Tôi có tìm hiểu về Power Query rồi. Việc cập nhật dữ liệu lấy theo Folder hay Web tôi nắm sơ sơ.
Vấn đề tôi hỏi bạn là bạn làm thế nào để có Link ô B3 như trong File.
Link trong B3 khác Link mà chủ Topic đưa ra.
Nếu như như tôi dùng Link của bài #2 copy và dán vào URL từ cửa sổ From Web cũng có kết quả như của bạn.
Bạn chưa trả lời vào trọng tâm câu hỏi của tôi.
Link trong B3 đơn giản là kết nối mấy cái text với nhau thôi bạn? kết hợp cùng với ô B4 để link chuẩn theo ngày.
 
Upvote 0
Upvote 0
Lấy từ bài #2 chứ còn lấy ở đâu.
Cần có kiến thức về web API.

Payload thông thường nhận dạng json data, một số trường hợp 'củ chuối' ở dạng json string (do người thiết kế hệ thống làm).
Các tham số của payload không nhất thiết phải theo thứ tự.
Ví dụ với link kia.
PHP:
https://portal.vietcombank.com.vn/UserControls/TVPortal.TyGia/pListTyGia.aspx?txttungay=11/08/2021&BacrhID=1&isEn=False
thì có thể đổi thành như sau cho dễ nhìn, thuận mắt với thông số thay đổi:
PHP:
https://portal.vietcombank.com.vn/UserControls/TVPortal.TyGia/pListTyGia.aspx?BacrhID=1&isEn=False&txttungay=dd/mm/yyyy

và có những tham số không nhất thiết phải cung cấp,API sẽ nhận thông số mặc định đã được thiết kế., nên có thể đơn giản thế này:
PHP:
https://portal.vietcombank.com.vn/UserControls/TVPortal.TyGia/pListTyGia.aspx?txttungay=dd/mm/yyyy
 
Upvote 0
Lưu lại từng ngày, thì theo tôi thì Save cái Sheet đấy thành 1 file vào 1 folder dữ liệu gốc nào đó. Như thế được không bạn?
 
Upvote 0
Lưu lại từng ngày, thì theo tôi thì Save cái Sheet đấy thành 1 file vào 1 folder dữ liệu gốc nào đó. Như thế được không bạn?
Dạ mục đích và mong muốn của em là lấy tỷ giá này để tính hóa đơn cho khách, khách mua sản phẩm ngày 11/8 thì sẽ lookup sang cái tỷ giá ứng với ngày đó, còn với ngày khác cũng sẽ được lấy tương ứng sang ạ. Nên trong file ví dụ #1 em có cột ngày để lấy ạ.
 
Upvote 0
Lưu lại từng ngày, thì theo tôi thì Save cái Sheet đấy thành 1 file vào 1 folder dữ liệu gốc nào đó. Như thế được không bạn?
Có 1 cách lưu trong cùng 1 file:
Tạo 1 sheet mới, tạo sẵn 2 cột tiêu đề dòng: Tên ngoại tệ và mã ngoại tệ, số dòng =3 lần số dòng của query 1
Tạo 1 query thứ 2 bằng cách unpivot query thứ nhất
viết code copy cột cuối của query thứ 2 vào cột mới của sheet 2, tiêu đề là ngày
 
Upvote 0
Có 1 cách lưu trong cùng 1 file:
Tạo 1 sheet mới, tạo sẵn 2 cột tiêu đề dòng: Tên ngoại tệ và mã ngoại tệ, số dòng =3 lần số dòng của query 1
Tạo 1 query thứ 2 bằng cách unpivot query thứ nhất
viết code copy cột cuối của query thứ 2 vào cột mới của sheet 2, tiêu đề là ngày
Ý của bạn theo em hiểu là Append các ngày lại. Thêm 1 trường ngày vào, giả sử chọn ngày, nếu dữ liệu chưa có ngày này thì append thêm vào.
 
Upvote 0
Ý của bạn theo em hiểu là Append các ngày lại. Thêm 1 trường ngày vào, giả sử chọn ngày, nếu dữ liệu chưa có ngày này thì append thêm vào.
Append khó thì làm từng ngày copy nối vào sheet mới, ý bài 16 tôi nói copy mỗi cột 1 ngày, thì đổi lại copy nối xuống dưới theo dòng
Theo cấu trúc bảng trong trang web thì không có cùng lúc nhiều ngày để lấy 1 lần nhiều ngày, dùng vòng lặp cũng được nhưng khó.
File đính kèm làm cả 2 dạng cột và dòng. Cứ điều ngày theo thứ tự vào ô B4 và nhấn nút Run.
Ghi chú: Có chỉnh sửa query 1 của @Cá ngừ F1: Type = Number, Replace "-" bằng 0
Kết quả theo cột:

1628848245284.png

Kết quả theo dòng

1628848298812.png
 

File đính kèm

Upvote 0
Em cảm ơn các Bác đã trợ giúp, chúc các Bác sức khỏe ạ!
 
Upvote 0
Ý của bạn theo em hiểu là Append các ngày lại. Thêm 1 trường ngày vào, giả sử chọn ngày, nếu dữ liệu chưa có ngày này thì append thêm vào.
Thêm 1 cái query lưu cái cũ , check ngày mới có tồn tại trong cái cũ hay chưa rồi append thôi bạn ạ
 

File đính kèm

Upvote 0
Thêm 1 cái query lưu cái cũ , check ngày mới có tồn tại trong cái cũ hay chưa rồi append thôi bạn ạ
Quá tuyệt vời rồi chủ thớt nhỉ?
Với kiểu lấy dữ liệu này, chủ thớt có thể lookup tỷ giá theo mã ngoại tệ với bất kỳ ngày nào rồi.
Cảm ơn anh @excel_lv1.5 dù vẫn chưa hiểu sâu về câu truy vấn so sánh 2 query.
 
Upvote 0
Quá tuyệt vời rồi chủ thớt nhỉ?
Với kiểu lấy dữ liệu này, chủ thớt có thể lookup tỷ giá theo mã ngoại tệ với bất kỳ ngày nào rồi.
Cảm ơn anh @excel_lv1.5 dù vẫn chưa hiểu sâu về câu truy vấn so sánh 2 query.
Có 1 query lấy từ trang web về thôi, 1 query lấy từ bảng tính.
Hàm List.Contains(List, Value) kiểm tra sự tồn tại của Value trong List chỉ định (tìm ngày ô B4 trong cột Date của query bảng tính), nếu có trả về True
Nếu True thì không append, ngược lại thì lấy thêm về rồi append. (đúng là tuyệt chiêu)
Thử xoá hết dòng dữ liệu trên table bảng tính chỉ chừa dòng tiêu đề, rồi chạy cũng ra kết quả.
 
Upvote 0
Upvote 0
Upvote 0
Upvote 0
Power Query rất mạnh mẽ anh @Nguyễn Duy Tuân ạ.
Trong query editor có thể chỉnh sửa, thêm bớt, lọc, group by… các kiểu. Lấy bằng VBA chắc ko thể cơ động trong case này.

Yêu cầu của bạn đó chỉ là lấy dữ liệu trên web mà. Nếu dữ liệu có cấu trúc trong một database hay file Excel thù VBA dùng với ADO để chạy SQL. Với việc này code sẽ chạy trên các phiên bản Excel.
 
Upvote 0
Yêu cầu của bạn đó chỉ là lấy dữ liệu trên web mà. Nếu dữ liệu có cấu trúc trong một database hay file Excel thù VBA dùng với ADO để chạy SQL. Với việc này code sẽ chạy trên các phiên bản Excel.
Không đơn thuần là lấy dữ liệu đâu a ạ. Mà lấy theo từng ngày và nối chúng lại với nhau đó anh. Chưa kể việc data lấy về còn thô sơ, cũng cần qua vài công đoạn chế biến để có dữ liệu đẹp hơn.
 
Upvote 0
Yêu cầu của bạn đó chỉ là lấy dữ liệu trên web mà. Nếu dữ liệu có cấu trúc trong một database hay file Excel thù VBA dùng với ADO để chạy SQL. Với việc này code sẽ chạy trên các phiên bản Excel.
Đúng ạ, vì em k biết đến power query nên phải copy lại toàn bộ dữ liệu đang làm sang file tỷ giá này ạ. Em không biết cách tạo mới cũng như di chuyển power query tỷ giá này sang.
 
Upvote 0
Không đơn thuần là lấy dữ liệu đâu a ạ. Mà lấy theo từng ngày và nối chúng lại với nhau đó anh. Chưa kể việc data lấy về còn thô sơ, cũng cần qua vài công đoạn chế biến để có dữ liệu đẹp hơn.

Với tình huống bài này anh chưa xem kỹ yêu cầu của file là có truy vấn các bảng hay filter không. Nhưng theo link trên web là chỉ một bảng. Và việc này có thể dùng như video anh hướng dẫn phía trên vì nó cho phép chạy luôn SQL hoặc không thì cũng chạy vòng lặp là ra.
Với Power query nếu nó cho phép JOIN hay GROPY BY các tag Table trên website thì đó là sức mạnh thực sự và dùng đc nhiều tình huống phức tạp hơn.
 
Upvote 0
Với Power query nếu nó cho phép JOIN hay GROPY BY các tag Table trên website thì đó là sức mạnh thực sự và dùng đc nhiều tình huống phức tạp hơn.
Power query ngoài Join, Groupby còn cho phép xử lý dữ liệu như: thêm cột tính toán, thêm cột theo điều kiện, cột cộng dồn, cắt chuỗi tuỳ ý, chuyển cột thành dòng, union (append bằng lệnh combine), viết hàm riêng để tính toán, ... Bằng các hàm M, lấy từ thư viện hàm M rất lớn.

Đúng ạ, vì em k biết đến power query nên phải copy lại toàn bộ dữ liệu đang làm sang file tỷ giá này ạ. Em không biết cách tạo mới cũng như di chuyển power query tỷ giá này sang.
Nếu bạn có thời gian thì nghiên cứu thêm về Power query trong tài liệu đầu trang GPE, trang 97 và tài liệu hàm M cơ bản.
Còn làm nhanh thì nếu bạn không mang núi sông về nhà được thì dời nhà đến núi đến sông
 
Lần chỉnh sửa cuối:
Upvote 0
Cái query from web chỉ đơn giản là lấy dữ liệu từ một url về, và chỉ thế mà thôi. Mỗi lần thực hiện là phải tạo ra một query mới.
Chẳng có lý do gì để so sánh nó với Power Query cả, bởi nó chỉ là 1 chức năng.

Còn Power Query là một bộ công cụ/ thư viện hoàn chỉnh được tích hợp vào Excel, nó có môi trường viết mã lệnh (M code), cho phép thực hiện mã lệnh (tương tự như môi trường VBA).
Ngay cái phần web scraping có hẳn thư viện Web siêu hịn.
Chưa kể kết hợp với Html.Table, Json cho phép xử lý dữ liệu trả về ngon lành cành đào.

1628913194956.png
 
Upvote 0
Cái query from web chỉ đơn giản là lấy dữ liệu từ một url về, và chỉ thế mà thôi. Mỗi lần thực hiện là phải tạo ra một query mới.
Chẳng có lý do gì để so sánh nó với Power Query cả, bởi nó chỉ là 1 chức năng.

Còn Power Query là một bộ công cụ/ thư viện hoàn chỉnh được tích hợp vào Excel, nó có môi trường viết mã lệnh (M code), cho phép thực hiện mã lệnh (tương tự như môi trường VBA).
Ngay cái phần web scraping có hẳn thư viện Web siêu hịn.
Chưa kể kết hợp với Html.Table, Json cho phép xử lý dữ liệu trả về ngon lành cành đào.

Cả cái topic này bạn không đọc kỹ à, có ai so sánh đâu? Mọi người đang đưa ra các giải pháp khác nhau mà thôi. Nếu cái đơn giản mà làm được thì là tốt, cái cao cấp làm đa năng hơn thì là cơ hội cho nhiều người khác tìm hiểu để ứng dụng cho nhu cầu khác.
 
Upvote 0
Cả cái topic này bạn không đọc kỹ à, có ai so sánh đâu?

1/ Anh chưa xem kỹ mà mải đăng du túp quá nên không để ý là em người trả lời đầu tiên nhé, và đọc thuộc cả thớt này á.
1628914019435.png

2/ Có chỗ nào nói ai so sánh vậy anh?

Mọi người đang đưa ra các giải pháp khác nhau
Chuẩn rồi đó anh.
 
Upvote 0
Power query ngoài Join, Groupby còn cho phép xử lý dữ liệu như: thêm cột tính toán, thêm cột theo điều kiện, cột cộng dồn, cắt chuỗi tuỳ ý, chuyển cột thành dòng, union (append bằng lệnh combine), viết hàm riêng để tính toán, ... Bằng các hàm M, lấy từ thư viện hàm M rất lớn.


Nếu bạn có thời gian thì nghiên cứu thêm về Power query trong tài liệu đầu trang GPE, trang 97 và tài liệu hàm M cơ bản.
Còn làm nhanh thì nếu bạn không mang núi sông về nhà được thì dời nhà đến núi đến sông

Em muốn hỏi anh cũng như xác nhận lại là Power Query có khả năng JOIN, GROUPBY từ hai bảng trên web không? Các bảng nằm ở các thẻ TABLE của web ấy anh?
 
Upvote 0
Upvote 0
Em muốn hỏi anh cũng như xác nhận lại là Power Query có khả năng JOIN, GROUPBY từ hai bảng trên web không? Các bảng nằm ở các thẻ TABLE của web ấy anh?
Join hiểu theo SQL là tạo relation và join, trong Power query gọi là merge và có thể merge nhiều table với nhau miễn là có trường Key (nguồn từ web hay bất kỳ đâu cũng được).
Groupby thì Power query làm được từ bất kỳ nguồn nào, cứ lấy về rồi thêm step groupby
Các tính năng tôi kể ở trên cũng vậy, hễ lấy được về rồi là làm được hết
Nói thêm: Nếu trang web có nhiều page(s), mỗi page là 1 table theo ngày (hoặc theo bất kỳ tiêu chí nào), có thể dùng vòng lặp ngay trong hàm M để lấy về và union (combine) lại với nhau
 
Upvote 0
Upvote 0
Lý ra bạn nên viết rõ là:
Kết quả lấy dữ liệu từ web về là một Table chuẩn chỉ, vậy nên muốn làm gì cũng được.
Nếu url trả về Table thì đơn giản, nếu trả về html không vẫn conver thành bảng được, mấy cái web có sử dụng token dùng power query vẫn xử lý được vì nó cho phép nhập header, power query trên BI thì xịn xò hơn nó tự conver json và htlm thành bảng luôn
Join hiểu theo SQL là tạo relation và join, trong Power query gọi là merge và có thể merge nhiều table với nhau miễn là có trường Key (nguồn từ web hay bất kỳ đâu cũng được).
Groupby thì Power query làm được từ bất kỳ nguồn nào, cứ lấy về rồi thêm step groupby
Các tính năng tôi kể ở trên cũng vậy, hễ lấy được về rồi là làm được hết
Nói thêm: Nếu trang web có nhiều page(s), mỗi page là 1 table theo ngày (hoặc theo bất kỳ tiêu chí nào), có thể dùng vòng lặp ngay trong hàm M để lấy về và union (combine) lại với nhau
Chưa kể nó cho phép lưu data ngoài bảng tính hay trên Ram, lưu trên Ram thì data cho thể cả trăm triệu dòng, dùng power pivot nâng cao trả kết quả động (power pivot và power Bi nó sử dụng cùng công nghệ với mấy thằng SAP đời mới bây giờ), từ cái kết quả động đó có thể tạo hơn 100 cái report khác nhau với tốc độ vài s, nếu ví VBA là ngôn ngữ bậc thấp thì M code là ngôn ngữ bậc cao , có thể tốc độ một số trường hợp không bằng VBA nhưng về query connect, ETL, tính toán, report, visualize ... thì VBA không so được, nó là anh em với power BI nhưng nó miễn phí, có thể nói power query+power pivot trong excel là tool BI miễn phí tốt nhất, cái connect của power query hiện nay chắc hơn 140 source rồi như file, Oracle, Sql, mySQL, postgresql, odbc, cloud, web...chỉ riêng việc connect SQL trong power query với ADO trong vba cũng có khác biệt rồi, ADO chỉ connect các câu query select, còn trong power query cho phép code thuần như tạo bảng tạm, loop rồi lấy kết quả sau cùng thôi
 
Upvote 0
Đúng như tôi xem qua câu hỏi ban đầu. Để đơn giản bạn dùng phương pháp QueryTable mà tôi đã gửi link youtube hướng dẫn. Dùng nguyên kiến thức đó, kết hợp với code thêm về vòng lặp để so sánh là ra. File đính kém là toàn bộ mã nguồn.

lay_ty_gia.gif
Mã nguồn:
Mã:
Option Explicit

'Kien thuc code trong file nay ban xem link: https://www.youtube.com/watch?v=OSfcpLGVLOk

Sub LayTyGia()
    Range("J6:L6").Value = "Waiting..."
    Range("J6:L6").Value = LayTyGiaTheoNgay(Range("J2").Value, Range("J3").Value)
End Sub

Function LayTyGiaTheoNgay(dNgay As Date, strNgoaiTe As String)
    Dim qry As QueryTable, rng As Range, I As Long, arrRes(1 To 3)
    LayTableTuWeb dNgay
    Set qry = ThisWorkbook.Sheets("webdata").QueryTables(1)
    Set rng = qry.ResultRange
    For I = 3 To rng.Rows.Count
        If StrComp(rng.Rows(I).Cells(, 2).Value, strNgoaiTe, vbTextCompare) = 0 Then
            arrRes(1) = rng.Rows(I).Cells(, 3).Value
            arrRes(2) = rng.Rows(I).Cells(, 4).Value
            arrRes(3) = rng.Rows(I).Cells(, 5).Value
            Exit For
        End If
    Next
    LayTyGiaTheoNgay = arrRes
End Function

Sub LayTableTuWeb(ByVal dNgay As Date)
    Dim qry As QueryTable
    Dim sh As Worksheet
    Dim CnnStr As String
    
    Set sh = ThisWorkbook.Sheets("webdata")
    'Xoa querytable truoc do
    XoaQT sh
    
    CnnStr = "URL;https://portal.vietcombank.com.vn/UserControls/TVPortal.TyGia/pListTyGia.aspx?txttungay=" & Format(dNgay, "dd/mm/yyyy")
    Set qry = sh.QueryTables.Add(CnnStr, sh.Range("A1"))
    'Query
    qry.WebSelectionType = xlSpecifiedTables
    qry.WebFormatting = xlWebFormattingNone
    qry.WebTables = """ctl00_Content_ExrateView""" 'hoan nhieu hon mot table
    qry.Refresh False 'Load du lieu
End Sub

Sub XoaQT(sh As Worksheet)
    Dim qry As QueryTable
    On Error Resume Next 'Bo qua loi
    For Each qry In sh.QueryTables
        qry.ResultRange.ClearContents 'Xoa data trong vung table
        qry.Delete 'Xoa QueryTable
    Next
End Sub
 

File đính kèm

Upvote 0
Đúng như tôi xem qua câu hỏi ban đầu. Để đơn giản bạn dùng phương pháp QueryTable mà tôi đã gửi link youtube hướng dẫn. Dùng nguyên kiến thức đó, kết hợp với code thêm về vòng lặp để so sánh là ra. File đính kém là toàn bộ mã nguồn.

Mã nguồn:
Mã:
Option Explicit

'Kien thuc code trong file nay ban xem link: https://www.youtube.com/watch?v=OSfcpLGVLOk

Sub LayTyGia()
    Range("J6:L6").Value = "Waiting..."
    Range("J6:L6").Value = LayTyGiaTheoNgay(Range("J2").Value, Range("J3").Value)
End Sub

Function LayTyGiaTheoNgay(dNgay As Date, strNgoaiTe As String)
    Dim qry As QueryTable, rng As Range, I As Long, arrRes(1 To 3)
    LayTableTuWeb dNgay
    Set qry = ThisWorkbook.Sheets("webdata").QueryTables(1)
    Set rng = qry.ResultRange
    For I = 3 To rng.Rows.Count
        If StrComp(rng.Rows(I).Cells(, 2).Value, strNgoaiTe, vbTextCompare) = 0 Then
            arrRes(1) = rng.Rows(I).Cells(, 3).Value
            arrRes(2) = rng.Rows(I).Cells(, 4).Value
            arrRes(3) = rng.Rows(I).Cells(, 5).Value
            Exit For
        End If
    Next
    LayTyGiaTheoNgay = arrRes
End Function

Sub LayTableTuWeb(ByVal dNgay As Date)
    Dim qry As QueryTable
    Dim sh As Worksheet
    Dim CnnStr As String
   
    Set sh = ThisWorkbook.Sheets("webdata")
    'Xoa querytable truoc do
    XoaQT sh
   
    CnnStr = "URL;https://portal.vietcombank.com.vn/UserControls/TVPortal.TyGia/pListTyGia.aspx?txttungay=" & Format(dNgay, "dd/mm/yyyy")
    Set qry = sh.QueryTables.Add(CnnStr, sh.Range("A1"))
    'Query
    qry.WebSelectionType = xlSpecifiedTables
    qry.WebFormatting = xlWebFormattingNone
    qry.WebTables = """ctl00_Content_ExrateView""" 'hoan nhieu hon mot table
    qry.Refresh False 'Load du lieu
End Sub

Sub XoaQT(sh As Worksheet)
    Dim qry As QueryTable
    On Error Resume Next 'Bo qua loi
    For Each qry In sh.QueryTables
        qry.ResultRange.ClearContents 'Xoa data trong vung table
        qry.Delete 'Xoa QueryTable
    Next
End Sub
Đúng là 1 bài toán có nhiều cách giải. Quan trọng người dùng cảm thấy happy với phương án nào.
 
Upvote 0
Nếu url trả về Table thì đơn giản, nếu trả về html không vẫn conver thành bảng được, mấy cái web có sử dụng token dùng power query vẫn xử lý được vì nó cho phép nhập header, power query trên BI thì xịn xò hơn nó tự conver json và htlm thành bảng luôn
Mình cũng có nêu ở bài #33 rồi đó.
 
Upvote 0
Cái query from web chỉ đơn giản là lấy dữ liệu từ một url về, và chỉ thế mà thôi. Mỗi lần thực hiện là phải tạo ra một query mới.
Chẳng có lý do gì để so sánh nó với Power Query cả, bởi nó chỉ là 1 chức năng.

Còn Power Query là một bộ công cụ/ thư viện hoàn chỉnh được tích hợp vào Excel, nó có môi trường viết mã lệnh (M code), cho phép thực hiện mã lệnh (tương tự như môi trường VBA).
Ngay cái phần web scraping có hẳn thư viện Web siêu hịn.
Chưa kể kết hợp với Html.Table, Json cho phép xử lý dữ liệu trả về ngon lành cành đào.

View attachment 264062
Nếu có điều kiện, mong anh chia sẻ những cái siêu hịn này ở 1 Topic mới, để anh/em GPE học hỏi.
Cảm ơn anh !!!
 
Upvote 0
Xin chào các Bác GPE,
Em cần giúp để lấy tỷ giá VCB về excel theo một vài mã cần và theo ngày ạ. Nếu được thì ngày nào cũng tự lấy về thì càng tốt ạ.
Em cảm ơn!
Một đoạn code mình thấy trên diễn đàn từ năm 2015 vẫn còn chạy được.

Option Explicit

Private Sub tygia_Click()
Dim objWeb As QueryTable
Dim sWebTable As String
'Trong ma html cua site nay ty gia duoc luu trong table thu 1
sWebTable = 1
Set objWeb = ActiveSheet.QueryTables.Add( _
Connection:="URL;http://www.vietcombank.com.vn/ExchangRates/", _
Destination:=Range("A1"))
With objWeb
.WebSelectionType = xlSpecifiedTables
.WebTables = sWebTable
.Refresh BackgroundQuery:=False
.SaveData = True
End With
Set objWeb = Nothing
End Sub

Hoặc thay = Url của befaint
https://portal.vietcombank.com.vn/U...spx?txttungay=11/08/2021&BacrhID=1&isEn=False
 
Lần chỉnh sửa cuối:
Upvote 0
Bây giờ làm cách nào để có 1 bảng với tất cả các tỷ giá trong 1 khoảng thời gian (ví dụ của tháng 7 từ 1-7-2021 đến 31-7-2021) mà không phải nhập từng ngày một vào B4 các bác nhỉ? Em nghĩ tới vòng lặp FOR nhưng mà không biết cách làm. Nhờ các thầy/ các tiền bối hướng dẫn
 
Upvote 0
Bây giờ làm cách nào để có 1 bảng với tất cả các tỷ giá trong 1 khoảng thời gian (ví dụ của tháng 7 từ 1-7-2021 đến 31-7-2021) mà không phải nhập từng ngày một vào B4 các bác nhỉ? Em nghĩ tới vòng lặp FOR nhưng mà không biết cách làm. Nhờ các thầy/ các tiền bối hướng dẫn
Quan trọng là trên web nó không có option để chọn từ ngày đến ngày. Chứ a nghĩ là lấy được @hoangminhtien
 
Upvote 0
Bây giờ làm cách nào để có 1 bảng với tất cả các tỷ giá trong 1 khoảng thời gian (ví dụ của tháng 7 từ 1-7-2021 đến 31-7-2021) mà không phải nhập từng ngày một vào B4 các bác nhỉ? Em nghĩ tới vòng lặp FOR nhưng mà không biết cách làm. Nhờ các thầy/ các tiền bối hướng dẫn
1. Viết 1 hàm UnionQuery: Union 2 query truyền vào (Query1, Query2)
2. Viết 1 hàm Query1 lấy kết quả theo 1 ngày truyền vào
3. Thủ tục chính: Dùng 1 vòng lặp theo i từ ngày đầu đến ngày cuối:
Nếu i = ngày đầu, Kq = query dữ liệu web của ngày đầu = Query1(ngày đầu)
Ngược lại (i > ngày đầu), lấy Kqi = query dữ liệu web của ngày i, dùng hàm UnionQuery union Kqi với Kq của (i-1):
 
Lần chỉnh sửa cuối:
Upvote 0
Quan trọng là trên web nó không có option để chọn từ ngày đến ngày. Chứ a nghĩ là lấy được @hoangminhtien
Dùng cách cơ bản thôi cũng được
PHP:
Sub Query1()
    Dim qry As QueryTable, StartDate As Date, EndDate As Date
    Dim CnnStr As String, iDate As Date, sh As Worksheet
    Dim NextRw As Long, NewLastRw As Long
    Set sh = Sheet2
    For I = sh.QueryTables.Count To 1 Step -1
        sh.QueryTables(I).Delete
    Next
    StartDate = sh.[B2]: EndDate = sh.[D2]
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    sh.Range("A4:F10000").ClearContents
    For iDate = StartDate To EndDate
        CnnStr = "URL;https://portal.vietcombank.com.vn/UserControls/TVPortal.TyGia/pListTyGia.aspx?txttungay=" & _
        Format(iDate, "dd/mm/yyyy")
        NextRw = sh.Range("B10000").End(xlUp).Row + 1
        Set qry = sh.QueryTables.Add(CnnStr, sh.Cells(NextRw, 2))
    With qry
        .WebSelectionType = xlSpecifiedTables
        .WebTables = """ctl00_Content_ExrateView"""
        .Refresh False
        .Refresh BackgroundQuery:=False
        .SaveData = True
    End With
        NewLastRw = sh.Range("B10000").End(xlUp).Row
        sh.Range(Cells(NextRw, 1), Cells(NewLastRw, 1)).Value = iDate
    Next
    Application.DisplayAlerts = True
        sh.Range("A3:F" & NewLastRw).AutoFilter Field:=4, Criteria1:="=Mua", _
        Operator:=xlOr, Criteria2:="=Ti" & ChrW(7873) & "n m" & ChrW(7863) & "t"
        Rows("4:" & NewLastRw).Delete Shift:=xlUp
        sh.ShowAllData
    Application.ScreenUpdating = True
    Set qry = Nothing
    Set sh = Nothing
End Sub
 
Upvote 0
Cách khác: Dùng vòng lặp trong Power Query
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}),
    KetQua = 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"})
 
in
    KetQua

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

1629428757754.png
 

File đính kèm

Upvote 0
Cách khác: Dùng vòng lặp trong Power Query
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}),
    KetQua = 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"})
 
in
    KetQua

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

View attachment 264396
Power Query đúng là công lực thượng thừa.
Rất tuyệt vời, đúng ý của @hoangminhtien kìa.
 
Upvote 0
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

Lần chỉnh sửa cuối:
Upvote 0
Cách khác: Dùng vòng lặp trong Power Query
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}),
    KetQua = 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"})
 
in
    KetQua

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

View attachment 264396
Bác @ptm0412 ơi, em dùng được 1 thời gian đến hôm này bị lỗi này ạ, Bác sửa giúp em với được không?
1631759554986.png
 
Upvote 0
Upvote 0
Upvote 0
Upvote 0

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

Back
Top Bottom