Tải hóa đơn điện tử (https://hoadondientu.gdt.gov.vn/) Excel Vba (1 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ổ sung Link tra cứu của 1 số nhà cung cấp giải pháp theo code trên stt #575 của mình:

 
Upvote 0

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

Back
Top Bottom