Kiều Mạnh
I don't program, I beat code into submission!!!
- Tham gia
- 9/6/12
- Bài viết
- 5,538
- Được thích
- 4,132
- Giới tính
- Nam
1/ ý tưởng xuất phát từ chủ đề sau
www.giaiphapexcel.com
2/ Tôi đang viết thư viện GoogleSheets trên Delphi có sử dụng dữ liệu JSON nên nhân tiện thử dữ liệu Website của mục trên
3/ Viết riêng ra vài hàm chuyên cho xử lý dữ liệu của Website cafef.vn
xuất ra ba hàm API cơ bản sử dụng các thư viện thuần trên Delphi 12
1/ Hàm GetDataJSONFromCafefVN lấy tên theo trang Web để không nhầm lẫn sử dụng sai mục đích
lấy Web khác sẻ lỗi hàm trả về chuỗi JSON khi ta thử code sẻ thấy là

2/ Hàm JSONToArray chuyển mảng JSON của mục số 1 thành mảng gán lên Sheet của Excel ( Không sử dụng đa luồng )
3/ Hàm JSONToArrayMultiThreaded chuyển mảng JSON của mục số 1 thành mảng gán lên Sheet của Excel ( sử dụng đa luồng chạy song song )
hàm này tuỳ chỉnh tham số luồng chạy song song là 2,4,6,8 hay 20 luồng tuỳ theo cấu hình máy và là số chẳn
Tôi thử dữ liệu ít nó gần như nhau ... có lẻ sẻ có sự khác biệt khi chạy đa luồng cho dữ liệu lớn
Từ 3 hàm trên tuỳ chỉnh viết hàm phụ sử dụng cho sự kiện trên Sheet của VBA
Hình ảnh sử dụng trên Sheet chỉ cần gõ các tham số mục khoanh màu đỏ và nhận kết quả trả về trên Sheet

Lưu ý:
1/ File sau chỉ áp dụng cho Website như mô tả trên nếu áp dụng cho Website khác là lỗi
2/ Hàm JSONToArrayMultiThreaded chuyển chuỗi JSON sử dụng cho Sheet thì tuỳ theo dữ liệu JSON của từng Web có thể sử dụng tốt hay lỗi vì dữ liệu JSON có rất nhiều loại
và hàm này chưa xử xử lý hết mọi loại JSON. nếu muốn sử dụng cho Web khác thử xem nếu chạy thì dùng còn không thì bỏ
3/ quá trình sử dụng mọi phát sinh lỗi nếu có vui lòng mô tả chi tiết nếu được tôi sẻ điều chỉnh code cho phù hợp
4/ hai DLL luôn đi kèm file Excel trong cùng thư mục sử dụng cho 32 và 64 bit ... nếu Copy vào thự mục của Windows thì viết lại code trong VBA và loại bỏ Module mod_LoadLibrary ra khỏi file Excel

Lấy dữ liệu giá cổ phiếu từ website bằng Python hay code VBA
Kính gửi anh/chị trên diễn đàn, Em muốn lấy dữ liệu giá cổ phiếu trên website: https://s.cafef.vn/lich-su-giao-dich-vnindex-1.chn Anh/ chị hỗ trợ giúp em code Python hoặc VBA để lấy dữ liệu lịch sử giao dịch cổ phiếu giúp em ạ (Nếu có thể chọn thời gian lấy dữ liệu thì quá tốt ạ). Hiện tại khi...

2/ Tôi đang viết thư viện GoogleSheets trên Delphi có sử dụng dữ liệu JSON nên nhân tiện thử dữ liệu Website của mục trên
3/ Viết riêng ra vài hàm chuyên cho xử lý dữ liệu của Website cafef.vn
xuất ra ba hàm API cơ bản sử dụng các thư viện thuần trên Delphi 12
Mã:
Declare PtrSafe Function GetDataJSONFromCafefVN Lib "GoogleSheets64.dll" _
(ByVal Symbol As Variant, ByVal StartDate As Variant, _
ByVal EndDate As Variant, ByVal PageIndex As LongPtr, _
ByVal PageSize As LongPtr) As Variant
Rem ##########
Declare PtrSafe Function JSONToArray Lib "GoogleSheets64.dll" _
(ByVal JsonString As Variant, _
Optional ByRef IncludeHeaders As Boolean = True) As Variant
Rem ########## ThreadCount = so Luong tuy chinh 2,4,6 hay 20 luong la so chan
Declare PtrSafe Function JSONToArrayMultiThreaded Lib "GoogleSheets64.dll" _
(ByVal JsonString As Variant, _
Optional ByRef IncludeHeaders As Boolean = True, _
Optional ByVal ThreadCount As LongPtr = 0) As Variant
1/ Hàm GetDataJSONFromCafefVN lấy tên theo trang Web để không nhầm lẫn sử dụng sai mục đích
lấy Web khác sẻ lỗi hàm trả về chuỗi JSON khi ta thử code sẻ thấy là

2/ Hàm JSONToArray chuyển mảng JSON của mục số 1 thành mảng gán lên Sheet của Excel ( Không sử dụng đa luồng )
3/ Hàm JSONToArrayMultiThreaded chuyển mảng JSON của mục số 1 thành mảng gán lên Sheet của Excel ( sử dụng đa luồng chạy song song )
hàm này tuỳ chỉnh tham số luồng chạy song song là 2,4,6,8 hay 20 luồng tuỳ theo cấu hình máy và là số chẳn
Tôi thử dữ liệu ít nó gần như nhau ... có lẻ sẻ có sự khác biệt khi chạy đa luồng cho dữ liệu lớn
Từ 3 hàm trên tuỳ chỉnh viết hàm phụ sử dụng cho sự kiện trên Sheet của VBA
Mã:
Sub ImportDataFrom_CafefVN(Symbol As Variant, _
StartDate As Variant, EndDate As Variant, _
PageIndex As Long, PageSize As Long, _
Sh As Worksheet)
Rem ##########
Dim JSONData As Variant
Dim JSONToArr As Variant
Dim startTime As Single
Dim endTime As Single
Dim elapsedTime As Single
On Error GoTo ErrorHandler
startTime = Timer
Rem Goi hàm GetDataJSONFromCafefVN
JSONData = GetDataJSONFromCafefVN(Symbol, StartDate, EndDate, PageIndex, PageSize)
Rem 8 hay 10 là so luong tuy chinh khi su dung da luong song song
JSONToArr = JSONToArrayMultiThreaded(JSONData, True, 8) ' True = lay tieu de ; False = ko lay tieu de
Rem ### Neu may cu yeu thi thay the da luong sang ham sau
Rem JSONToArr = JSONToArray(JSONData, True) ' True = lay tieu de ; False = ko lay tieu de
Debug.Print "Row " & UBound(JSONToArr, 1)
Debug.Print "Cols " & UBound(JSONToArr, 2)
Rem Kiem tra du lieu tra ve
If IsEmpty(JSONToArr) Then
MsgBox "Du lieu tra ve rong"
Exit Sub
End If
Rem Gán ket qua lên Sheet (ví du tai ô A11)
Sh.Range("A11").Resize(UBound(JSONToArr, 1), UBound(JSONToArr, 2)).Value = JSONToArr
endTime = Timer
Rem Tính thoi gian dã chay
elapsedTime = endTime - startTime
Rem Hien thi thoi gian dã chay trên StatusBar
Application.StatusBar = "Elapsed Time: " & Format(elapsedTime, "0.000") & " seconds."
Exit Sub
ErrorHandler:
MsgBox "Ðã xay ra loi: " & Err.Description, vbCritical
End Sub
Hình ảnh sử dụng trên Sheet chỉ cần gõ các tham số mục khoanh màu đỏ và nhận kết quả trả về trên Sheet

Lưu ý:
1/ File sau chỉ áp dụng cho Website như mô tả trên nếu áp dụng cho Website khác là lỗi
2/ Hàm JSONToArrayMultiThreaded chuyển chuỗi JSON sử dụng cho Sheet thì tuỳ theo dữ liệu JSON của từng Web có thể sử dụng tốt hay lỗi vì dữ liệu JSON có rất nhiều loại
và hàm này chưa xử xử lý hết mọi loại JSON. nếu muốn sử dụng cho Web khác thử xem nếu chạy thì dùng còn không thì bỏ
3/ quá trình sử dụng mọi phát sinh lỗi nếu có vui lòng mô tả chi tiết nếu được tôi sẻ điều chỉnh code cho phù hợp
4/ hai DLL luôn đi kèm file Excel trong cùng thư mục sử dụng cho 32 và 64 bit ... nếu Copy vào thự mục của Windows thì viết lại code trong VBA và loại bỏ Module mod_LoadLibrary ra khỏi file Excel
File đính kèm
Lần chỉnh sửa cuối: