Nhờ giúp lấy dữ liệu từ file xml
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é.
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.
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>
2418
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
2419
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.
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.
Tôi đã viết rõ rồi.
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.
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
À, 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>
Tự 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.
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ậy
Số hóa đơn
Mã22
1A8C5AEF371
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.
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.
Chạy sub doc_Ma -> chọn 1 hoặc nhiều tập tin.
Kết quả được nhập vào Sheet1!A2 (A1, B1 chứa tiêu đề). Nếu muốn vị trí khác thì tự sửa.
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
Bạn phải lấy địa chỉ tra cứu cái mã kia nữa chứ.
Một lúc nào đó người ta thay đổi địa chỉ tra cứu lại không biết tại sao không tìm thấy hóa đơn.
(Hoặc hóa đơn của một đơn vị dịch vụ khác… )
www.giaiphapexcel.com/diendan/threads/nh%E1%BB%9D-gi%C3%BAp-l%E1%BA%A5y-d%E1%BB%AF-li%E1%BB%87u-t%E1%BB%AB-file-xml.161512/
Khóa học Power PI – Ứng dung trong Nhân sự
TỔNG QUAN KHÓA HỌC: POWER BI CHO NGÀNH NHÂN SỰ Khóa học Power BI cho Nhân sự được thiết kế dành riêng cho các...
Xem khóa học