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

Liên hệ QC

ongke0711

Thành viên gắn bó
Tham gia
7/9/06
Bài viết
2,260
Được thích
2,998
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.
 

File đính kèm

Lần chỉnh sửa cuối:
Khi mở file excel có thông báo Enable content hay securities gì không bạn? Chắc để đổi qua dùng hàm tự nhập captcha (của @HeSanbi, @huhumalu) để tránh lỗi của web browser control.
Không luôn ạ. Bình thường file marco tải về vẫn hay bị khóa sẵn, em unblock luôn rồi nhưng vẫn không hiểu còn thiếu gì mà ko hiện capcha để nhập như m.n (@$%@ (@$%@
 
Upvote 0
Tải được xml hông anh trai, cần nhất cái xml hihi
Tải được chứ xml, html. Nhưng tôi thấy có nhiều loại hoá đơn không có hồ sơ gốc nên sẽ không có file xml. Vậy nếu chỉ dựa trên XML sẽ thiếu hoá đơn (hoá đơn tct không cấp mã).
 
Upvote 0
Tải được chứ xml, html. Nhưng tôi thấy có nhiều loại hoá đơn không có hồ sơ gốc nên sẽ không có file xml. Vậy nếu chỉ dựa trên XML sẽ thiếu hoá đơn (hoá đơn tct không cấp mã).
Tải được XML và HTML là quá ngon rồi bác, Một số nơi chỉ cần hóa đơn in ra từ Thuế là được chấp nhận rồi không cần hóa đơn gốc ( trừ những hóa đơn in ra không thấy được mặt hàng)
Bài đã được tự động gộp:

Tải được chứ xml, html. Nhưng tôi thấy có nhiều loại hoá đơn không có hồ sơ gốc nên sẽ không có file xml. Vậy nếu chỉ dựa trên XML sẽ thiếu hoá đơn (hoá đơn tct không cấp mã).
Một số phần mềm nó bán 50k/1000 file xml tải về đó bác :D
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Không luôn ạ. Bình thường file marco tải về vẫn hay bị khóa sẵn, em unblock luôn rồi nhưng vẫn không hiểu còn thiếu gì mà ko hiện capcha để nhập như m.n (@$%@ (@$%@
Bạn thử mở ứng dụng Excel trước với quyền Administrator rồi từ nó mở file excel này xem như thế nào nhé.
(Bấm phải chuột vào ứng dụng Excel, chọn Run as administrator)
 
Upvote 0
Không luôn ạ. Bình thường file marco tải về vẫn hay bị khóa sẵn, em unblock luôn rồi nhưng vẫn không hiểu còn thiếu gì mà ko hiện capcha để nhập như m.n (@$%@ (@$%@
Theo KN của mình thì bạn bấm vô ra 1,2 lần vào khung nhập Capcha, nó sẽ hiện lên phần Enable content!
 
Upvote 0
Tôi đã xử lý dc pdf, xml bằng python. 1 lần đăng nhập là sài dc 24h, ko cần đăng nhập nhiều lần, đang cải tiền vụ lý bảng kê xml và tra cứu mst hàng loạt tích hợp xong rồi mới phát hành cho mọi người tham khảo.
 
Upvote 0
Mã rất đơn giản như sau:

Gọi lệnh này cho một Control để mở Menu popup chọn ngày tháng
MakeDatePickerPopupMenuContext ComboBox1
JavaScript:
'                    _,
' ___   _   _  _ ___(_)
'/ __| / \ | \| | _ | |
'\__ \/ \ \| \\ | _ \ |
'|___/_/ \_|_|\_|___/_|
'

Private Const ProjectUDFName = "UDFDataValidationList"
Private Const ProjectUDFFileName = "UDFDataValidationList"
Private Const ProjectUDFVersion = "1.00"

Option Explicit
Option Compare Text

Const DatePickerPopupYears = 1
Const DatePickerPopupMonths = 2
Const DatePickerPopupDays = 3
Const DatePickerPopupToDay = 4
Dim Navigate&, ActionIndex&, vAruments
Sub MakeDatePickerPopupMenuContext(ByVal control As Object)

  On Error Resume Next
  Dim o, o1, o2, io, i%, k, y0&, Y&, D&, c$, m$, b As Boolean, gr As Boolean, cap$, tag$, lyear&, lmonth&

  Dim pickerType&
  Y = year(Date): cap = "Ch" & ChrW(7885) & "n n" & ChrW(259) & "m:"
  D = DatePickerPopupYears: Navigate = D: pickerType = D
  m = ProjectUDFName & "_PopupYears": GoSub m
 
  If b Then
    D = DatePickerPopupToDay:
    i = 1: c = "H" & ChrW(244) & "m nay": GoSub addButton
    D = DatePickerPopupYears: gr = True
    For i = 1 To 15: c = Y - i + 1:  tag = "year" & i: GoSub addButton: Next
  End If
  cap = "Ch" & ChrW(7885) & "n th" & ChrW(225) & "ng:"
  D = DatePickerPopupMonths: m = ProjectUDFName & "_PopupMonths": GoSub m: Set o1 = o
  If b Then For i = 1 To 12: c = i: tag = "month" & i: GoSub addButton: Next
  cap = "Ch" & ChrW(7885) & "n ng" & ChrW(224) & "y:": D = DatePickerPopupDays: m = ProjectUDFName & "_PopupDays": GoSub m: Set o2 = o
  If b Then For i = 1 To 31: c = i: tag = "day" & i: GoSub addButton: Next
l1:
  If Navigate = D Then
    Y = Day(DateSerial(lyear, lmonth + 1, 0))
    For i = 29 To 31: o.Controls(i + 1).Visible = i <= Y: Next
  End If
l2:
  io.ShowPopup
  i = ActionIndex
 

  If i > 0 Then
    ActionIndex = 0
    Select Case Navigate
    Case DatePickerPopupYears:: Navigate = DatePickerPopupMonths: lyear = io.Controls(i + 1).caption: Set io = o1: GoTo l2
    Case DatePickerPopupMonths: Navigate = DatePickerPopupDays:  lmonth = io.Controls(i).caption: Set io = o2: GoTo l1
    Case DatePickerPopupDays: k = DateSerial(lyear, lmonth, io.Controls(i).caption): GoSub v
    Case DatePickerPopupToDay: k = Date:  GoSub v
    Case Else: k = io.Controls(i).caption: GoSub v
    End Select
  End If

Exit Sub
v:
  control.value = k
Return
m: b = False
  Err.Clear:  Set o = Application.CommandBars(m)
 
  ' If Err = 0 Then o.Delete
  If Err Then b = True: Set o = Application.CommandBars.add(m, msoBarPopup, , True)
  If D = pickerType Then Set io = o
  If o.FindControl(tag:=cap) Is Nothing Then
    With o.Controls.add
      .Style = msoButtonAutomatic
      .caption = cap
      .Enabled = False
      .tag = cap
    End With
  End If
Return
addButton:
  If Not o.FindControl(tag:=tag) Is Nothing Then Return
  With o.Controls.add '(msoButtonCaption)
    .Style = msoButtonAutomatic
    .caption = c
    .OnAction = "'" & ThisWorkbook.name & "'!'UDFDataValidationList_callback " & CStr(i + 1) & "," & D & ",""" & c & """'"
    .faceid = 21847
    .BeginGroup = gr: gr = False
    .tag = tag
  End With
Return
End Sub

Sub UDFDataValidationList_callback(Index&, direction&, ParamArray aruments())

  ActionIndex = Index
  vAruments = aruments
  Select Case direction
  Case DatePickerPopupToDay: Navigate = direction
  End Select
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0

À.. do tôi gõ sai chính tả + chưa sửa số thứ tự cột.
JavaScript:
subItms("tphi") ==> subItms2("tphi")
Bạn tải lại file rồi chạy kiểm tra xem nhé.
Tôi tải 700 cái hóa đơn tổng và ghi chừng 600 dòng hóa đơn chi tiết là báo lỗi 429 của web là "có quá nhiều yêu cầu được gửi" nên web sẽ chặn lại. Bạn tải vừa vừa thôi nhé. Đây vẫn còn là cái hạn chế của cái tool tôi viết.
(Tôi có thêm 2 cột ở sheet Chi tiết, bắt chước của bạn @hoamattroicoi để kiểm tra tiền thuế :D vì thấy có người yêu cầu)
 
Lần chỉnh sửa cuối:
Upvote 0
Em thử cái mới nhất thì không thấy lỗi gì cả, mà em thấy ở Sheets tổng hợp đầy đủ các chỉ tiêu mà sao ở chi tiết mình cũng không làm như vậy anh nhỉ, em thấy xử lý tất cả các chỉ tiêu ở Sheets chi tiết sẽ đỡ loạn hơn là nhảy qua nhảy lại ở Sheets Tổng hợp, quan điểm cá nhân ạ
 
Upvote 0
Em thử cái mới nhất thì không thấy lỗi gì cả, mà em thấy ở Sheets tổng hợp đầy đủ các chỉ tiêu mà sao ở chi tiết mình cũng không làm như vậy anh nhỉ, em thấy xử lý tất cả các chỉ tiêu ở Sheets chi tiết sẽ đỡ loạn hơn là nhảy qua nhảy lại ở Sheets Tổng hợp, quan điểm cá nhân ạ
Nếu chỉ ghi thông tin toàn bộ vào sheet Chi tiết thì đỡ bớt một công đoạn trích xuất dữ liệu, nó sẽ nhanh hơn. Tôi không biết bên kế toán có cần thông tin bên sheet Tổng hợp không nên làm cả 2.
 
Upvote 0
Nếu chỉ ghi thông tin toàn bộ vào sheet Chi tiết thì đỡ bớt một công đoạn trích xuất dữ liệu, nó sẽ nhanh hơn. Tôi không biết bên kế toán có cần thông tin bên sheet Tổng hợp không nên làm cả 2.
nên để sheet tổng hợp và sheet chi tiết riêng bác ạ, để còn coi thuế GTGT tự tính và thuế trên tổng hợp có chênh lệch không, nếu lệch còn biết mà xử lý
Bài đã được tự động gộp:

Tôi đã xử lý dc pdf, xml bằng python. 1 lần đăng nhập là sài dc 24h, ko cần đăng nhập nhiều lần, đang cải tiền vụ lý bảng kê xml và tra cứu mst hàng loạt tích hợp xong rồi mới phát hành cho mọi người tham khảo.
Làm sao để inbox riêng, cho em hỏi về tool tải HĐ gốc
 
Upvote 0
Web KT

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

Back
Top Bottom