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
3,000
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:
Nay em mới có thời gian để test thử file của anh, tốc độ có vẻ bất ổn anh ạ, em thử tải data của 2 ngày thôi mà Excel đơ và phải mất khoảng 34 giây.
Nếu cần tải dữ liệu 1 tháng thì có thể không gồng nổi, liệu VBA có gánh nổi nhiệm vụ này không. :unknw:

1729045773064.png
 
Upvote 0
- Em đăng nhập bị lỗi khi có mở thêm file excel khác như thế này

Lỗi đăng nhập xong thì không hiện khung nhập ngày tháng.png

- Tương tự lỗi nhập ngày tháng khi có mở file excel khác

Lỗi .png

- Khi gặp những lỗi này thì khá bất tiện khi phải đăng nhập lại từ đầu tài khoản và mật khẩu, nếu có thêm phần lưu tài khoản đăng nhập gần nhất thì quá ok ạ
- Mà sao không tải luôn cả hóa đơn không mã của cơ quan thuế và Máy tính tiền cùng 1 lúc luôn cho tiện mà lại phải tách ra cho cực công ạ
Này là quan điểm cá nhân ạ, không có ý công kích hay bắt lỗi gì nhé !
 
Upvote 0
Nay em mới có thời gian để test thử file của anh, tốc độ có vẻ bất ổn anh ạ, em thử tải data của 2 ngày thôi mà Excel đơ và phải mất khoảng 34 giây.
Nếu cần tải dữ liệu 1 tháng thì có thể không gồng nổi, liệu VBA có gánh nổi nhiệm vụ này không. :unknw:

View attachment 304799
2 ngày khoảng bao nhiêu hoá đơn vậy bạn? Còn bên chi tiết nó ra bao nhiêu dòng?
Về tốc độ thì code lấy dữ liệu của tôi chưa làm theo cách của bạn Hesanbi chỉ nên vẫn còn dùng lệnh ngưng mỗi hoá đơn để chờ web xử lý nên nó sẽ lâu.
Bài đã được tự động gộp:

- Em đăng nhập bị lỗi khi có mở thêm file excel khác như thế này



- Tương tự lỗi nhập ngày tháng khi có mở file excel khác



- Khi gặp những lỗi này thì khá bất tiện khi phải đăng nhập lại từ đầu tài khoản và mật khẩu, nếu có thêm phần lưu tài khoản đăng nhập gần nhất thì quá ok ạ
- Mà sao không tải luôn cả hóa đơn không mã của cơ quan thuế và Máy tính tiền cùng 1 lúc luôn cho tiện mà lại phải tách ra cho cực công ạ
Này là quan điểm cá nhân ạ, không có ý công kích hay bắt lỗi gì nhé !
Việc lưu tài khoản đăng nhập cho lần sau thì dễ thôi bạn. Vì tôi sợ mấy bạn muốn bảo mật nên không viết để lưu thôi.
Còn việc tải tất cả hoá đơn để tôi xem lại. Tôi làm theo mẫu của trang hđđt thôi.
 
Upvote 0
Dữ liệu hóa đơn mua vào trong 2 ngày em test thử khoảng 52 hóa đơn anh nha
1729048361163.png

Em cũng mới test thử hóa đơn bán ra trong 2 ngày, số lượng 131 hóa đơn, bị đơ và bị báo lỗi anh ạ.
1729048414426.png


1729048302596.png
 

File đính kèm

  • 1729048323695.png
    1729048323695.png
    4.7 KB · Đọc: 8
  • 1729048356507.png
    1729048356507.png
    6.1 KB · Đọc: 8
Upvote 0
Dữ liệu hóa đơn mua vào trong 2 ngày em test thử khoảng 52 hóa đơn anh nha


Em cũng mới test thử hóa đơn bán ra trong 2 ngày, số lượng 131 hóa đơn, bị đơ và bị báo lỗi anh ạ.



View attachment 304800
Oh.. số lượng hđ ít vậy thì không thể lâu đến mấy chục giây, để tôi xem lại, có thể do lỗi xử lý dữ liệu nên nó bị treo. Bị rớt mạng nó cũng bị treo lâu và tôi chưa bẫy lỗi Time out này.
 
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.
em bấm TẢI HOÁ ĐƠN thì bị báo như file đính kèm ạ
 

File đính kèm

Upvote 0
Mình mới tải lại File bạn mới Update, nói chung tốc độ tải rất nhanh. Tuy nhiên mình tải thử hóa đơn đầu vào không có mã cơ quan thuế thì lại không lấy được ngày lập hóa đơn và ngày ký!z5935025818241_319d34e68d47f4992e0524e4a1a29f8d.jpg
 
Upvote 0
Mình mới tải lại File bạn mới Update, nói chung tốc độ tải rất nhanh. Tuy nhiên mình tải thử hóa đơn đầu vào không có mã cơ quan thuế thì lại không lấy được ngày lập hóa đơn và ngày ký!View attachment 304806
Tôi cũng mới phát hiện cái lỗi này và đã sửa vào file bài #1 nhé.
Do lấy sai tên cột cho ngày hóa đơn "tdlap" chứ không phải "ncma" :) .
Bài đã được tự động gộp:

Đã sửa lỗi:
- Sai ngày hóa đơn (không hiện ngày).
- Sửa lỗi khi nhập ngày tháng ở các máy có thiết lập định dạng ngày tháng theo kiểu USA (mm/dd/yyyy) hoặc Việt Nam (dd/mm/yyyy). Qui ước của tool là nhập kiểu : dd/mm/yyyy.
- Thêm tùy chọn [Tất cả] cho mục "Kết quả kiểm tra".

Có một vấn đề nữa là đối với một số nhà cung cấp giải pháp, tôi không tìm được chỗ để lấy mã tra cứu, bạn nào biết thì chia sẻ nhé.
- BKAV: https://van.ehoadon.vn/TCHD
- FPT: https://hoadon.ftg.vn/
- https://portaltool-miennam.vnpt-invoice.com.vn/
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi cũng mới phát hiện cái lỗi này và đã sửa vào file bài #1 nhé.
Do lấy sai tên cột cho ngày hóa đơn "tdlap" chứ không phải "ncma" :) .
Bài đã được tự động gộp:

Đã sửa lỗi:
- Sai ngày hóa đơn (không hiện ngày).
- Sửa lỗi khi nhập ngày tháng ở các máy có thiết lập định dạng ngày tháng theo kiểu USA (mm/dd/yyyy) hoặc Việt Nam (dd/mm/yyyy). Qui ước của tool là nhập kiểu : dd/mm/yyyy.
- Thêm tùy chọn [Tất cả] cho mục "Kết quả kiểm tra".

Có một vấn đề nữa là đối với một số nhà cung cấp giải pháp, tôi không tìm được chỗ để lấy mã tra cứu, bạn nào biết thì chia sẻ nhé.
- BKAV: https://van.ehoadon.vn/TCHD
- FPT: https://hoadon.ftg.vn/
- https://portaltool-miennam.vnpt-invoice.com.vn/
cái này PM có phí cũng chưa tra được a ơi, nên tạm thời để vậy đi a
 
Upvote 0
Dạ em Vân đang tải mà bị lỗi này anh ạ
1729061848877.png
 
Upvote 0
Upvote 0
@ongke0711
thấy anh vẫn chưa xử vụ captcha, chắc nhìn mấy module kia tùm lum quá ha;
anh thử
Mã:
Me.txtNhapCaptcha = hddtCAPTSolve(cContent)

Em code hàm hddtCAPTSolve và hàm đi kèm:
Mã:
Function hddtCAPTSolve(svgData As String) As String
    Dim http As Object, json As Object, svgDoc As Object
    Dim Dic As Object, Key As Variant, pathElements As Object
    Dim ArrData() As Variant, CAPcode As String, ShortenCode As String
    Dim k As Long, l As Long, result As String, Position As String
    
    Set Dict = CreateObject("Scripting.Dictionary")
    Set Dict = CaptchaDict

    Set svgDoc = CreateObject("MSXML2.DOMDocument")
    If svgDoc.LoadXML(svgData) Then
        Set pathElements = svgDoc.getElementsByTagName("path")
        ReDim ArrData(1 To 2, 1 To 6)
        eCount = 0
        For idx = 0 To pathElements.Length - 1
            If pathElements.item(idx).getAttribute("fill") <> "none" Then
                eCount = eCount + 1
                result = pathElements.item(idx).getAttribute("d")
                Position = Split(result, ".")(0)
                Position = Replace(Position, "M", "")
                ArrData(1, eCount) = CInt(Position)
                ArrData(2, eCount) = Dict(CleanSVGPath(result))
            End If
        Next idx
        ' Sort ArrData
        For i = 1 To UBound(ArrData, 2)
            For j = i + 1 To UBound(ArrData, 2)
                If ArrData(1, i) > ArrData(1, j) Then
                    
                    tempPosition = ArrData(1, i)
                    ArrData(1, i) = ArrData(1, j)
                    ArrData(1, j) = tempPosition
                    
                    tempData = ArrData(2, i)
                    ArrData(2, i) = ArrData(2, j)
                    ArrData(2, j) = tempData
                End If
            Next j
        Next i
        
        CAPTSolve = ""
        For k = 1 To UBound(ArrData, 2)
            CAPTSolve = CAPTSolve & ArrData(2, k)
        Next k
    Else
        Debug.Print "Error XML: " & svgDoc.parseError.reason
    End If
    
    Set http = Nothing
    Set json = Nothing
    Set svgDoc = Nothing
    Set Dic = Nothing
    If Len(CAPTSolve) = 6 Then hddtCAPTSolve = CAPTSolve
End Function

Function CleanSVGPath(svgPath As String) As String
    Dim strPath As String
    Dim i As Integer
    Dim currentChar As String
    For i = 1 To Len(svgPath)
        currentChar = Mid(svgPath, i, 1)
        If Not (IsNumeric(currentChar) Or currentChar = "." Or currentChar = " ") Then
            strPath = strPath & currentChar
        End If
    Next i
    CleanSVGPath = Replace(strPath, "L", "")
End Function

Function CaptchaDict() As Object
    Set Dict = CreateObject("Scripting.Dictionary")
    Dict.Add "0000000000000", "0"
    Dict.Add "1111111111111", "1"
    Dict.Add "MQQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQQQQQZ", "2"
    Dict.Add "MQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQZ", "3"
    Dict.Add "MQQQQZMQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQZMQQQQQZ", "4"
    Dict.Add "MQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQZ", "5"
    Dict.Add "MQQQQQQQQQZMQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQZ", "6"
    Dict.Add "MQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQZ", "7"
    Dict.Add "MQQQQQQQQZMQQQQQQQZMQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQZMQQQQQQQZ", "8"
    Dict.Add "MQQQQQQQQZMQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQZ", "9"
    
    Dict.Add "MQQQQQZMQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQZMQQZ", "A"
    Dict.Add "MQQQQQQQQQZMQQQQQQZMQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQZMQQQQQQQQZMQQQQQQQQZ", "B"
    Dict.Add "MQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQZ", "C"
    Dict.Add "MQQQQQQQQZMQQQQQQQQQQZMQQQQQQQQQQQQQQQZMQQQQQQQZ", "D"
    Dict.Add "MQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQQQZ", "E"
    Dict.Add "MQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQZ", "F"
    Dict.Add "MQQQQQQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQZ", "G"
    Dict.Add "MQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQZ", "H"
    Dict.Add "IIIIIIIIIIIIIIIIIIII", "I"
    Dict.Add "MQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQZ", "J"
    Dict.Add "MQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQZ", "K"
    Dict.Add "LLLLLLLLLLLLLLLLLLLL", "L"
    Dict.Add "MQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQZ", "M"
    Dict.Add "MQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQZ", "N"
    Dict.Add "OOOOOOOOOOOOOOOOOOOO", "O"
    Dict.Add "MQQQQQQZMQQQQQQQQQQZMQQQQQQQQQQQQQQQZMQQQQQQQQZ", "P"
    Dict.Add "MQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQZ", "Q"
    Dict.Add "MQQQQQQZMQQQQQQQQQQQQZMQQQQQQQQQQQQQQQZMQQQQQQQQZ", "R"
    Dict.Add "MQQQQQQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQZ", "S"
    Dict.Add "MQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQZ", "T"
    Dict.Add "UUUUUUUUUUUUUUUUUUU", "U"
    Dict.Add "MQQQQQQQQQQZMQQQQQQQQQQQQQQQQZ", "V"
    Dict.Add "MQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQQQZ", "W"
    Dict.Add "MQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQZ", "X"
    Dict.Add "MQQQQQQQQQZMQQQQQQQQQQQQQZ", "Y"
    Dict.Add "MQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQZ", "Z"
    
    Set CaptchaDict = Dict
End Function
 
Upvote 0
@ongke0711
thấy anh vẫn chưa xử vụ captcha, chắc nhìn mấy module kia tùm lum quá ha;
anh thử
Mã:
Me.txtNhapCaptcha = hddtCAPTSolve(cContent)

Em code hàm hddtCAPTSolve và hàm đi kèm:
Mã:
Function hddtCAPTSolve(svgData As String) As String
    Dim http As Object, json As Object, svgDoc As Object
    Dim Dic As Object, Key As Variant, pathElements As Object
    Dim ArrData() As Variant, CAPcode As String, ShortenCode As String
    Dim k As Long, l As Long, result As String, Position As String
   
    Set Dict = CreateObject("Scripting.Dictionary")
    Set Dict = CaptchaDict

    Set svgDoc = CreateObject("MSXML2.DOMDocument")
    If svgDoc.LoadXML(svgData) Then
        Set pathElements = svgDoc.getElementsByTagName("path")
        ReDim ArrData(1 To 2, 1 To 6)
        eCount = 0
        For idx = 0 To pathElements.Length - 1
            If pathElements.item(idx).getAttribute("fill") <> "none" Then
                eCount = eCount + 1
                result = pathElements.item(idx).getAttribute("d")
                Position = Split(result, ".")(0)
                Position = Replace(Position, "M", "")
                ArrData(1, eCount) = CInt(Position)
                ArrData(2, eCount) = Dict(CleanSVGPath(result))
            End If
        Next idx
        ' Sort ArrData
        For i = 1 To UBound(ArrData, 2)
            For j = i + 1 To UBound(ArrData, 2)
                If ArrData(1, i) > ArrData(1, j) Then
                   
                    tempPosition = ArrData(1, i)
                    ArrData(1, i) = ArrData(1, j)
                    ArrData(1, j) = tempPosition
                   
                    tempData = ArrData(2, i)
                    ArrData(2, i) = ArrData(2, j)
                    ArrData(2, j) = tempData
                End If
            Next j
        Next i
       
        CAPTSolve = ""
        For k = 1 To UBound(ArrData, 2)
            CAPTSolve = CAPTSolve & ArrData(2, k)
        Next k
    Else
        Debug.Print "Error XML: " & svgDoc.parseError.reason
    End If
   
    Set http = Nothing
    Set json = Nothing
    Set svgDoc = Nothing
    Set Dic = Nothing
    If Len(CAPTSolve) = 6 Then hddtCAPTSolve = CAPTSolve
End Function

Function CleanSVGPath(svgPath As String) As String
    Dim strPath As String
    Dim i As Integer
    Dim currentChar As String
    For i = 1 To Len(svgPath)
        currentChar = Mid(svgPath, i, 1)
        If Not (IsNumeric(currentChar) Or currentChar = "." Or currentChar = " ") Then
            strPath = strPath & currentChar
        End If
    Next i
    CleanSVGPath = Replace(strPath, "L", "")
End Function

Function CaptchaDict() As Object
    Set Dict = CreateObject("Scripting.Dictionary")
    Dict.Add "0000000000000", "0"
    Dict.Add "1111111111111", "1"
    Dict.Add "MQQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQQQQQZ", "2"
    Dict.Add "MQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQZ", "3"
    Dict.Add "MQQQQZMQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQZMQQQQQZ", "4"
    Dict.Add "MQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQZ", "5"
    Dict.Add "MQQQQQQQQQZMQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQZ", "6"
    Dict.Add "MQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQZ", "7"
    Dict.Add "MQQQQQQQQZMQQQQQQQZMQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQZMQQQQQQQZ", "8"
    Dict.Add "MQQQQQQQQZMQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQZ", "9"
   
    Dict.Add "MQQQQQZMQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQZMQQZ", "A"
    Dict.Add "MQQQQQQQQQZMQQQQQQZMQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQZMQQQQQQQQZMQQQQQQQQZ", "B"
    Dict.Add "MQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQZ", "C"
    Dict.Add "MQQQQQQQQZMQQQQQQQQQQZMQQQQQQQQQQQQQQQZMQQQQQQQZ", "D"
    Dict.Add "MQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQQQZ", "E"
    Dict.Add "MQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQZ", "F"
    Dict.Add "MQQQQQQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQZ", "G"
    Dict.Add "MQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQZ", "H"
    Dict.Add "IIIIIIIIIIIIIIIIIIII", "I"
    Dict.Add "MQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQZ", "J"
    Dict.Add "MQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQZ", "K"
    Dict.Add "LLLLLLLLLLLLLLLLLLLL", "L"
    Dict.Add "MQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQZ", "M"
    Dict.Add "MQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQZ", "N"
    Dict.Add "OOOOOOOOOOOOOOOOOOOO", "O"
    Dict.Add "MQQQQQQZMQQQQQQQQQQZMQQQQQQQQQQQQQQQZMQQQQQQQQZ", "P"
    Dict.Add "MQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQZ", "Q"
    Dict.Add "MQQQQQQZMQQQQQQQQQQQQZMQQQQQQQQQQQQQQQZMQQQQQQQQZ", "R"
    Dict.Add "MQQQQQQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQZ", "S"
    Dict.Add "MQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQZ", "T"
    Dict.Add "UUUUUUUUUUUUUUUUUUU", "U"
    Dict.Add "MQQQQQQQQQQZMQQQQQQQQQQQQQQQQZ", "V"
    Dict.Add "MQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQQQZ", "W"
    Dict.Add "MQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQZ", "X"
    Dict.Add "MQQQQQQQQQZMQQQQQQQQQQQQQZ", "Y"
    Dict.Add "MQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQZ", "Z"
   
    Set CaptchaDict = Dict
End Function
Chưa em, anh lo xử lý cho nó ra đúng dữ liệu trước rồi mới tinh chỉnh code theo code của em vsf các hướng dẫn của bác Tuân, Hesanbi. Vừa ngâm cứu vừa làm thôi nên còn lỗi tùm lum :D
 
Upvote 0
Khi hàm httpGet(,,, res) = False thì tham số res nhận kết quả trả về từ server là nội dung lỗi có cấu trúc:
{
"timestamp": "16/10/2024 16:28:41",
"message": "Kho?ng th?i gian tìm ki?m không du?c l?n hon 1 tháng.",
"details": "",
"path": "uri=/invoices/purchase"
}

Ta cần bắt nội dung này rồi đưa lên thông báo cho người dùng biết. Bắt thêm các lỗi khác một cách tỉ mỉ thì mới sửa code dễ dàng. Mà bên viết ứng dụng server cho website này thấy ngộ ngộ, nội dung chuỗi JSON trả về thông báo lỗi không có mã lỗi, như các ứng dụng server thông thường khác phải có key "error" thì lập trình bắt mới dễ dàng.
Bài đã được tự động gộp:

Chưa em, anh lo xử lý cho nó ra đúng dữ liệu trước rồi mới tinh chỉnh code theo code của em vsf các hướng dẫn của bác Tuân, Hesanbi. Vừa ngâm cứu vừa làm thôi nên còn lỗi tùm lum :D

Bản mới hình như anh quên cắt bỏ phần chia thời gian thành từng tháng nên báo lỗi vượt quá một tháng khi requets.
 
Upvote 0
Em download bản mới nhất vẫn bị lỗi như hình.

1729075136781.png
 
Upvote 0
Bản mới hình như anh quên cắt bỏ phần chia thời gian thành từng tháng nên báo lỗi vượt quá một tháng khi requets.
Tôi sửa cái hàm laythoigian() nhưng không kỹ nên sai 1 dòng code dẫn đến lỗi trên. :D

Đang gặp 1 vấn đề về hiển thị ngày hóa đơn:
* Nếu định dạng của hệ thống là: dd/mm/yyyy:
- Nếu ngày <12 thì nó lại hiển thị mm/dd (kiểu Date), ngày >12 thì hiển thị đúng dd/mm (nhưng là kiểu String).
- Mặc dù hiển thị sai định dạng nhưng hóa đơn thì lấy đúng khoản thời gian.
* Nếu định dạng hệ thống là: mm/dd/yyyy
=> Hiển thị đúng định dạng yêu cầu.

*** Đã sửa lỗi ngày tháng ở trên :D . Sau khi gán giá trị Ngày thì dùng NumberFormat luôn, thêm 1 dòng code nữa :). Giờ ngày hệ thống kiểu English (USA) hay Vietnamese đều hiển thị đúng.
 
Lần chỉnh sửa cuối:
Upvote 0
Đang gặp 1 vấn đề về hiển thị ngày hóa đơn:
Em thì hay dùng hạ sách này, thôi cứ chắc ăn anh à.
Mã:
    yearPart = Mid(timeString, 1, 4)
    monthPart = Mid(timeString, 5, 2)
    dayPart = Mid(timeString, 7, 2)
    hourPart = Mid(timeString, 9, 2)
    minutePart = Mid(timeString, 11, 2)
    secondPart = Mid(timeString, 13, 2)
    
    dateTimeValue = DateSerial(CInt(yearPart), CInt(monthPart), CInt(dayPart)) + _
    TimeSerial(CInt(hourPart), CInt(minutePart), CInt(secondPart))
 
Upvote 0
Trong trường hợp code mình tắt Cập nhật màn hình và tắt luôn tính toán Calucation thì tốc độ Excel xử lý có nhanh hơn không anh nhỉ ? Vì em tay ngang nên không dám thử code của anh đã làm :D :D :D

- Và em test tải tất cả thì vẫn chưa có hóa đơn từ MTT anh ạ
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi sửa cái hàm laythoigian() nhưng không kỹ nên sai 1 dòng code dẫn đến lỗi trên. :D

Đang gặp 1 vấn đề về hiển thị ngày hóa đơn:
* Nếu định dạng của hệ thống là: dd/mm/yyyy:
- Nếu ngày <12 thì nó lại hiển thị mm/dd (kiểu Date), ngày >12 thì hiển thị đúng dd/mm (nhưng là kiểu String).
- Mặc dù hiển thị sai định dạng nhưng hóa đơn thì lấy đúng khoản thời gian.
* Nếu định dạng hệ thống là: mm/dd/yyyy
=> Hiển thị đúng định dạng yêu cầu.

*** Đã sửa lỗi ngày tháng ở trên :D . Sau khi gán giá trị Ngày thì dùng NumberFormat luôn, thêm 1 dòng code nữa :). Giờ ngày hệ thống kiểu English (USA) hay Vietnamese đều hiển thị đúng.
1729131583731.png
Em tải bản mới nhất mà vẫn bị ạ!
 
Upvote 0
Web KT

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

Back
Top Bottom