vanlinh_2904
Thành viên hoạt động
- Tham gia
- 20/10/12
- Bài viết
- 105
- Được thích
- 3
Chắc chổ này nè bạn.Chào các Anh Chị,
Em nhờ các Anh, Chị viết VBA giúp em trích xuất lấy mã tra cứu hóa đơn xml (file đính kèm) ở trường /DLHDon/TTKhac/TTin/DLieu sang excel, để kết quả là mã "L0IXU49XNNN"
Em cảm ơn các anh/chị trước nhé.
Mình có thấy mấy file ở đó nhưng chưa thấy có lấy được mã tra cứu hóa đơn xml như mình mong muốn đó bạn.Chắc chổ này nè bạn.
Trích xuất file *.xml sang Excel cho hóa đơn điện tử áp dụng nghị định 123/2020
Trích xuất file *.xml sang Excel cho hóa đơn điện tử áp dụng nghị định 123/2020 Ngày 07/10/2021 Tổng cục thuế đã ban hành quyết định 1450/QĐ-TCT về thành phần chứa dữ liệu nghiệp vụ hóa đơn điện tử. Theo đó các nhà cung cấp hóa đơn điện tử sẽ chuẩn hóa cấu trúc file *.xml để truyền dữ liệu hóa...www.giaiphapexcel.com
Trong File XML không có hiển thị mã tra cứu đó bạn nhé, mã chỉ thể hiện ở File PDF thôi.Mình có thấy mấy file ở đó nhưng chưa thấy có lấy được mã tra cứu hóa đơn xml như mình mong muốn đó bạn.
Sao mình lại thấy trên xml lại có thông tin mã tra cứu đó bạnTrong File XML không có hiển thị mã tra cứu đó bạn nhé, mã chỉ thể hiện ở File PDF thôi.
Thân !
Sao mình lại thấy trên xml lại có thông tin mã tra cứu đó bạn
<TTruong>TransactionID</TTruong>
<KDLieu>string</KDLieu>
<DLieu>L0IXU49XNNN</DLieu>
</TTin>
</TTKhac>
</DLHDon>
1. Cái mà bạn cần lấy theo như hình đính kèm nó nằm gần cuối tập tin. Nhưng ngay ở đầu tập tin tôi nhìn thấySao mình lại thấy trên xml lại có thông tin mã tra cứu đó bạn
<TTruong>TransactionID</TTruong>
<KDLieu>string</KDLieu>
<DLieu>L0IXU49XNNN</DLieu>
</TTin>
</TTKhac>
</DLHDon>
ID hóa đơn đó một số nhà cung cấp hóa đơn lại không phải là mã tra cứu như invoce2 này , mã tra cứu nằm thường ở /DLHDon/TTKhac/TTin/DLieu như 2 hóa đơn này bạn.1. Cái mà bạn cần lấy theo như hình đính kèm nó nằm gần cuối tập tin. Nhưng ngay ở đầu tập tin tôi nhìn thấy
View attachment 279600
Vậy chỗ tôi đánh dấu và chỗ bạn muốn lấy có chắc chắn luôn như nhau không? Nếu luôn như nhau thì lấy ngay ở đầu cho đơn giản.
2. Như các bài phản hồi thì có thể chỗ bạn cần lấy không có, tức có 2 loại hóa đơn: đã thanh toán và chưa thanh toán? Tôi không làm chuyên môn của bạn nên không biết. Nếu có 2 loại hóa đơn thì bạn phải đính kèm cả 2 tập tin XML và mô tả từ mỗi tập tin lấy gì từ chỗ nào.
Việc của bạn ngoài các phương pháp khác thì có thể đọc thuần túy tập tin XML rồi lấy ra thôi. Chả có gì bí hiểm ở đây.
Tôi đã viết rõ rồi.ID hóa đơn đó một số nhà cung cấp hóa đơn lại không phải là mã tra cứu như invoce2 này , mã tra cứu nằm thường ở /DLHDon/TTKhac/TTin/DLieu như 2 hóa đơn này bạn.
2. Như các bài phản hồi thì có thể chỗ bạn cần lấy không có, tức có 2 loại hóa đơn: đã thanh toán và chưa thanh toán? Tôi không làm chuyên môn của bạn nên không biết. Nếu có 2 loại hóa đơn thì bạn phải đính kèm cả 2 tập tin XML và mô tả từ mỗi tập tin lấy gì từ chỗ nào.
À, mình xin lỗi bạn nhé. Mình không chú ý nên không kiểm tra kỹ, giờ mình nhìn lại tập tin thứ 2 nó lại ở đây /DLHDon/TTChung/TTKhac/TTin/DLieu với mã là 1A8C5AEF37Tôi đã viết rõ rồi.
Trong tập tin thứ 2 bạn định lấy chỗ nào thì phải VIẾT RÕ. Tôi không có thời gian tìm kiếm đâu. Bạn biết mà quyết không nói, bắt tôi phải tìm?
Trong tập tin 2 DLHDon làm gì có con nào là TTKhac. TTKhac chỉ là con của DLHDon/TTChung hoặc con của DLHDon/DSHHDVu/HHDVu
Tự viết để giết thời gian.À, mình xin lỗi bạn nhé. Mình không chú ý nên không kiểm tra kỹ, giờ mình nhìn lại tập tin thứ 2 nó lại ở đây /DLHDon/TTChung/TTKhac/TTin/DLieu với mã là 1A8C5AEF37
<TTin>
<TTruong>Mã TC</TTruong>
<KDLieu>string</KDLieu>
<DLieu>1A8C5AEF37</DLieu>
</TTin>
</TTKhac>
</TTChung>
Còn ở tập tin thứ nhất thì nằm ở /DLHDon/TTKhac/TTin/DLieu với mã L0IXU49XNNN
<TTruong>TransactionID</TTruong>
<KDLieu>string</KDLieu>
<DLieu>L0IXU49XNNN</DLieu>
</TTin>
</TTKhac>
</DLHDon>
Function TransactionID(ByVal XMLfilename As String) As String
' XMLfilename: duong dan toi tap tin XML
' Doc truong DLieu cua DLHDon/TTKhac/TTKhac/TTin ma co truong TTruong = "TransactionID"
' hoac DLHDon/TTChung/TTKhac/TTin ma co TTruong = "Mã TC"
Dim xmldoc As Object, ttkhac As Object, node As Object
Set xmldoc = CreateObject("MSXML2.DOMDocument")
xmldoc.async = False
If xmldoc.Load(XMLfilename) Then
Set ttkhac = xmldoc.DocumentElement.SelectSingleNode("DLHDon/TTKhac")
If Not ttkhac Is Nothing Then
For Each node In ttkhac.ChildNodes
If node.SelectSingleNode("TTruong").Text = "TransactionID" Then
TransactionID = node.SelectSingleNode("DLieu").Text
Exit For
End If
Next node
End If
If TransactionID = "" Then
Set ttkhac = xmldoc.DocumentElement.SelectSingleNode("DLHDon/TTChung/TTKhac")
If Not ttkhac Is Nothing Then
For Each node In ttkhac.ChildNodes
If node.SelectSingleNode("TTruong").Text = "M" & ChrW(227) & " TC" Then
TransactionID = node.SelectSingleNode("DLieu").Text
Exit For
End If
Next node
End If
End If
End If
Set xmldoc = Nothing
End Function
' ví dụ để test hàm TransactionID
Sub test()
Dim XMLfilename, ma As String
XMLfilename = Application.GetOpenFilename("XML files (*.xml), *.xml")
If XMLfilename <> False Then
ma = TransactionID(XMLfilename)
MsgBox "Ma = " & ma
End If
End Sub
Có thể lấy 2 tệp tin cùng lúc và kết quả được xuất excel được không bạn, kiểu như vậyTự viết để giết thời gian.
Nếu chỉ có 2 cấu trúc và 2 chỗ để tìm như bạn khẳng định thì code như sau. Nếu tập tin khác với lời của bạn thì kết quả sẽ là chuỗi rỗng.
Mã:Function TransactionID(ByVal XMLfilename As String) As String ' XMLfilename: duong dan toi tap tin XML ' Doc truong DLieu cua DLHDon/TTKhac/TTKhac/TTin ma co truong TTruong = "TransactionID" ' hoac DLHDon/TTChung/TTKhac/TTin ma co TTruong = "Mã TC" Dim xmldoc As Object, ttkhac As Object, node As Object Set xmldoc = CreateObject("MSXML2.DOMDocument") xmldoc.async = False If xmldoc.Load(XMLfilename) Then Set ttkhac = xmldoc.DocumentElement.SelectSingleNode("DLHDon/TTKhac") If Not ttkhac Is Nothing Then For Each node In ttkhac.ChildNodes If node.SelectSingleNode("TTruong").Text = "TransactionID" Then TransactionID = node.SelectSingleNode("DLieu").Text Exit For End If Next node End If If TransactionID = "" Then Set ttkhac = xmldoc.DocumentElement.SelectSingleNode("DLHDon/TTChung/TTKhac") If Not ttkhac Is Nothing Then For Each node In ttkhac.ChildNodes If node.SelectSingleNode("TTruong").Text = "M" & ChrW(227) & " TC" Then TransactionID = node.SelectSingleNode("DLieu").Text Exit For End If Next node End If End If End If Set xmldoc = Nothing End Function ' ví dụ để test hàm TransactionID Sub test() Dim XMLfilename, ma As String XMLfilename = Application.GetOpenFilename("XML files (*.xml), *.xml") If XMLfilename <> False Then ma = TransactionID(XMLfilename) MsgBox "Ma = " & ma End If End Sub
Số hóa đơn | Mã |
22 | 1A8C5AEF37 |
1 | L0IXU49XNNN |
Số hóa đơn lấy ở đâu? Kết quả nhập vào đâu? Vào đâu cũng được? Nếu một lần nữa tôi phải nài nỉ giải thích thì tôi sẽ dừng.Có thể lấy 2 tệp tin cùng lúc và kết quả được xuất excel được không bạn, kiểu như vậy
Số hóa đơn Mã 22 1A8C5AEF37 1 L0IXU49XNNN
Số hóa đơn ở cả 2 tệp đều có chung /DLHDon/TTChung/SHDon, còn kết quả kết xuất ra ở đâu trên file excel cũng được hết bạn. cảm ơn bạn nhiều.Số hóa đơn lấy ở đâu? Kết quả nhập vào đâu? Vào đâu cũng được? Nếu một lần nữa tôi phải nài nỉ giải thích thì tôi sẽ dừng.
Function Shd_Ma(XMLfilename)
' XMLfilename: mang 1 chieu chua cac duong dan toi tap tin XML
' Doc truong DLieu cua DLHDon/TTKhac/TTKhac/TTin ma co truong TTruong = "TransactionID"
' hoac DLHDon/TTChung/TTKhac/TTin ma co TTruong = "MaŢ TC"
' ham tra ve mang 2 chieu: cot 1 la So Hoa Don, cot 2 la Ma
Dim k As Long, result(), xmldoc As Object, ttkhac As Object, node As Object
Set xmldoc = CreateObject("MSXML2.DOMDocument")
xmldoc.async = False
ReDim result(1 To UBound(XMLfilename), 1 To 2)
For k = 1 To UBound(XMLfilename)
If xmldoc.Load(XMLfilename(k)) Then
result(k, 1) = xmldoc.DocumentElement.SelectSingleNode("DLHDon/TTChung/SHDon").Text
Set ttkhac = xmldoc.DocumentElement.SelectSingleNode("DLHDon/TTKhac")
If Not ttkhac Is Nothing Then
For Each node In ttkhac.ChildNodes
If node.SelectSingleNode("TTruong").Text = "TransactionID" Then
result(k, 2) = node.SelectSingleNode("DLieu").Text
Exit For
End If
Next node
End If
If IsEmpty(result(k, 2)) Then
Set ttkhac = xmldoc.DocumentElement.SelectSingleNode("DLHDon/TTChung/TTKhac")
If Not ttkhac Is Nothing Then
For Each node In ttkhac.ChildNodes
If node.SelectSingleNode("TTruong").Text = "M" & ChrW(227) & " TC" Then
result(k, 2) = node.SelectSingleNode("DLieu").Text
Exit For
End If
Next node
End If
End If
End If
Next k
Shd_Ma = result
Set xmldoc = Nothing
End Function
Sub doc_Ma()
Dim k As Long, result, XMLfilename, kq()
XMLfilename = Application.GetOpenFilename("XML files (*.xml), *.xml", Title:="Hay chon mot hoac nhieu tap tin", MultiSelect:=True)
If IsArray(XMLfilename) Then
result = Shd_Ma(XMLfilename)
ThisWorkbook.Worksheets("Sheet1").Range("A2").Resize(UBound(result, 1), UBound(result, 2)).Value = result
End If
End Sub