Xây dựng hàm lấy dữ liệu đơn lẻ của mã chứng khoán từ website về excel

Trạng thái
Không mở trả lời sau này.

trongnghia09

Yêu THVBA
Em xin chào các anh chị trong diễn đàn,
Em đang có nhu cầu lấy dữ liệu đơn lẻ của nhiều mã chứng khoán cùng lúc từ web về file excel.
Mục đích cuối cùng em muốn đạt được là có 1 hàm để 1 lấy dữ liệu bất kỳ (1 hàm chỉ cho 1 dữ liệu) từ web theo dữ liệu từ các ô khác trong excel và em hiểu được để có thể tự làm cho các phần khác.
Nếu có thời gian trống, kính mong các anh chị trong diễn đàn giúp đỡ.
Em cảm ơn anh chị rất nhiều ạ!

Mô tả về input và output như sau:
1) Nguồn dữ liệu sẽ được lấy từ trang web
2) Vị trí dữ liệu cần lấy theo các bước như hình sau
Bạn cần đăng nhập để thấy hình ảnh


Bạn cần đăng nhập để thấy hình ảnh


3) Kết quả nhận được là hàm để lấy dữ liệu có dạng như hình.
Bạn cần đăng nhập để thấy hình ảnh

Em xin cảm ơn các anh chị!
 
B

bvtvba

Guest
Xây dựng hàm là không khả thi trừ khi website đó có chia sẻ hàm API để chúng ta kết nối tới.
Xây dựng thủ tục lấy dữ liệu thì bạn tham khảo topic này:
 

trongnghia09

Yêu THVBA
dạ em cảm ơn @bvtvba.
Bài này em đã có tham khảo và thấy rất hay.
Em đang giảm yêu cầu mình xuống và tự làm trước trên cơ sở bài này.
Nếu có vấn đề gì chưa hiểu em sẽ hỏi và mong anh chị chỉ dạy thêm ạ.
 

trongnghia09

Yêu THVBA
em chào @bvtvba,
em đã dùng dữ liệu của bài trên để viết theo yêu cầu của bản thân và em đã làm được.
Tuy nhiên em đang gặp 1 vấn đề khó như sau:
Trong mỗi lần truy cập vào module_web em muốn lấy dữ liệu từ 2 tab khác nhau
Bạn cần đăng nhập để thấy hình ảnh


Tab mặc định em đã lấy được dữ liệu em muốn, giờ em muốn chuyển sang tab khác để lấy tiếp.
Ban đầu em dự định dùng cách click như cách các anh chị đã làm để lấy thêm 5 quý dữ liệu nhưng không được do cấu trúc khác.
Đoạn code em định dùng copy từ file tham khảo trên:
Set HTMLDoc = objIE.document
For Each oHTML_Element In HTMLDoc.getElementsByClassName("fa fa-caret-left")
oHTML_Element.Click
DoEvents
Application.Wait Now() + TimeSerial(0, 0, 2) 'cho 2s de web load hoan toan
Do While objIE.document.readyState <> "complete"
DoEvents
Sleep 100
Loop
Exit For
Next
Mong anh chị cho em xin ý kiến góp ý để em có thể chuyển tab được ạ.
Em xin cảm ơn!
 
T

thanhphong

Guest
Bạn lưu ý phải sử dụng thẻ Code khi viết code trên forum. Xin xem mục 4 trong .
Đối với trang web mà bạn đang thao tác:
Phần này họ dùng javascript nên code bạn tham khảo sẽ không sử dụng được, cần tự suy nghĩ giải quyết.
JavaScript:
function tabluuchuyentientegt() {
        $("#divPoints").unbind("click");
        loadPopupShow();
        //Thay doi id set tb_image
        //-------------------------------------
        change_tab = 4;
        var yearView = document.getElementById('year').value;
        var donvi = document.getElementById('donvi').value;

        var url = "/Enterprises/";
        if (tennganh == "NGAN HANG") {
            url = url + "LuuChuyenTienTegiantiep";
        } else if (tennganh == "BAO HIEM") {
            url = url + "LuuChuyenTienTegiantiep";

        //    /*HaiNM add new 2017-08-29*/
        } else if (tennganh == "CHUNG KHOAN") {
            url = url + "LuuChuyenTienTegiantiepCK";
        } else {
            url = url + "LuuChuyenTienTegiantiep";
        }

        $.ajax({
            url: url,
            data: { symbol: "MSH", YearView: yearView, period: period, donvi: donvi },
            cache: false,
            type: "GET",
            dataType: "html",
            success: function (data, textStatus, XMLHttpRequest) {
                loadPopupHide();
                $("#luuchuyentientegt").html(data); // HTML DOM replace
            }
        });

    }
 
B

bvtvba

Guest
Nếu chưa biết xử lý javascript thì cũng có thể dùng kiến thức cơ bản để giải quyết được.
Ví dụ trong trường hợp của bạn muốn lấy dữ liệu của tab chuyển tiền thệ gián tiếp, vậy thì đọc code javascirpt trên bạn có thể hình dung ra cách giải quyết như sau.
Đường link bạn đang lấy dữ liệu là:
Mã:
https://finance.tvsi.com.vn/Enterprises/FinancialStatements?symbol=MSH
Theo như javascript ở trên, thì để lấy dữ liệu chuyển tiền tệ gián tiếp có các trường hợp sau:
TH1: Đường link là:
Mã:
https://finance.tvsi.com.vn/Enterprises/LuuChuyenTienTegiantiep/FinancialStatements?symbol=MSH
TH2: Đường link là:
Mã:
https://finance.tvsi.com.vn/Enterprises/LuuChuyenTienTegiantiepCK/FinancialStatements?symbol=MSH
Do không biết mã chứng khoán công ty bạn muốn lấy về là bảo hiểm/ngân hàng hay là Chứng Khoán, vì vậy ta giả thiết cho macro truy cập cả hai đường link trên, đường link này có dữ liệu thì lấy.
TH1 ta thu được:
Bạn cần đăng nhập để thấy hình ảnh


TH2 ta thu được (không có dữ liệu):
Bạn cần đăng nhập để thấy hình ảnh


Vậy định nghĩa như thế nào là có dữ liệu? Nhìn vào hai kết quả trên tôi cho rằng, nếu truy cập web mà xuất hiện chữ :
Mã:
LƯU CHUYỂN TIỀN TỪ HOẠT ĐỘNG KINH DOANH
thì coi là có dữ liệu và lấy về. Việc định nghĩa như thế nào là có dữ liệu thì bạn có thể tùy ý suy nghĩ, miễn sao có sự khác nhau, đảm bảo khi không có dữ liệu thì keyword do chúng ta định nghĩa không xuất hiện, và khi có dữ liệu thì keyword này phải luôn luôn xuất hiện.
 

trongnghia09

Yêu THVBA
em xin cảm ơn @bvtvba và @thanhphong
Nhờ vào gợi ý của các anh chị, em đã giải quyết được yêu cầu của mình dựa trên cơ sở bài này.

Qua đây em xin được hỏi thêm 1 câu cũng dựa bài này ạ.
Trong bài có sử dụng 1 biến mảng toàn cục arr_lk để chứ dữ liệu mã CK và địa chỉ lưu file .html.
Em cũng tạo 1 mảng như trên với tên brr_lk
Bạn cần đăng nhập để thấy hình ảnh


Dữ liệu vẫn ghi vào brr_lk bình thường nhưng khi truy xuất thì báo Type mismatch.
Bạn cần đăng nhập để thấy hình ảnh

Trong khi đó arr_lk vẫn làm việc bình thường.
Như vậy lỗi do đâu ạ?
 

trongnghia09

Yêu THVBA
Bạn đã nạp cái j vào brr_lk rồi
em dùng brr_lk giống như arr_lk (giống dữ liệu chứ và cả khai báo).
Đến dòng lệnh báo lỗi đó thì brr_lk(1,1) đang chứa địa chỉ lưu file .hlml
Dữ liệu của file brr_lk em có thể hiện trong khung Watches ạ
 

trongnghia09

Yêu THVBA
Sao j lại chạy tợi Ubound(brr_lk,1) nhỉ. Tôi nghĩ phải chạy tới Ubound(brr_lk,2)
dạ vấn đề em đang gặp phải là không truy xuất được dữ liệu vào brr_lk.
Ví dụ vòng đầu tiên i=1; j=1 và brr_lk(1,1)=<type mismatch> mặc dù brr_lk(1,1) đang có dữ liệu ạ.
 

trongnghia09

Yêu THVBA
vậy đưa file demo lên đây để mọi người xem.
dạ được chứ ạ.

Em vẫn dựa trên file gốc để chỉnh sửa theo ý em.
Em xin gửi thêm anh chị file em đã chạy được trước khi thêm mảng brr_lk.
 
Sửa lần cuối:

tuhocvba

Administrator
Thành viên BQT
Khi đưa file lên để tái hiện lại lỗi mà bạn gặp phải, thì bạn nên mô phỏng chính xác những gì bạn làm.
Với file bạn đưa lên thì nó gặp lỗi ở đây:
Mã:
C:\tuhocvba20191012 VBA_Data_His
Có vẻ như đường dẫn này chưa tồn tại trên máy tính của tôi. Tôi cũng không có thời gian tìm hiểu nhiều hơn.
Để tránh làm mất thời gian của người khác, bạn nên mô tả chính xác những gì bạn làm, để người khác nhanh chóng tái hiện lại nơi mà bạn đang gặp lỗi.
Topic này sẽ khóa ở đây. Chúng tôi từ chối hỗ trợ topic này.
 
Trạng thái
Không mở trả lời sau này.
Top