Nhờ giúp lấy dữ liệu từ file xml

Chia sẻ bởi:hands
★★★★★
Quảng cáo

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

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.

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ự
Khóa học SprinGO phù hợp

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
★★★★★ 5 ★ 1 👤 0 ▥ 0
Quảng cáo

Bạn nên đọc

Leave a Reply

Your email address will not be published. Required fields are marked *

Quảng cáo

Cũ vẫn chất

Xem thêm