Tải hóa đơn điện tử (https://hoadondientu.gdt.gov.vn/) Excel Vba (2 người xem)

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

  • ongke0711

    Thành viên gắn bó
    Tham gia
    7/9/06
    Bài viết
    2,414
    Được thích
    3,302
    Giới tính
    Nam
    Chào các bạn,
    Tôi ngồi mò mẫm mấy ngày mới tìm được cách tải hóa đơn điện tử từ trang https://hoadondientu.gdt.gov.vn/. Cách này có thể không chuyên nghiệp nhưng cũng giải quyết được vấn đề tải hóa đơn hàng loạt từ trang trên và ghi xuống Excel theo định dạng dễ tổng hợp dữ liệu sau này.
    - Tốc độ không nhanh như các ứng dụng python siêu nhanh.
    - Chưa tìm được các link tải file .xml hoặc .html
    - Chưa trải nghiệm qua các định dạng hóa đơn điện tử của các nhà cung cấp giải pháp khác nhau nên sẽ không đảm bảo chạy đúng 100%.
    - Chưa biết cách tích hợp code vượt Captcha của (Python, C#..) vào VBA nên phải nhập Captcha thủ công.
    Nói chung cái tool cũng giải quyết được việc tải hóa đơn hàng loạt :D .
    Tôi sẽ upload file demo không khóa (có khóa cũng như không) sau vì code còn lộn xộn lắm. Các bạn xem qua và đóng góp cách xử lý tốt hơn, gọn hơn nhé.


    *** 12/10/2024: Cập nhật sửa một đống lỗi.
    *** 15/10/2024: Cập nhật sửa lỗi Null và nhập ngày tháng.
    *** 16/10/2024: Thêm tính năng lưu User/Pass.
    *** 20/10/2024: Sửa lỗi hiển thị ngày tháng, sửa và thêm một số code phụ trợ.
    *** 28/10/2024: Sửa lấy hóa đơn từ máy tính tiền.
    *** 07/11/2024: Sửa code trích xuất dữ liệu, thêm cột so sánh.
    *** 13/11/2024: Dùng code của bạn Hesanbi để tự động nhập Captcha. Thêm code lấy link tra cứu của VNPT và BKAV.
    *** 05/02/2025: Thêm code tải file Zip và trích xuất dữ liệu hóa đơn từ file XML. Sửa một số lỗi.
    *** 23/02/2025: Sửa lỗi hiển thị sai <Trạng thái hóa đơn>.
     

    File đính kèm

    Lần chỉnh sửa cuối:
    Buồn cho bạn, cho những ai đang vất vả về vấn đề này. Tôi đang cố gắng. Tại vì tôi cần làm đến đạt được sự hoàn hảo.
    Không chỉ tải về, lọc dữ liệu, giao diện hiện đại bát mắt. Công cụ xử lý tối ưu, cần đạt được tự động hóa nhiều hơn. Đưa mã vào Dll, Exe để tránh một số vấn đề.
     
    Upvote 0
    Cho mình hỏi sao tự nhiên không tải được các HĐ từ: Tổng cục thuế đã nhận hóa đơn có mã khởi tạo từ máy tính tiền (ttxly=8). Các bạn tải được không
    Ban ngày web hay bị lỗi, buổi tối ít người truy cập test thử load phát ăn ngay không lỗi lầm gì. Các bạn nên load từng tháng 1 để hạn chế lỗi.
     
    Upvote 0
    @muaroi2002
    Tải bất đồng bộ bạn phải sử dụng cách này để tải, tải đa luồng không cần thiết vì công cụ tải như WinHttp hay MSXML chúng tự xử lý đa luồng. Đa luồng nên dùng để xử lý tệp và dữ liệu. Trang nguồn cho phép gửi tối đa khoảng 30 yêu cầu trong một lần, sau đó phải đợi một khoảng thời gian mới được gửi lại yêu cầu tiếp theo, cái này tôi chưa thử, chưa chắc lắm. Khi bạn gửi 30 yêu cầu thì Server họ cũng phải mở nhiều luồng để xử lý, có giới hạn để nhường người khác còn được tải. Còn tùy vào băng thông và số lượng luồng ở server vào giờ tải cao điểm.


    Cái Tool đơn giản chỉ tải dữ liệu mà giá 2.000.000 ₫ – 3.000.000 ₫ ghê thiệt, họ quá giỏi kiếm tiền, nếu tôi chia sẻ tool của tôi có khi nào cũng kiếm được tiền như họ không. Tool còn bắt cài Python nữa cực vậy không biết.

    Không biết hiện tại có bạn nào trong chờ dự án của tôi không. Nghe mọi người than khổ về Kế toán nhiều không thấy vui mấy.

    Trước mắt chuẩn bị chia sẻ mọi người tool tải MST tự động captcha cho đỡ khổ trước.

    View attachment 309894
    Kể ra các bạn kế toán quá phụ thuộc vào các tiện ích kiểu này mà không tham gia giám sát kể từ khi phát sinh hợp đồng, giao dịch kinh tế là không ổn. Hoá đơn chỉ là 1 thành phần trong đó, có thể quản lý và lưu trữ thông qua email.
    Với mình thì chỉ cần tập hợp list tổng hợp hoá đơn vào cuối tháng để đối chiếu dữ liệu trên phần mềm xem có hạch toán sót đầu vào không. Thay vì tải 3 lần và ghép thành 1 file để sum thì sử dụng file ứng dụng như này là tiện lợi hơn rất nhiều.
    Tuy nhiên nếu có những tiện ích ưu việt hơn mình cũng mong muốn được trải nghiệm, đánh giá và ứng dụng vào thực tiễn nếu hữu dụng.
     
    Upvote 0

    File đính kèm

    • 5d19ea26aa8d20d3799c.jpg
      5d19ea26aa8d20d3799c.jpg
      33.1 KB · Đọc: 123
    Upvote 0
    Buồn cho bạn, cho những ai đang vất vả về vấn đề này. Tôi đang cố gắng. Tại vì tôi cần làm đến đạt được sự hoàn hảo.
    Không chỉ tải về, lọc dữ liệu, giao diện hiện đại bát mắt. Công cụ xử lý tối ưu, cần đạt được tự động hóa nhiều hơn. Đưa mã vào Dll, Exe để tránh một số vấn đề.

    Hiện nay, chính sách của Nhà nước đang khuyến khích các hộ kinh doanh chuyển đổi sang mô hình doanh nghiệp, công ty, vì vậy nhu cầu quản lý và theo dõi dữ liệu kế toán ngày càng gia tăng.
    Chỉ cần nhìn vào mức độ sôi động của chủ đề này là thấy rõ sự quan tâm và tham gia đông đảo của mọi người.

    Nếu phần mềm anh phát triển thực sự tốt và đảm bảo tính bảo mật, em rất mong anh xem xét triển khai dưới dạng thương mại, có xuất hóa đơn và khả năng truy xuất nguồn gốc rõ ràng. Điều này không chỉ giúp người dùng yên tâm sử dụng, mà còn tạo cho anh nguồn lực ổn định để duy trì, cải tiến và mở rộng sản phẩm.
     
    Upvote 0
    Em mới tìm ra được 1 điều: GDT sẽ giới hạn ở record thứ 489 nếu tải liên tục hoặc xem chi tiết liên tục. Có bác nào pass được đoạn này chưa ạ, có những tháng hơn 500 hóa đơn mà không cho tải hết, bị kill token, sau đó phải đợi vài phút mới cho đăng nhập lại thì khó khăn quá. Mong các bác góp ý để em hoàn thiện chỗ này ạ.
     
    Upvote 0
    @anh.nguyen287
    Tôi đã thử trên cả hai nền tảng phát hiện captcha là tesseract.js và tesseract dll c++ đều xử lý tốt captcha của trang trong một nốt nhạc

    tesseract.js trên trình duyệt thì có nhịp cảm thấy chậm
    1759824944894.png

    VBA + các hàm win32 api và DLL tesseract c++ (+ dữ liệu huấn luyện) là có thể đọc Captcha nhanh

    1759823976420.png
    Bài đã được tự động gộp:

    @tieutuvodanh192 chắc chắn rồi, tôi hướng đến ứng dụng hoàn thiện và bảo mật bạn nhé
     
    Lần chỉnh sửa cuối:
    Upvote 0
    Mình thấy cứ ràng dò MSTTCGP trước, không có thì dò tvandnkntt. Còn dò tvandnkntt ngay từ đầu hình như không ổn cho 1 số trường hợp (biết không ổn nhưng không biết giải thích thế nào)
    Chuẩn bạn ạ. Mình gặp 1 trường hợp MSTTCGP=0106870211 (CÔNG TY CỔ PHẦN ICORP), còn TVANDNKNTT = 0312303803 (CÔNG TY TNHH WIN TECH SOLUTION).
     
    Upvote 0
    Nằm trong cái sub taiHoaDon-Total() đó bạn.

    View attachment 309196

    View attachment 309197

    View attachment 309198
    Bài đã được tự động gộp:


    Cái này bạn cập nhật chi tiết trong sheet "Link tra cứu" đó bạn. Vì nhiều trường hợp hóa đơn quá nên tôi chỉ nhập một số cái đã biết thôi.
    vd: như hóa đơn của Xanh SM thì lại khác (MSTTCGP là chính MST của nó nên khi tìm lại không ra, link tra cứu là: https://gsm-einvoice.hilo.com.vn/... tôi chưa cập nhật vô.
    Xanh SM nó là link này cơ bác ah https://gsm$tenKhongDau-tt78.vnpt-invoice.com.vn/?strFkey=$mccqtValue"
     
    Upvote 0
    Code tải hoá đơn gốc (file PDF) từ link tra cứu.
    Chỉ mới làm được cho BKAV, còn các nhà khác chưa tải được và cũng nhiều nhà msttcgp quá nên tôi cũng làm biếng không phát triển tiếp luôn. :D
     

    File đính kèm

    Upvote 0
    1760330061517.png
    Mình mò làm cái này nó sẽ tải được toàn bộ file Zip tại trang https://hoadondientu.gdt.gov.vn/ theo điều kiện lọc và tự động trích file XML, html ra và đổi tên theo MSTNCC-KHHD-SOHĐ. Dữ liệu hóa đơn thì mình thấy tải về ổn và cho mình theo dõi quá trình lấy dữ liệu luôn. Còn lấy File PDF theo cách của bác @ongke0711 thì mình không kết hợp đc. Có vài tool của các bác lấy chi tiết và tổng hợp rất tốt dựa vào file xml tuy nhiên việc lấy file PDF thì mình chịu!
     
    Upvote 0
    View attachment 310030
    Mình mò làm cái này nó sẽ tải được toàn bộ file Zip tại trang https://hoadondientu.gdt.gov.vn/ theo điều kiện lọc và tự động trích file XML, html ra và đổi tên theo MSTNCC-KHHD-SOHĐ. Dữ liệu hóa đơn thì mình thấy tải về ổn và cho mình theo dõi quá trình lấy dữ liệu luôn. Còn lấy File PDF theo cách của bác @ongke0711 thì mình không kết hợp đc. Có vài tool của các bác lấy chi tiết và tổng hợp rất tốt dựa vào file xml tuy nhiên việc lấy file PDF thì mình chịu!
    Cho e xin với ạ?
     
    Upvote 0
    View attachment 310030
    Mình mò làm cái này nó sẽ tải được toàn bộ file Zip tại trang https://hoadondientu.gdt.gov.vn/ theo điều kiện lọc và tự động trích file XML, html ra và đổi tên theo MSTNCC-KHHD-SOHĐ. Dữ liệu hóa đơn thì mình thấy tải về ổn và cho mình theo dõi quá trình lấy dữ liệu luôn. Còn lấy File PDF theo cách của bác @ongke0711 thì mình không kết hợp đc. Có vài tool của các bác lấy chi tiết và tổng hợp rất tốt dựa vào file xml tuy nhiên việc lấy file PDF thì mình chịu!
    Gửi mình xem dc ko a
     
    Upvote 0
    Tool của admin @ongke0711 có chức năng tải được file xml mà . Tui vẫn đang dùng đấy
    Tool của admin @ongke0711 rất tốt, giúp ích rất nhiều cho các bạn làm kế toán. Mình mới kiểm tra lại, trước mình dùng bản 6.1 bị lỗi, nên mình dùng 5.1 và thêm một số khách hàng có link tra cứu riêng để phù hợp với đơn vị của mình. Mà mình không để ý có bản 6.1 GPE đáp ứng được gần như tất cả từ Xuất dữ liệu, lấy Link tra cứu, tải file xml,html.... Tuy nhiên việc lấy link dựa vào MSTNCC và MSTCCGP vẫn chưa đúng lắm, link lấy PDF của BKAV bên chi tiết XLM thì đúng còn bên sheet tổng hợp thì bị sai (mình mò rồi mà ko biết sửa :)). Rất cảm ơn @ongke0711 đã bỏ công sức và chia sẻ!
    Bài đã được tự động gộp:

    Mình kiểm tra lại chút và đóng gói file exe vì chạy chưa ổn định khi qua máy khác, chắc do Python và một số thư viện khác. Một phần do cũng không dành code.
     
    Lần chỉnh sửa cuối:
    Upvote 0
    Tool của admin @ongke0711 rất tốt, giúp ích rất nhiều cho các bạn làm kế toán. Mình mới kiểm tra lại, trước mình dùng bản 6.1 bị lỗi, nên mình dùng 5.1 và thêm một số khách hàng có link tra cứu riêng để phù hợp với đơn vị của mình. Mà mình không để ý có bản 6.1 GPE đáp ứng được gần như tất cả từ Xuất dữ liệu, lấy Link tra cứu, tải file xml,html.... Tuy nhiên việc lấy link dựa vào MSTNCC và MSTCCGP vẫn chưa đúng lắm, link lấy PDF của BKAV bên chi tiết XLM thì đúng còn bên sheet tổng hợp thì bị sai (mình mò rồi mà ko biết sửa :)). Rất cảm ơn @ongke0711 đã bỏ công sức và chia sẻ!
    Bài đã được tự động gộp:


    Mình kiểm tra lại chút và đóng gói file exe vì chạy chưa ổn định khi qua máy khác, chắc do Python và một số thư viện khác. Một phần do cũng không dành code.
    gửi mình code dc ko a
     
    Upvote 0
    Tool của admin @ongke0711 rất tốt, giúp ích rất nhiều cho các bạn làm kế toán.
    - Mình vẫn dùng trên Excel vì thấy tiện lợi và tự mình tùy biến được. Như bản này của bạn @ongke0711 mình cá nhân hóa mục Link tra cứu với các trường hợp ngoại lệ như: Tra cứu link theo MST người bán, Tra cứu link theo MSTTCGP và MST người bán...
    - Mình đang mày mò tìm hiểu cách điều chỉnh link tra cứu theo kiểu Click vào linh là xem được Hóa đơn, không phải nhập mã tra cứu nữa, cùng lắm là nhập mã capcha. Bác nào rành vụ này chỉ mình cách nhé.
     
    Upvote 0
    Bạn @ongke0711 chỉ giúp mình lấy cái Fkey này được không:
    HTML:
    <HDon>
    <DLHDon Id="DuLieuKy">
    <TTChung>
    <PBan>2.1.0</PBan>
    <THDon>Hóa đơn GTGT</THDon>
    <KHMSHDon>1</KHMSHDon>
    <KHHDon>K25TAA</KHHDon>
    <SHDon>31975</SHDon>
    <NLap>2025-09-30</NLap>
    <NBKe>0001-01-01</NBKe>
    <DVTTe>VND</DVTTe>
    <TGia>1</TGia>
    <HTTToan>TM/CK</HTTToan>
    <MSTTCGP>0100684378</MSTTCGP>
    <TTKhac>
    ...
    </TTKhac>
    </TTChung>
    <NDHDon>
    ...
    </NDHDon>
    </DLHDon>
    <DSCKS>
    ...
    </DSCKS>
    <Fkey>B252730833LZEYCGLDU2</Fkey>
    </HDon>
     
    Upvote 0
    - Mình đang mày mò tìm hiểu cách điều chỉnh link tra cứu theo kiểu Click vào linh là xem được Hóa đơn, không phải nhập mã tra cứu nữa, cùng lắm là nhập mã capcha. Bác nào rành vụ này chỉ mình cách nhé.
    Cái này phải làm riêng cho từng nhà cung cấp giải pháp thì được. Vì mỗi nhà có cái api lấy hoá đơn gốc khác nhau.
    Tôi có làm cho hoá đơn của BKAV bài trên đó (#511). Chỉ cần có link tra cứu, mã tra cứu và bấm tải là được rồi.

    Còn về cái msttcgp ở trên thì nó đã có trong sheet "link tra cứu" rồi thì nó sẽ tự trích xuất thôi bạn. Chỉ có vấn đề là cái link tra cứu có thể nó sẽ khác tuỳ theo MST người bán nữa nên phải thêm code check MST người bán là gì thì lấy link theo mã đó.

    Screenshot 2025-10-17 at 19.04.56.png
     
    Upvote 0
    Cái này phải làm riêng cho từng nhà cung cấp giải pháp thì được. Vì mỗi nhà có cái api lấy hoá đơn gốc khác nhau.
    Tôi có làm cho hoá đơn của BKAV bài trên đó (#511). Chỉ cần có link tra cứu, mã tra cứu và bấm tải là được rồi.

    Còn về cái msttcgp ở trên thì nó đã có trong sheet "link tra cứu" rồi thì nó sẽ tự trích xuất thôi bạn. Chỉ có vấn đề là cái link tra cứu có thể nó sẽ khác tuỳ theo MST người bán nữa nên phải thêm code check MST người bán là gì thì lấy link theo mã đó.

    View attachment 310057
    Ý mình hỏi mã tra cứu Fkey cuối HTML không nằm trong trường TTkhac mà nằm ngoài sau thẻ Hdon.
     
    Upvote 0
    Ý mình hỏi mã tra cứu Fkey cuối HTML không nằm trong trường TTkhac mà nằm ngoài sau thẻ Hdon.
    Nằm ngoài cùng thì đỡ mất chạy vòng lặp để duyệt. Bạn lấy thẳng giá trị của node luôn.
    xmlDoc.SelectSingleNode("/HDON/Fkey").Text

    Nếu như trong code của tôi thì chỗ code lấy mã tra cứu nó đi qua 2 trường hợp, nếu có thì nó Exit For. Bạn thêm trường hợp trên nữa để nó tìm.
     
    Upvote 0
    Bạn @ongke0711 chỉ giúp mình lấy cái Fkey này được không:
    HTML:
    <HDon>
    <DLHDon Id="DuLieuKy">
    <TTChung>
    <PBan>2.1.0</PBan>
    <THDon>Hóa đơn GTGT</THDon>
    <KHMSHDon>1</KHMSHDon>
    <KHHDon>K25TAA</KHHDon>
    <SHDon>31975</SHDon>
    <NLap>2025-09-30</NLap>
    <NBKe>0001-01-01</NBKe>
    <DVTTe>VND</DVTTe>
    <TGia>1</TGia>
    <HTTToan>TM/CK</HTTToan>
    <MSTTCGP>0100684378</MSTTCGP>
    <TTKhac>
    ...
    </TTKhac>
    </TTChung>
    <NDHDon>
    ...
    </NDHDon>
    </DLHDon>
    <DSCKS>
    ...
    </DSCKS>
    <Fkey>B252730833LZEYCGLDU2</Fkey>
    </HDon>
    Cái này sao mình thấy giống file gốc XML của nhà cung cấp thế, nếu có file gốc rồi thì bạn tự tải luôn chứ thường mình thấy VNPT không mã làm gì có fkey tra trên hoadondientu
    Bài đã được tự động gộp:

    Kể ra các bạn kế toán quá phụ thuộc vào các tiện ích kiểu này mà không tham gia giám sát kể từ khi phát sinh hợp đồng, giao dịch kinh tế là không ổn. Hoá đơn chỉ là 1 thành phần trong đó, có thể quản lý và lưu trữ thông qua email.
    Với mình thì chỉ cần tập hợp list tổng hợp hoá đơn vào cuối tháng để đối chiếu dữ liệu trên phần mềm xem có hạch toán sót đầu vào không. Thay vì tải 3 lần và ghép thành 1 file để sum thì sử dụng file ứng dụng như này là tiện lợi hơn rất nhiều.
    Tuy nhiên nếu có những tiện ích ưu việt hơn mình cũng mong muốn được trải nghiệm, đánh giá và ứng dụng vào thực tiễn nếu hữu dụng.
    Cái này đứng trên phương diện 1 công ty có bộ máy nhân sự hoàn chỉnh thì có thể nói được. Chứ nếu giả sử 1 công ty nhỏ lẻ, họ không thuê kế toán nội bộ làm mà chỉ dùng dịch vụ bên ngoài, giám đốc thì cứ đi mua hàng, ăn uống, chìa cái thông tin xuất hóa đơn ra rồi mặc kệ có hóa đơn hay không, khi này việc tập hợp chứng từ cho bên dịch vụ lại khó khăn
     
    Lần chỉnh sửa cuối:
    Upvote 0
    Cái này sao mình thấy giống file gốc XML của nhà cung cấp thế, nếu có file gốc rồi thì bạn tự tải luôn chứ thường mình thấy VNPT không mã làm gì có fkey tra trên hoadondientu
    Các hóa đơn VNPT lấy mã của cơ quan thuế làm key, mình hay làm thủ công để lấy, file của chủ thớt để tham khảo và chỉnh sửa theo ý của người sử dụng
    1761023301284.png
     
    Upvote 0
    Upvote 0
    Thấy bảo lên tờ khai, lên phụ lục giảm thuế các kiểu con đà điểu
    đúng rồi b, dạo này thấy nâng cấp lên bảng mới thấy tốc độ cải thiện nhanh hơn nhiều, lên luôn pl142 nên mình tiết kiệm thời gian hơn, tk thuế cũng lên đc mà mình tự chỉnh tay lại xíu. Các hóa đơn thay thay thế, điều chỉnh thì nó có tô màu cho mình và cũng copy ra 1 sheet riêng giúp mình luôn khá là tiện. So với file excel của ad post thì đc cái là mình chọn nhiều tháng đc ko cần phải tải từng tháng từng tháng. Mình là người dùng rồi nên bạn nào mua qua mình đc giảm 100k còn 400k ak b, mình ko biết nhắn z có bị cấm trong diễn đàn ko, nếu có thì e xóa comment ạ
     
    Upvote 0

    Bác thử site này xem.

    Liên kết: https://youtu.be/jY8-tZHEW5U
    trang đã tắt tính năng tra cứu MST rồi đúng không ạ.
     
    Upvote 0
    với ông VNPT này, nếu mà sử dụng web lưu trữ của vnpt thì link là mst-tt78.vnpt.....
    còn nếu web riêng thì chịu
    Mình đưa thêm link tra cứu theo MST người bán vào sheet Linktracuu.
    Tạo thêm công thức tra cứu theo 2 điều kiện: MST người bán và MSTTCGP: Tracuulink(MSTTCGP, MST) có thể khuyết 1 trong 2 điều kiện.
    Tùy biến code của bạn Ongke0711 đoạn lấy link:

    HTML:
                    Case "0100684378"   'VNPT
                        If Len(Mtc) > 0 Then 'Có ma tra cuu
                            If Len(Mtc) = 10 And Right(Mtc, 1) = "*" Then 'Hóa don Petrolimex
                                ws.Cells(row, 55).Value = "https://hoadon.petrolimex.com.vn/SearchInvoicebycode/?strFkey=" & Mtc
                            Else
                                If Len(Tracuulink("", MST)) > 0 Then 'Truong hop ten mien tuy bien
                                    ws.Cells(row, 55).Value = Tracuulink("", MST) & Mtc
                                Else 'Truong hop ten mien theo Mst
                                    ws.Cells(row, 55).Value = "https://" & MST & "-tt78.vnpt-invoice.com.vn/?strFkey=" & Mtc
                                End If
                            End If
                            
                        Else 'Không có ma tra cuu
                            If Len(Tracuulink("", MST)) > 0 Then 'Truong hop ten mien tuy bien theo MST
                                ws.Cells(row, 55).Value = Tracuulink("", MST) & Mccqt
                            Else 'Truong hop ten mien theo Mst
                                ws.Cells(row, 55).Value = "https://" & MST & "-tt78.vnpt-invoice.com.vn/?strFkey=" & Mccqt
                            End If
                        End If
     
    Upvote 0
    Mình đưa thêm link tra cứu theo MST người bán vào sheet Linktracuu.
    Tạo thêm công thức tra cứu theo 2 điều kiện: MST người bán và MSTTCGP: Tracuulink(MSTTCGP, MST) có thể khuyết 1 trong 2 điều kiện.
    Tùy biến code của bạn Ongke0711 đoạn lấy link:

    HTML:
                    Case "0100684378"   'VNPT
                        If Len(Mtc) > 0 Then 'Có ma tra cuu
                            If Len(Mtc) = 10 And Right(Mtc, 1) = "*" Then 'Hóa don Petrolimex
                                ws.Cells(row, 55).Value = "https://hoadon.petrolimex.com.vn/SearchInvoicebycode/?strFkey=" & Mtc
                            Else
                                If Len(Tracuulink("", MST)) > 0 Then 'Truong hop ten mien tuy bien
                                    ws.Cells(row, 55).Value = Tracuulink("", MST) & Mtc
                                Else 'Truong hop ten mien theo Mst
                                    ws.Cells(row, 55).Value = "https://" & MST & "-tt78.vnpt-invoice.com.vn/?strFkey=" & Mtc
                                End If
                            End If
                           
                        Else 'Không có ma tra cuu
                            If Len(Tracuulink("", MST)) > 0 Then 'Truong hop ten mien tuy bien theo MST
                                ws.Cells(row, 55).Value = Tracuulink("", MST) & Mccqt
                            Else 'Truong hop ten mien theo Mst
                                ws.Cells(row, 55).Value = "https://" & MST & "-tt78.vnpt-invoice.com.vn/?strFkey=" & Mccqt
                            End If
                        End If
    của ông VNPT đa dạng lắm, có Công ty thì đưa MST vào, có Công ty thì đưa tên viết tắt vào, ngồi mò mắc mệt
     
    Upvote 0
    Em sử dụng tính năng trích xuất dữ liệu chi tiết từ folder chứa XML mà bị báo thư mục không chứa file .xml có bác nào bị không ạ
     
    Upvote 0
    a/c nào có file xml của VNPT vs FPT cho em xin với ạ e cảm ơn ạ
     
    Upvote 0
    Amin trợ giúp ạ ! Nhập TTruong là "FKey" nhưng lấy dữ liệu sai tại TTruong "Searchkey"
     

    File đính kèm

    • IMG_20251027_132146.jpg
      IMG_20251027_132146.jpg
      14.9 KB · Đọc: 28
    Upvote 0
    Amin trợ giúp ạ ! Nhập TTruong là "FKey" nhưng lấy dữ liệu sai tại TTruong "Searchkey"
    Code của chương trình là sẽ lấy tất cả các ô có thông tin ở cột E (sheet LinkTraCuu) để lấy mã tra cứu. Trường nào có trước thì tìm trước, tìm được thì dừng lại. Vậy nên, bạn vào Cột E sheet LinkTraCuu đổi vị trí của 2 cái trường đó cho nhau.
    Bài đã được tự động gộp:

    Hoặc cũng có thể sửa lại đoạn tìm mã tra cứu: Tìm theo đích danh cái TTruong theo MSTTCGP, nếu không có thì mới tìm hết cả List TTruong.
     
    Upvote 0
    Code của chương trình là sẽ lấy tất cả các ô có thông tin ở cột E (sheet LinkTraCuu) để lấy mã tra cứu. Trường nào có trước thì tìm trước, tìm được thì dừng lại. Vậy nên, bạn vào Cột E sheet LinkTraCuu đổi vị trí của 2 cái trường đó cho nhau.
    Bài đã được tự động gộp:

    Hoặc cũng có thể sửa lại đoạn tìm mã tra cứu: Tìm theo đích danh cái TTruong theo MSTTCGP, nếu không có thì mới tìm hết cả List TTruong.
    Mình đã sửa cột E Fkey=>Searchkey và ngược lại nhưng dữ liệu vẫn lấy thông tin mã tra cứu tại Searchkey . Mã tra cứu đúng là tại trường Fkey
     
    Upvote 0
    Mình đã sửa cột E Fkey=>Searchkey và ngược lại nhưng dữ liệu vẫn lấy thông tin mã tra cứu tại Searchkey . Mã tra cứu đúng là tại trường Fkey
    Bạn lọc cột E, check lại từ trên xuống dưới, cho Fkey xuất hiện trước Searchkey. Hoặc viết thêm 1 code tìm chính xác theo mã TTruong của nhà cung cấp MSTTCGP.
     
    Upvote 0
    Admin trợ giúp cách chỉnh Tool lấy mã tra cứu của hoá đơn BKAV bị sai ạ
     

    File đính kèm

    • 1000009912.jpg
      1000009912.jpg
      12.5 KB · Đọc: 15
    • 1000009913.jpg
      1000009913.jpg
      24.3 KB · Đọc: 37
    Upvote 0
    Khi tải chi tiết hóa đơn thường Task bị treo tại hóa đơn 344/1264 (khoảng 3xx). Các bạn có cách nào tải tiếp được không
     
    Upvote 0
    Tôi thấy các bạn chưa tìm hiểu hết các chức năng của file ứng dụng thì phải. Tại form Tải hóa đơn có tùy chọn tải hóa đơn theo Kết quả kiểm tra: Bạn tải lần lượt từng trạng thái hoặc lưu riêng ra nếu cần.
     
    Upvote 0
    Xin lỗi anh chị vì không liên quan lắm đến chủ đề. Mình muốn hỏi cách tải hoá đơn gốc FPT từ file XML ạ (không biết mã để tra cứu).
     
    Upvote 0
    Xin lỗi anh chị vì không liên quan lắm đến chủ đề. Mình muốn hỏi cách tải hoá đơn gốc FPT từ file XML ạ (không biết mã để tra cứu).
    Bài đã được tự động gộp:

    Xin lỗi anh chị vì không liên quan lắm đến chủ đề. Mình muốn hỏi cách tải hoá đơn gốc FPT từ file XML ạ (không biết mã để tra cứu).
    Mình có email hóa đơn FPT nhưng cũng không có link tắt mà chỉ có thể tra theo Mã tra cứu thôi.
     
    Upvote 0
    @ongke0711 Bạn có thể nghiên cứu viết thêm chức năng tải XML cho từng hóa đơn cụ thể khi cần không. Ví dụ người dùng gặp hóa đơn Bkav chưa có link tra cứu thì mới cần tải về để xem.
     
    Upvote 0
    đúng rồi b, mình đang sửa lại captcha trước rồi mở lại
    Mở lại chi mắc công bạn ơi. Tốn kinh phí cho nguồn web của bạn bạn nhé.
    Vài hôm nữa tôi đăng add-in tải mã số thuế gợi ý captcha tự động miễn phí 100%. Bạn chỉ cần giới thiệu mọi người sử dụng là được. Ảnh thực tế Add-in tiện lợi như thế này bạn nhé

    1762942083513.png

    1762942808941.png
     
    Lần chỉnh sửa cuối:
    Upvote 0
    Mở lại chi mắc công bạn ơi. Tốn kinh phí cho nguồn web của bạn bạn nhé.
    Vài hôm nữa tôi đăng add-in tải mã số thuế gợi ý captcha tự động miễn phí 100%. Bạn chỉ cần giới thiệu mọi người sử dụng là được. Ảnh thực tế Add-in tiện lợi như thế này bạn nhé

    View attachment 310316

    View attachment 310317
    ước có thể tra cứu hàng loạt theo thời gian thực ah. em cám ơn anh đã chia sẻ!
     
    Upvote 0
    Chào các bạn,
    Tôi ngồi mò mẫm mấy ngày mới tìm được cách tải hóa đơn điện tử từ trang https://hoadondientu.gdt.gov.vn/. Cách này có thể không chuyên nghiệp nhưng cũng giải quyết được vấn đề tải hóa đơn hàng loạt từ trang trên và ghi xuống Excel theo định dạng dễ tổng hợp dữ liệu sau này.
    - Tốc độ không nhanh như các ứng dụng python siêu nhanh.
    - Chưa tìm được các link tải file .xml hoặc .html
    - Chưa trải nghiệm qua các định dạng hóa đơn điện tử của các nhà cung cấp giải pháp khác nhau nên sẽ không đảm bảo chạy đúng 100%.
    - Chưa biết cách tích hợp code vượt Captcha của (Python, C#..) vào VBA nên phải nhập Captcha thủ công.
    Nói chung cái tool cũng giải quyết được việc tải hóa đơn hàng loạt :D .
    Tôi sẽ upload file demo không khóa (có khóa cũng như không) sau vì code còn lộn xộn lắm. Các bạn xem qua và đóng góp cách xử lý tốt hơn, gọn hơn nhé.


    *** 12/10/2024: Cập nhật sửa một đống lỗi.
    *** 15/10/2024: Cập nhật sửa lỗi Null và nhập ngày tháng.
    *** 16/10/2024: Thêm tính năng lưu User/Pass.
    *** 20/10/2024: Sửa lỗi hiển thị ngày tháng, sửa và thêm một số code phụ trợ.
    *** 28/10/2024: Sửa lấy hóa đơn từ máy tính tiền.
    *** 07/11/2024: Sửa code trích xuất dữ liệu, thêm cột so sánh.
    *** 13/11/2024: Dùng code của bạn Hesanbi để tự động nhập Captcha. Thêm code lấy link tra cứu của VNPT và BKAV.
    *** 05/02/2025: Thêm code tải file Zip và trích xuất dữ liệu hóa đơn từ file XML. Sửa một số lỗi.
    *** 23/02/2025: Sửa lỗi hiển thị sai <Trạng thái hóa đơn>
    Chào các bạn,
    Tôi ngồi mò mẫm mấy ngày mới tìm được cách tải hóa đơn điện tử từ trang https://hoadondientu.gdt.gov.vn/. Cách này có thể không chuyên nghiệp nhưng cũng giải quyết được vấn đề tải hóa đơn hàng loạt từ trang trên và ghi xuống Excel theo định dạng dễ tổng hợp dữ liệu sau này.
    - Tốc độ không nhanh như các ứng dụng python siêu nhanh.
    - Chưa tìm được các link tải file .xml hoặc .html
    - Chưa trải nghiệm qua các định dạng hóa đơn điện tử của các nhà cung cấp giải pháp khác nhau nên sẽ không đảm bảo chạy đúng 100%.
    - Chưa biết cách tích hợp code vượt Captcha của (Python, C#..) vào VBA nên phải nhập Captcha thủ công.
    Nói chung cái tool cũng giải quyết được việc tải hóa đơn hàng loạt :D .
    Tôi sẽ upload file demo không khóa (có khóa cũng như không) sau vì code còn lộn xộn lắm. Các bạn xem qua và đóng góp cách xử lý tốt hơn, gọn hơn nhé.


    *** 12/10/2024: Cập nhật sửa một đống lỗi.
    *** 15/10/2024: Cập nhật sửa lỗi Null và nhập ngày tháng.
    *** 16/10/2024: Thêm tính năng lưu User/Pass.
    *** 20/10/2024: Sửa lỗi hiển thị ngày tháng, sửa và thêm một số code phụ trợ.
    *** 28/10/2024: Sửa lấy hóa đơn từ máy tính tiền.
    *** 07/11/2024: Sửa code trích xuất dữ liệu, thêm cột so sánh.
    *** 13/11/2024: Dùng code của bạn Hesanbi để tự động nhập Captcha. Thêm code lấy link tra cứu của VNPT và BKAV.
    *** 05/02/2025: Thêm code tải file Zip và trích xuất dữ liệu hóa đơn từ file XML. Sửa một số lỗi.
    *** 23/02/2025: Sửa lỗi hiển thị sai <Trạng thái hóa đơn>.
    A ơi sao e đăng nhập tải hóa đơn về xử lý tải về rất nhanh nhưng kết quả luôn trống. Em đã thử trên một máy tính khác và vẫn tải về được bình thường. a giúp em với ạ
     

    File đính kèm

    • Screenshot 2025-11-17 205159.png
      Screenshot 2025-11-17 205159.png
      158.2 KB · Đọc: 31
    Upvote 0
    Tôi đã chia sẻ ứng dụng tra cứu mã số thuế từ Tổng cục thuế có gợi ý captcha tại bài viết, các bạn có thể tải về tham khảo sử dụng.

     
    Upvote 0
    Chào các bạn,
    Tôi ngồi mò mẫm mấy ngày mới tìm được cách tải hóa đơn điện tử từ trang https://hoadondientu.gdt.gov.vn/. Cách này có thể không chuyên nghiệp nhưng cũng giải quyết được vấn đề tải hóa đơn hàng loạt từ trang trên và ghi xuống Excel theo định dạng dễ tổng hợp dữ liệu sau này.
    - Tốc độ không nhanh như các ứng dụng python siêu nhanh.
    - Chưa tìm được các link tải file .xml hoặc .html
    - Chưa trải nghiệm qua các định dạng hóa đơn điện tử của các nhà cung cấp giải pháp khác nhau nên sẽ không đảm bảo chạy đúng 100%.
    - Chưa biết cách tích hợp code vượt Captcha của (Python, C#..) vào VBA nên phải nhập Captcha thủ công.
    Nói chung cái tool cũng giải quyết được việc tải hóa đơn hàng loạt :D .
    Tôi sẽ upload file demo không khóa (có khóa cũng như không) sau vì code còn lộn xộn lắm. Các bạn xem qua và đóng góp cách xử lý tốt hơn, gọn hơn nhé.


    *** 12/10/2024: Cập nhật sửa một đống lỗi.
    *** 15/10/2024: Cập nhật sửa lỗi Null và nhập ngày tháng.
    *** 16/10/2024: Thêm tính năng lưu User/Pass.
    *** 20/10/2024: Sửa lỗi hiển thị ngày tháng, sửa và thêm một số code phụ trợ.
    *** 28/10/2024: Sửa lấy hóa đơn từ máy tính tiền.
    *** 07/11/2024: Sửa code trích xuất dữ liệu, thêm cột so sánh.
    *** 13/11/2024: Dùng code của bạn Hesanbi để tự động nhập Captcha. Thêm code lấy link tra cứu của VNPT và BKAV.
    *** 05/02/2025: Thêm code tải file Zip và trích xuất dữ liệu hóa đơn từ file XML. Sửa một số lỗi.
    *** 23/02/2025: Sửa lỗi hiển thị sai <Trạng thái hóa đơn>.
    bác cho hỏi vì sao ở chi tiết lại có hoá đơn lấy được tên hàng, có hoá đơn lại không lấy được tên hàng (hoá đơn Viettel, MBbank, và một số hoá đơn khác cột tên hàng toàn bị trống trơn)
     
    Upvote 0
    bác cho hỏi vì sao ở chi tiết lại có hoá đơn lấy được tên hàng, có hoá đơn lại không lấy được tên hàng (hoá đơn Viettel, MBbank, và một số hoá đơn khác cột tên hàng toàn bị trống trơn)
    Vì chương trình này lấy dữ liệu trên trang HDDT của cơ quan thuế, mà mấy ông đấy (Viettel, VNPT...) không gửi thông tin tên hàng hóa lên hệ thống của cơ quan thuế nên chương trình tra được nội dung "trống". Bạn vào tra cứu hóa đơn trên trang HDDT thuế, vào in hóa đơn của mấy ông đấy sẽ thấy nội dung hóa đơn không có tên hàng.
     
    Upvote 0
    bác nào có code sửa lại hoặc bổ sung của bác ongke phần lấy từ mã tra cứu link tra cứu của VNPT không. mình làm thử không được. cảm ơn các bác
     
    Upvote 0
    bác nào có code sửa lại hoặc bổ sung của bác ongke phần lấy từ mã tra cứu link tra cứu của VNPT không. mình làm thử không được. cảm ơn các bác
    Mình có tùy biến lại để cá nhân dùng mà dốt code, chắp vá nên ngại đưa lên. Đại thể nó thế này:

    1. Trường hợp 1: Có mã tra cứu (ký hiệu MTC)
    1. Số ký tự mã tra cứu = 10 -> Hóa đơn Xăng dầu Petrolimex: "https://hoadon.petrolimex.com.vn/SearchInvoicebycode/?strFkey=" & MTC
    Khác:
    2.1. Người bán có link riêng: Link&MTC, ví dụ link: https://tranphucable-tt78.vnpt-invoice.com.vn/?strFkey=MTC
    2.2. Link theo cấu trúc của VNPT: "https://" & MST & "-tt78.vnpt-invoice.com.vn/?strFkey=" & MTC

    2. Trường hợp 2: Không có mã tra cứu thì Lấy theo Mã cấp cơ quan thuế (Ký hiệu MCCQT) và mã Fkey trong file XML tải được
    2.1. Người bán có link riêng:
    2.1.1: Có mã Cấp cơ quan thuế: Link&MCCQT, ví dụ link: https://tranphucable-tt78.vnpt-invoice.com.vn/?strFkey=MCCQT
    2.1.1: Không mã Cấp cơ quan thuế thì tải XML về lấy mã Fkey: Link&Fkey, ví dụ link: https://tranphucable-tt78.vnpt-invoice.com.vn/?strFkey=Mã Fkey
    2.2. Link theo cấu trúc của VNPT
    2.1.1: Có mã Cấp cơ quan thuế: Link&MCCQT, ví dụ link: "https://" & MST & "-tt78.vnpt-invoice.com.vn/?strFkey=" & Mccqt
    2.1.1: Không mã Cấp cơ quan thuế thì tải XML về lấy mã Fkey: Link&Fkey, ví dụ link: "https://" & MST & "-tt78.vnpt-invoice.com.vn/?strFkey=" &Mã Fkey

    3. Trường hợp còn lại đa phần là hóa đơn mà người bán chính là VNPT: Không có link tra cứu
     
    Upvote 0
    Vì chương trình này lấy dữ liệu trên trang HDDT của cơ quan thuế, mà mấy ông đấy (Viettel, VNPT...) không gửi thông tin tên hàng hóa lên hệ thống của cơ quan thuế nên chương trình tra được nội dung "trống". Bạn vào tra cứu hóa đơn trên trang HDDT thuế, vào in hóa đơn của mấy ông đấy sẽ thấy nội dung hóa đơn không có tên hàng.
    cảm ơn bạn đã nhiệt tình. tuy nhiên, tôi hỏi có đính kèm nguồn có ý hỏi tác giả xem có giải pháp nào không chứ không phải là hỏi mọi người chung chung. còn để lấy tên hàng hoá cho những hoá đơn đó như bạn nói thì quá mất thời gian bởi sự thủ công, có cách khác nhanh hơn là ghép nó với lấy chi tiết từ xml. nếu tác giả có thể lấy được trực tiếp thì sẽ tốt hơn nhiều.
     
    Upvote 0
    cảm ơn bạn đã nhiệt tình. tuy nhiên, tôi hỏi có đính kèm nguồn có ý hỏi tác giả xem có giải pháp nào không chứ không phải là hỏi mọi người chung chung. còn để lấy tên hàng hoá cho những hoá đơn đó như bạn nói thì quá mất thời gian bởi sự thủ công, có cách khác nhanh hơn là ghép nó với lấy chi tiết từ xml. nếu tác giả có thể lấy được trực tiếp thì sẽ tốt hơn nhiều.
    Câu hỏi của bạn đơn giản ai cũng trả lời được, bởi vì mọi người hiểu được chương trình của tác giả và nguồn cấp dữ liệu mà tác giả truy xuất. Còn câu trả lời của mình thì bạn cũng chưa đọc kỹ thì phải.
     
    Upvote 0
    Mình có tùy biến lại để cá nhân dùng mà dốt code, chắp vá nên ngại đưa lên. Đại thể nó thế này:

    1. Trường hợp 1: Có mã tra cứu (ký hiệu MTC)
    1. Số ký tự mã tra cứu = 10 -> Hóa đơn Xăng dầu Petrolimex: "https://hoadon.petrolimex.com.vn/SearchInvoicebycode/?strFkey=" & MTC
    Khác:
    2.1. Người bán có link riêng: Link&MTC, ví dụ link: https://tranphucable-tt78.vnpt-invoice.com.vn/?strFkey=MTC
    2.2. Link theo cấu trúc của VNPT: "https://" & MST & "-tt78.vnpt-invoice.com.vn/?strFkey=" & MTC

    2. Trường hợp 2: Không có mã tra cứu thì Lấy theo Mã cấp cơ quan thuế (Ký hiệu MCCQT) và mã Fkey trong file XML tải được
    2.1. Người bán có link riêng:
    2.1.1: Có mã Cấp cơ quan thuế: Link&MCCQT, ví dụ link: https://tranphucable-tt78.vnpt-invoice.com.vn/?strFkey=MCCQT
    2.1.1: Không mã Cấp cơ quan thuế thì tải XML về lấy mã Fkey: Link&Fkey, ví dụ link: https://tranphucable-tt78.vnpt-invoice.com.vn/?strFkey=Mã Fkey
    2.2. Link theo cấu trúc của VNPT
    2.1.1: Có mã Cấp cơ quan thuế: Link&MCCQT, ví dụ link: "https://" & MST & "-tt78.vnpt-invoice.com.vn/?strFkey=" & Mccqt
    2.1.1: Không mã Cấp cơ quan thuế thì tải XML về lấy mã Fkey: Link&Fkey, ví dụ link: "https://" & MST & "-tt78.vnpt-invoice.com.vn/?strFkey=" &Mã Fkey

    3. Trường hợp còn lại đa phần là hóa đơn mà người bán chính là VNPT: Không có link tra cứu
    cho mình xin bản tuỳ biến với bạn ơi. mình cũng đang dùng file của Ongke, cám ơn tác giả rất nhiều. có file này tải hoá đơn, nhập chứng từ hàng loạt khá là tiện.
     
    Upvote 0
    cho mình xin bản tuỳ biến với bạn ơi. mình cũng đang dùng file của Ongke, cám ơn tác giả rất nhiều. có file này tải hoá đơn, nhập chứng từ hàng loạt khá là tiện.
    Code mình tùy biến lại và thêm 1 số hàm sau:
    1. Sửa Sub Tổng hợp:
    PHP:
    Sub ghiExcel_TongHop(ByVal jsonText As String, row As Long, ByVal loaiHD As Long, sSTT As Long)
        
        Dim jsTH As Object, item As Object, itm As Object, subItms As Object, subItms2 As Object, l As Long
        Dim ws As Worksheet
        Dim arrCol, arrColName
        
        On Error Resume Next
        
        arrCol = Array(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, _
            12, 13, 14, 15, 16, 17, 42, 43, 44, _
            47, 48, 49, 50, 51, 54)
        arrColName = Array("tlhdon", "khmshdon", "khhdon", "shdon", "tdlap", "dvtte", "tgia", "nbten", "nbmst", "nbdchi", _
            "nky", "mhdon", "ncma", "nmten", "nmmst", "nmdchi", "tgtcthue", "tgtkcthue", "tgtthue", _
            "ttcktmai", "tgtkhac", "tgtttbso", "tgtttbchu", "gchu", "msttcgp")
        
        Select Case loaiHD
            Case 1
                Set ws = ThisWorkbook.Sheets("TongHopHD_Mua")
            Case 2
                Set ws = ThisWorkbook.Sheets("TongHopHD_Ban")
        End Select
        
        Set jsTH = JsonConverter.ParseJSON(jsonText)
        
        Dim dataArray As Object, i As Long, v As Variant
        Set dataArray = jsTH("datas")
        For l = 1 To jsTH("datas").count
            'On Error Resume Next    'Bo qua cac loi khi khong tim thay cac item trong json,item = null
            '/Cot STT
            ws.Cells(row, 1).Value = sSTT
            
            For i = 0 To UBound(arrCol)
                v = dataArray(l)(arrColName(i))
                If v = "" Or IsNull(v) Then GoTo next_col
                Select Case arrColName(i)
                    Case "ncma", "nky", "ncnhat", "ntao", "ntnhan", "tdlap"
                        ws.Cells(row, arrCol(i)).Value = ISODate(v)
                    Case Else
                        ws.Cells(row, arrCol(i)).Value = v
                End Select
    next_col:
            Next i
            
            '/Ghi cac truong dac biet
            If Not dataArray(l)("thttltsuat") Is Nothing Then
                Set subItms = dataArray(l)("thttltsuat")
                If subItms.count > 0 Then
                    Dim c As Long
                    For c = 0 To subItms.count - 1  'Có tat ca 6 cot tsuat: KKKCT, KCT, 0%, 5%, 8%, 10%
                        Set subItms2 = subItms(c + 1)
                        ws.Cells(row, 18 + (4 * c)).Value = subItms2("tsuat")
                        ws.Cells(row, 19 + (4 * c)).Value = subItms2("thtien")
                        ws.Cells(row, 20 + (4 * c)).Value = subItms2("tthue")
                        ws.Cells(row, 21 + (4 * c)).Value = subItms2("gttsuat")
                    Next c
                End If
            End If
            
            If Not IsEmpty(dataArray(l)("thttlphi")) Then
                If Not dataArray(l)("thttlphi") Is Nothing Then
                    Set subItms = dataArray(l)("thttlphi")
                    If subItms.count > 0 Then
                        Set subItms2 = subItms(1)
                        ws.Cells(row, 45).Value = subItms2("tlphi")
                        ws.Cells(row, 46).Value = subItms2("tphi")
                    End If
                End If
            End If
            
            ws.Cells(row, 52).Value = arrTrangThai(CInt(dataArray(l)("tthai")), 1)
            ws.Cells(row, 53).Value = arrKQKTHoaDon(CInt(dataArray(l)("ttxly")) + 2, 1)
            
            '------------------------------------------------------------
            '/Lay Ma tra cuu + Link tra cuu
            'Khai bao cac bien:
            Dim Msttcgp As String  'Ma so thue to chuc cap giai phap HDDT
            Dim MST As String       'Ma so thue nguoi ban
            Dim Mccqt As String     'Ma cap co quan thue
            Dim Mtc As String         'Ma tra cuu
            Dim Keymtc As String  'Tên truong ma tra cuc
            
                MST = dataArray(l)("nbmst")
                Mccqt = ws.Cells(row, 13).Value
                'Mtc = ws.Cells(row, 56).Value
                'Kiem tra MSTTCGP, khong co thi dung TVANDNKNTT
                If Len(dataArray(l)("msttcgp")) > 0 Then
                Msttcgp = dataArray(l)("msttcgp")
                Else
                Msttcgp = dataArray(l)("tvandnkntt") 'Truong hop: Co quan thue nhan khong ma Và Hóa don tu máy tính tien
                ws.Cells(row, 54).Value = Msttcgp
                End If
                
                'Lay thong tin truong tra cuu chinh xac cua Nguoi ban hoac To chuc giai phap
                If Len(Tracuuma("", MST)) > 0 Then
                    Keymtc = Tracuuma("", MST)
                ElseIf Len(Tracuuma(Msttcgp, MST)) > 0 Then
                    Keymtc = Tracuuma(Msttcgp, MST)
                ElseIf Len(Tracuuma(Msttcgp, "")) > 0 Then
                    Keymtc = Tracuuma(Msttcgp, "")
                Else
                    Keymtc = ""
                End If
                ws.Cells(row, 58).Value = Keymtc 'Ghi ra cot BE de kiem tra key dung voi MST nguoi ban, hoac MST TCGP chua
                'ws.Cells(row, 57).Value = "Không có MTC" 'Khong co MTC
            '------------------------------------------------------------
            '/Lay Ma tra cuu
            
            'Lay thong tin tai truong: cttkhac
            If Not dataArray(l)("cttkhac") Is Nothing Then
            Set subItms = dataArray(l)("cttkhac")
            For Each itm In subItms
            'TH tim theo key cho truoc
            If Len(Keymtc) > 0 Then
                If itm("ttruong") = Keymtc And dicTenCotTC.Exists(Keymtc) Then
                        ws.Cells(row, 56).Value = itm("dlieu")
                        ws.Cells(row, 57).Value = "True" 'Dung key theo MST
                        Exit For
                End If
                
                Mtc = ws.Cells(row, 56).Value
                If Len(Mtc) = 0 Then
                        If dicTenCotTC.Exists(itm("ttruong")) Then
                            ws.Cells(row, 56).Value = itm("dlieu")
                            ws.Cells(row, 58).Value = itm("ttruong")
                            ws.Cells(row, 57).Value = "Sai Fkey" 'MST co truong tra cuu nhung không dung
                            Exit For
                        End If
                End If
                
            Else 'TH tim theo toan bo list
                    ws.Cells(row, 57).Value = "False"
                    If dicTenCotTC.Exists(itm("ttruong")) Then
                        ws.Cells(row, 56).Value = itm("dlieu")
                        ws.Cells(row, 58).Value = itm("ttruong")
                        ws.Cells(row, 57).Value = "Update Fkey" 'MST khong co truong tra cuu ma
                        Exit For
                    End If
            End If
            Next
            End If
    
            'Lay thong tin tai truong: ttkhac
            If Not dataArray(l)("ttkhac") Is Nothing Then
            Set subItms = dataArray(l)("ttkhac")
            For Each itm In subItms
            'TH tim theo key cho truoc
            If Len(Keymtc) > 0 Then
                If itm("ttruong") = Keymtc And dicTenCotTC.Exists(Keymtc) Then
                        ws.Cells(row, 56).Value = itm("dlieu")
                        ws.Cells(row, 57).Value = "True" 'Dung key theo MST
                        Exit For
                End If
                
                Mtc = ws.Cells(row, 56).Value
                If Len(Mtc) = 0 Then
                        If dicTenCotTC.Exists(itm("ttruong")) Then
                            ws.Cells(row, 56).Value = itm("dlieu")
                            ws.Cells(row, 58).Value = itm("ttruong")
                            ws.Cells(row, 57).Value = "Sai Fkey" 'MST co truong tra cuu nhung không dung
                            Exit For
                        End If
                End If
                
            Else 'TH tim theo toan bo list
                    ws.Cells(row, 57).Value = "False"
                    If dicTenCotTC.Exists(itm("ttruong")) Then
                        ws.Cells(row, 56).Value = itm("dlieu")
                        ws.Cells(row, 58).Value = itm("ttruong")
                        ws.Cells(row, 57).Value = "Update Fkey" 'MST khong co truong tra cuu ma
                        Exit For
                    End If
            End If
            Next
            End If
            
            '------------------------------------------------------------
            '/Lay link tra cuu
            Mtc = ws.Cells(row, 56).Value
            'Các truong hop dac biet
            Select Case Msttcgp
                Case "0100150619" 'BIDV
                    ws.Cells(row, 55).Value = Tracuulink(Msttcgp, "") & dataArray(l)("Fkey")
                
                'Truong hop ghep Link xem truc tiep Hoa don: Misa, Icrop, Fast, Vetc, Thái Son, Cyber, Visnam
                Case "0101243150", "0106870211", "0100727825", "0107500414", "0101300842", "0105232093", "0401486901"
                    ws.Cells(row, 55).Value = Tracuulink(Msttcgp, "") & Mtc
                            
                Case "0100684378"   'VNPT
                    If Len(Mtc) > 5 Then 'Có ma tra cuu
                        If Len(Mtc) = 10 And Right(Mtc, 1) = "*" Then 'Hóa don Petrolimex
                            ws.Cells(row, 55).Value = "https://hoadon.petrolimex.com.vn/SearchInvoicebycode/?strFkey=" & Mtc
                        Else
                            If Len(Tracuulink("", MST)) > 0 Then 'Truong hop ten mien tuy bien
                                ws.Cells(row, 55).Value = Tracuulink("", MST) & Mtc
                            Else 'Truong hop ten mien theo Mst
                                ws.Cells(row, 55).Value = "https://" & MST & "-tt78.vnpt-invoice.com.vn/?strFkey=" & Mtc
                            End If
                        End If
                            
                    Else 'Không có ma tra cuu
                        If Len(Tracuulink("", MST)) > 0 Then 'Truong hop ten mien tuy bien theo MST
                            If Len(Mccqt) > 0 Then 'Có ma co quan thue
                                ws.Cells(row, 55).Value = Tracuulink("", MST) & Mccqt
                            Else 'Khong co ma co quan thue
                                ws.Cells(row, 55).Value = Tracuulink("", MST) & "<Tai file XML lay ma tra cuu truong Fkey>"
                            End If
                        Else 'Truong hop ten mien theo Mst
                            If Len(Mccqt) > 0 Then 'Có ma co quan thue
                                ws.Cells(row, 55).Value = "https://" & MST & "-tt78.vnpt-invoice.com.vn/?strFkey=" & Mccqt
                            Else 'Khong co ma co quan thue
                                ws.Cells(row, 55).Value = "https://" & MST & "-tt78.vnpt-invoice.com.vn/?strFkey=" & "<Tai file XML lay ma tra cuu truong Fkey>"
                            End If
                        End If
                    End If
                    
                    Case "0105987432"  'Easy
                        ws.Cells(row, 55).Value = "https://" & MST & "hd.easyinvoice.com.vn/Search/?Fkey=" & Mtc & " Hoac: https://" & MST & "hd.easyinvoice.vn/Search/?Fkey=" & Mtc
                                  
                    Case "0106026495"  'M-INVOICE
                        ws.Cells(row, 55).Value = "https://tracuuhoadon.minvoice.com.vn/api/Search/SearchInvoice?type=PDF&masothue=" & MST & "&sobaomat=" & Mtc
                            
                    Case "0101360697"  'BKAV
                        If Len(Mccqt) > 0 Then
                            ws.Cells(row, 55).Value = "https://van.ehoadon.vn/Lookup?InvoiceGUID=" & """<ID cua file XML>"""
                            'ws.Cells(row, 56).Value = "Lay <DLHDon ID> cua file XML"
                        Else
                            ws.Cells(row, 55).Value = "Không có Link"
                        End If
                
                    Case Else 'Cac truong hop con lai
                        If Len(Tracuulink("", MST)) > 0 Then
                            ws.Cells(row, 55).Value = Tracuulink("", MST)
                        Else
                            If Len(Tracuulink(Msttcgp, MST)) > 0 Then
                                ws.Cells(row, 55).Value = Tracuulink(Msttcgp, MST)
                            Else
                                ws.Cells(row, 55).Value = Tracuulink(Msttcgp, "")
                            End If
                        End If
    
                End Select
            '------------------------------------------------------------------/
            'Tang so tt va so thu thu dong
            
            sSTT = sSTT + 1
            row = row + 1
            
    next_invoice:
        Next l
        
    End Sub

    2. Thêm hàm tra cứu tùy biến:
    PHP:
    Option Explicit
    Dim diclink As Object
    Dim dicmtc As Object
    
    Sub Taobangtracuulink() 'Tra cuu link theo MSTTCGP hoac va MST nguoi ban
    'Thay sub Linktracuu: Tra cuu link theo MSTTCGP
    Dim key As Variant, i
        Set diclink = CreateObject("Scripting.Dictionary")
        key = Sheets("LinkTraCuu").Range("B2:E" & Sheets("LinkTraCuu").Cells(Rows.count, "D").End(xlUp).row).Value
        For i = 1 To UBound(key)
        diclink(key(i, 1) & "-" & key(i, 2)) = key(i, 3)
        Next i
        Erase key
    End Sub
    
    Function Tracuulink(DK1, DK2 As String) As String 'Tao cong thuc tim kiem 2 dk
    Call Taobangtracuulink
    Tracuulink = diclink.item(DK1 & "-" & DK2)
    End Function
    
    Sub Taolisttruongmtc() 'Tra cuu ma theo MSTTCGP hoac va MST nguoi ban
    Dim key As Variant, i
        Set dicmtc = CreateObject("Scripting.Dictionary")
        key = Sheets("LinkTraCuu").Range("B2:E" & Sheets("LinkTraCuu").Cells(Rows.count, "A").End(xlUp).row).Value
        For i = 1 To UBound(key)
        dicmtc(key(i, 1) & "-" & key(i, 2)) = key(i, 4)
        Next i
        Erase key
    End Sub
    
    Function Tracuuma(DK1, DK2 As String) As String 'Tao cong thuc tim kiem 2 dk
    Call Taolisttruongmtc
    Tracuuma = dicmtc.item(DK1 & "-" & DK2)
    End Function

    3. Sửa hàm Isodate:
    PHP:
    Function ISODate(ByVal isoStr As String, Optional ToLocal As Boolean = True) As Date 'Tham sô True = Quy doi sang gio GMT+7: Viet Nam.
        Dim mainPart As String, offsetPart As String
        Dim d As Date, offsetSign As String
        Dim hOffset As Long, mOffset As Long, totalOffset As Double
        
        ' Loai bo chu Z và tách phan offset neu có
        isoStr = Trim(isoStr)
        
        If InStr(isoStr, "Z") > 0 Then
            mainPart = Replace(isoStr, "Z", "")
            offsetPart = ""
        ElseIf InStr(isoStr, "+") > 0 Then
            mainPart = Left(isoStr, InStr(isoStr, "+") - 1)
            offsetPart = Mid(isoStr, InStr(isoStr, "+"))
            offsetSign = "+"
        ElseIf InStr(isoStr, "-") > 10 Then
            mainPart = Left(isoStr, InStrRev(isoStr, "-") - 1)
            offsetPart = Mid(isoStr, InStrRev(isoStr, "-"))
            offsetSign = "-"
        Else
            mainPart = isoStr
            offsetPart = ""
        End If
        
        ' Xóa phan mili-giây neu có
        If InStr(mainPart, ".") > 0 Then
            mainPart = Left(mainPart, InStr(mainPart, ".") - 1)
        End If
        
        ' Thay "T" bang khoang trang de CDate hieu
        mainPart = Replace(mainPart, "T", " ")
        
        ' Chuyen sang kieu Date
        On Error Resume Next
        d = CDate(mainPart)
        On Error GoTo 0
        
        ' Xu ly offset (neu có)
        If offsetPart <> "" Then
            hOffset = CLng(Mid(offsetPart, 2, 2))
            mOffset = CLng(Mid(offsetPart, 5, 2))
            totalOffset = (hOffset + mOffset / 60) / 24
            
            If offsetSign = "+" Then
                d = d - totalOffset   ' UTC = local - offset
            ElseIf offsetSign = "-" Then
                d = d + totalOffset   ' UTC = local + offset
            End If
        End If
        
        ' Neu can chuyen sang gio Viet Nam (UTC+7)
        If ToLocal Then
            d = d + TimeSerial(7, 0, 0)
        End If
        
        ISODate = d
    End Function

    4. Tùy biến Sheet LinkTraCuu
    Khi gặp người bán có link tra cứu riêng thì thêm Link, MST của người bán, các cột còn lại thì tùy.
    Bài đã được tự động gộp:

    Code mình tùy biến lại và thêm 1 số hàm sau:
    1. Sửa Sub Tổng hợp:
    PHP:
    Sub ghiExcel_TongHop(ByVal jsonText As String, row As Long, ByVal loaiHD As Long, sSTT As Long)
       
        Dim jsTH As Object, item As Object, itm As Object, subItms As Object, subItms2 As Object, l As Long
        Dim ws As Worksheet
        Dim arrCol, arrColName
       
        On Error Resume Next
       
        arrCol = Array(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, _
            12, 13, 14, 15, 16, 17, 42, 43, 44, _
            47, 48, 49, 50, 51, 54)
        arrColName = Array("tlhdon", "khmshdon", "khhdon", "shdon", "tdlap", "dvtte", "tgia", "nbten", "nbmst", "nbdchi", _
            "nky", "mhdon", "ncma", "nmten", "nmmst", "nmdchi", "tgtcthue", "tgtkcthue", "tgtthue", _
            "ttcktmai", "tgtkhac", "tgtttbso", "tgtttbchu", "gchu", "msttcgp")
       
        Select Case loaiHD
            Case 1
                Set ws = ThisWorkbook.Sheets("TongHopHD_Mua")
            Case 2
                Set ws = ThisWorkbook.Sheets("TongHopHD_Ban")
        End Select
       
        Set jsTH = JsonConverter.ParseJSON(jsonText)
       
        Dim dataArray As Object, i As Long, v As Variant
        Set dataArray = jsTH("datas")
        For l = 1 To jsTH("datas").count
            'On Error Resume Next    'Bo qua cac loi khi khong tim thay cac item trong json,item = null
            '/Cot STT
            ws.Cells(row, 1).Value = sSTT
           
            For i = 0 To UBound(arrCol)
                v = dataArray(l)(arrColName(i))
                If v = "" Or IsNull(v) Then GoTo next_col
                Select Case arrColName(i)
                    Case "ncma", "nky", "ncnhat", "ntao", "ntnhan", "tdlap"
                        ws.Cells(row, arrCol(i)).Value = ISODate(v)
                    Case Else
                        ws.Cells(row, arrCol(i)).Value = v
                End Select
    next_col:
            Next i
           
            '/Ghi cac truong dac biet
            If Not dataArray(l)("thttltsuat") Is Nothing Then
                Set subItms = dataArray(l)("thttltsuat")
                If subItms.count > 0 Then
                    Dim c As Long
                    For c = 0 To subItms.count - 1  'Có tat ca 6 cot tsuat: KKKCT, KCT, 0%, 5%, 8%, 10%
                        Set subItms2 = subItms(c + 1)
                        ws.Cells(row, 18 + (4 * c)).Value = subItms2("tsuat")
                        ws.Cells(row, 19 + (4 * c)).Value = subItms2("thtien")
                        ws.Cells(row, 20 + (4 * c)).Value = subItms2("tthue")
                        ws.Cells(row, 21 + (4 * c)).Value = subItms2("gttsuat")
                    Next c
                End If
            End If
           
            If Not IsEmpty(dataArray(l)("thttlphi")) Then
                If Not dataArray(l)("thttlphi") Is Nothing Then
                    Set subItms = dataArray(l)("thttlphi")
                    If subItms.count > 0 Then
                        Set subItms2 = subItms(1)
                        ws.Cells(row, 45).Value = subItms2("tlphi")
                        ws.Cells(row, 46).Value = subItms2("tphi")
                    End If
                End If
            End If
           
            ws.Cells(row, 52).Value = arrTrangThai(CInt(dataArray(l)("tthai")), 1)
            ws.Cells(row, 53).Value = arrKQKTHoaDon(CInt(dataArray(l)("ttxly")) + 2, 1)
           
            '------------------------------------------------------------
            '/Lay Ma tra cuu + Link tra cuu
            'Khai bao cac bien:
            Dim Msttcgp As String  'Ma so thue to chuc cap giai phap HDDT
            Dim MST As String       'Ma so thue nguoi ban
            Dim Mccqt As String     'Ma cap co quan thue
            Dim Mtc As String         'Ma tra cuu
            Dim Keymtc As String  'Tên truong ma tra cuc
           
                MST = dataArray(l)("nbmst")
                Mccqt = ws.Cells(row, 13).Value
                'Mtc = ws.Cells(row, 56).Value
                'Kiem tra MSTTCGP, khong co thi dung TVANDNKNTT
                If Len(dataArray(l)("msttcgp")) > 0 Then
                Msttcgp = dataArray(l)("msttcgp")
                Else
                Msttcgp = dataArray(l)("tvandnkntt") 'Truong hop: Co quan thue nhan khong ma Và Hóa don tu máy tính tien
                ws.Cells(row, 54).Value = Msttcgp
                End If
               
                'Lay thong tin truong tra cuu chinh xac cua Nguoi ban hoac To chuc giai phap
                If Len(Tracuuma("", MST)) > 0 Then
                    Keymtc = Tracuuma("", MST)
                ElseIf Len(Tracuuma(Msttcgp, MST)) > 0 Then
                    Keymtc = Tracuuma(Msttcgp, MST)
                ElseIf Len(Tracuuma(Msttcgp, "")) > 0 Then
                    Keymtc = Tracuuma(Msttcgp, "")
                Else
                    Keymtc = ""
                End If
                ws.Cells(row, 58).Value = Keymtc 'Ghi ra cot BE de kiem tra key dung voi MST nguoi ban, hoac MST TCGP chua
                'ws.Cells(row, 57).Value = "Không có MTC" 'Khong co MTC
            '------------------------------------------------------------
            '/Lay Ma tra cuu
           
            'Lay thong tin tai truong: cttkhac
            If Not dataArray(l)("cttkhac") Is Nothing Then
            Set subItms = dataArray(l)("cttkhac")
            For Each itm In subItms
            'TH tim theo key cho truoc
            If Len(Keymtc) > 0 Then
                If itm("ttruong") = Keymtc And dicTenCotTC.Exists(Keymtc) Then
                        ws.Cells(row, 56).Value = itm("dlieu")
                        ws.Cells(row, 57).Value = "True" 'Dung key theo MST
                        Exit For
                End If
               
                Mtc = ws.Cells(row, 56).Value
                If Len(Mtc) = 0 Then
                        If dicTenCotTC.Exists(itm("ttruong")) Then
                            ws.Cells(row, 56).Value = itm("dlieu")
                            ws.Cells(row, 58).Value = itm("ttruong")
                            ws.Cells(row, 57).Value = "Sai Fkey" 'MST co truong tra cuu nhung không dung
                            Exit For
                        End If
                End If
               
            Else 'TH tim theo toan bo list
                    ws.Cells(row, 57).Value = "False"
                    If dicTenCotTC.Exists(itm("ttruong")) Then
                        ws.Cells(row, 56).Value = itm("dlieu")
                        ws.Cells(row, 58).Value = itm("ttruong")
                        ws.Cells(row, 57).Value = "Update Fkey" 'MST khong co truong tra cuu ma
                        Exit For
                    End If
            End If
            Next
            End If
    
            'Lay thong tin tai truong: ttkhac
            If Not dataArray(l)("ttkhac") Is Nothing Then
            Set subItms = dataArray(l)("ttkhac")
            For Each itm In subItms
            'TH tim theo key cho truoc
            If Len(Keymtc) > 0 Then
                If itm("ttruong") = Keymtc And dicTenCotTC.Exists(Keymtc) Then
                        ws.Cells(row, 56).Value = itm("dlieu")
                        ws.Cells(row, 57).Value = "True" 'Dung key theo MST
                        Exit For
                End If
               
                Mtc = ws.Cells(row, 56).Value
                If Len(Mtc) = 0 Then
                        If dicTenCotTC.Exists(itm("ttruong")) Then
                            ws.Cells(row, 56).Value = itm("dlieu")
                            ws.Cells(row, 58).Value = itm("ttruong")
                            ws.Cells(row, 57).Value = "Sai Fkey" 'MST co truong tra cuu nhung không dung
                            Exit For
                        End If
                End If
               
            Else 'TH tim theo toan bo list
                    ws.Cells(row, 57).Value = "False"
                    If dicTenCotTC.Exists(itm("ttruong")) Then
                        ws.Cells(row, 56).Value = itm("dlieu")
                        ws.Cells(row, 58).Value = itm("ttruong")
                        ws.Cells(row, 57).Value = "Update Fkey" 'MST khong co truong tra cuu ma
                        Exit For
                    End If
            End If
            Next
            End If
           
            '------------------------------------------------------------
            '/Lay link tra cuu
            Mtc = ws.Cells(row, 56).Value
            'Các truong hop dac biet
            Select Case Msttcgp
                Case "0100150619" 'BIDV
                    ws.Cells(row, 55).Value = Tracuulink(Msttcgp, "") & dataArray(l)("Fkey")
               
                'Truong hop ghep Link xem truc tiep Hoa don: Misa, Icrop, Fast, Vetc, Thái Son, Cyber, Visnam
                Case "0101243150", "0106870211", "0100727825", "0107500414", "0101300842", "0105232093", "0401486901"
                    ws.Cells(row, 55).Value = Tracuulink(Msttcgp, "") & Mtc
                           
                Case "0100684378"   'VNPT
                    If Len(Mtc) > 5 Then 'Có ma tra cuu
                        If Len(Mtc) = 10 And Right(Mtc, 1) = "*" Then 'Hóa don Petrolimex
                            ws.Cells(row, 55).Value = "https://hoadon.petrolimex.com.vn/SearchInvoicebycode/?strFkey=" & Mtc
                        Else
                            If Len(Tracuulink("", MST)) > 0 Then 'Truong hop ten mien tuy bien
                                ws.Cells(row, 55).Value = Tracuulink("", MST) & Mtc
                            Else 'Truong hop ten mien theo Mst
                                ws.Cells(row, 55).Value = "https://" & MST & "-tt78.vnpt-invoice.com.vn/?strFkey=" & Mtc
                            End If
                        End If
                           
                    Else 'Không có ma tra cuu
                        If Len(Tracuulink("", MST)) > 0 Then 'Truong hop ten mien tuy bien theo MST
                            If Len(Mccqt) > 0 Then 'Có ma co quan thue
                                ws.Cells(row, 55).Value = Tracuulink("", MST) & Mccqt
                            Else 'Khong co ma co quan thue
                                ws.Cells(row, 55).Value = Tracuulink("", MST) & "<Tai file XML lay ma tra cuu truong Fkey>"
                            End If
                        Else 'Truong hop ten mien theo Mst
                            If Len(Mccqt) > 0 Then 'Có ma co quan thue
                                ws.Cells(row, 55).Value = "https://" & MST & "-tt78.vnpt-invoice.com.vn/?strFkey=" & Mccqt
                            Else 'Khong co ma co quan thue
                                ws.Cells(row, 55).Value = "https://" & MST & "-tt78.vnpt-invoice.com.vn/?strFkey=" & "<Tai file XML lay ma tra cuu truong Fkey>"
                            End If
                        End If
                    End If
                   
                    Case "0105987432"  'Easy
                        ws.Cells(row, 55).Value = "https://" & MST & "hd.easyinvoice.com.vn/Search/?Fkey=" & Mtc & " Hoac: https://" & MST & "hd.easyinvoice.vn/Search/?Fkey=" & Mtc
                                 
                    Case "0106026495"  'M-INVOICE
                        ws.Cells(row, 55).Value = "https://tracuuhoadon.minvoice.com.vn/api/Search/SearchInvoice?type=PDF&masothue=" & MST & "&sobaomat=" & Mtc
                           
                    Case "0101360697"  'BKAV
                        If Len(Mccqt) > 0 Then
                            ws.Cells(row, 55).Value = "https://van.ehoadon.vn/Lookup?InvoiceGUID=" & """<ID cua file XML>"""
                            'ws.Cells(row, 56).Value = "Lay <DLHDon ID> cua file XML"
                        Else
                            ws.Cells(row, 55).Value = "Không có Link"
                        End If
               
                    Case Else 'Cac truong hop con lai
                        If Len(Tracuulink("", MST)) > 0 Then
                            ws.Cells(row, 55).Value = Tracuulink("", MST)
                        Else
                            If Len(Tracuulink(Msttcgp, MST)) > 0 Then
                                ws.Cells(row, 55).Value = Tracuulink(Msttcgp, MST)
                            Else
                                ws.Cells(row, 55).Value = Tracuulink(Msttcgp, "")
                            End If
                        End If
    
                End Select
            '------------------------------------------------------------------/
            'Tang so tt va so thu thu dong
           
            sSTT = sSTT + 1
            row = row + 1
           
    next_invoice:
        Next l
       
    End Sub

    2. Thêm hàm tra cứu tùy biến:
    PHP:
    Option Explicit
    Dim diclink As Object
    Dim dicmtc As Object
    
    Sub Taobangtracuulink() 'Tra cuu link theo MSTTCGP hoac va MST nguoi ban
    'Thay sub Linktracuu: Tra cuu link theo MSTTCGP
    Dim key As Variant, i
        Set diclink = CreateObject("Scripting.Dictionary")
        key = Sheets("LinkTraCuu").Range("B2:E" & Sheets("LinkTraCuu").Cells(Rows.count, "D").End(xlUp).row).Value
        For i = 1 To UBound(key)
        diclink(key(i, 1) & "-" & key(i, 2)) = key(i, 3)
        Next i
        Erase key
    End Sub
    
    Function Tracuulink(DK1, DK2 As String) As String 'Tao cong thuc tim kiem 2 dk
    Call Taobangtracuulink
    Tracuulink = diclink.item(DK1 & "-" & DK2)
    End Function
    
    Sub Taolisttruongmtc() 'Tra cuu ma theo MSTTCGP hoac va MST nguoi ban
    Dim key As Variant, i
        Set dicmtc = CreateObject("Scripting.Dictionary")
        key = Sheets("LinkTraCuu").Range("B2:E" & Sheets("LinkTraCuu").Cells(Rows.count, "A").End(xlUp).row).Value
        For i = 1 To UBound(key)
        dicmtc(key(i, 1) & "-" & key(i, 2)) = key(i, 4)
        Next i
        Erase key
    End Sub
    
    Function Tracuuma(DK1, DK2 As String) As String 'Tao cong thuc tim kiem 2 dk
    Call Taolisttruongmtc
    Tracuuma = dicmtc.item(DK1 & "-" & DK2)
    End Function

    3. Sửa hàm Isodate:
    PHP:
    Function ISODate(ByVal isoStr As String, Optional ToLocal As Boolean = True) As Date 'Tham sô True = Quy doi sang gio GMT+7: Viet Nam.
        Dim mainPart As String, offsetPart As String
        Dim d As Date, offsetSign As String
        Dim hOffset As Long, mOffset As Long, totalOffset As Double
       
        ' Loai bo chu Z và tách phan offset neu có
        isoStr = Trim(isoStr)
       
        If InStr(isoStr, "Z") > 0 Then
            mainPart = Replace(isoStr, "Z", "")
            offsetPart = ""
        ElseIf InStr(isoStr, "+") > 0 Then
            mainPart = Left(isoStr, InStr(isoStr, "+") - 1)
            offsetPart = Mid(isoStr, InStr(isoStr, "+"))
            offsetSign = "+"
        ElseIf InStr(isoStr, "-") > 10 Then
            mainPart = Left(isoStr, InStrRev(isoStr, "-") - 1)
            offsetPart = Mid(isoStr, InStrRev(isoStr, "-"))
            offsetSign = "-"
        Else
            mainPart = isoStr
            offsetPart = ""
        End If
       
        ' Xóa phan mili-giây neu có
        If InStr(mainPart, ".") > 0 Then
            mainPart = Left(mainPart, InStr(mainPart, ".") - 1)
        End If
       
        ' Thay "T" bang khoang trang de CDate hieu
        mainPart = Replace(mainPart, "T", " ")
       
        ' Chuyen sang kieu Date
        On Error Resume Next
        d = CDate(mainPart)
        On Error GoTo 0
       
        ' Xu ly offset (neu có)
        If offsetPart <> "" Then
            hOffset = CLng(Mid(offsetPart, 2, 2))
            mOffset = CLng(Mid(offsetPart, 5, 2))
            totalOffset = (hOffset + mOffset / 60) / 24
           
            If offsetSign = "+" Then
                d = d - totalOffset   ' UTC = local - offset
            ElseIf offsetSign = "-" Then
                d = d + totalOffset   ' UTC = local + offset
            End If
        End If
       
        ' Neu can chuyen sang gio Viet Nam (UTC+7)
        If ToLocal Then
            d = d + TimeSerial(7, 0, 0)
        End If
       
        ISODate = d
    End Function

    4. Tùy biến Sheet LinkTraCuu
    Khi gặp người bán có link tra cứu riêng thì thêm Link, MST của người bán, các cột còn lại thì tùy.
    5. Sub Chi tiết thì dựa theo Sub Tổng hợp để sửa lại đoạn lấy Link và lấy Mã
     
    Upvote 0

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

    Back
    Top Bottom