VBA Xml: Импорт xml файлов в Excel

Узнай цену своей работы

Формулировка задачи:

Нижеследующий код выполняет поиск всех .xml файлов в папке и импортирует в excel необходимые атрибуты. Проблема в том, что не все xml файлы имеют одинаковый тег(возможны 4 варианта). Если в папку положить xml файлы только с "правильными" тегами все работает, но если там окажется "неправильный" xml файл, то программа вылетает с ошибкой (Run time Error 91). Это случается по причине того, что функция SelectNode не может возвращать значение Nothing. Вопрос в том, можно ли каким-либо образом сделать так чтобы программа перебирала 4 варианта возможных тегов.

В xml файлах возможны только 4 варианта(loc1,loc2,loc3,loc4). Пробовал через оператор управления ошибками не получается. Буду признателен за пример.

Решение задачи: «VBA Xml: Импорт xml файлов в Excel»

textual
Листинг программы
Private Enum SearchResult
    Present
    NotPresent
    PresentComplete
End Enum

Private Function CheckNodeName(ChildList As MSXML2.IXMLDOMNodeList, names() As String, index As Long) As SearchResult
Dim Node As MSXML2.IXMLDOMNode
Dim attr As MSXML2.IXMLDOMAttribute
For Each Node In ChildList
    If Node.nodeName = names(index) Then
        If index = UBound(names) Then
            CheckNodeName = PresentComplete
            Exit Function
        Else
            If Mid(names(index + 1), 1, 1) = "@" Then
                For Each attr In Node.Attributes
                    If attr.baseName = Right(names(index + 1), Len(names(index + 1)) - 1) Then
                        If UBound(names) = index + 1 Then
                            CheckNodeName = PresentComplete
                            Exit Function
                        Else
                            CheckNodeName = Present
                        End If
                    End If
                Next
            End If
            CheckNodeName = CheckNodeName(Node.childNodes, names, index + 1)
            If CheckNodeName = PresentComplete Then
                Exit Function
            End If
        End If
    Else
        CheckNodeName = False
    End If
Next
End Function

Private Function CheckPath(doc As MSXML2.DOMDocument, path As String) As SearchResult
Dim i As Long
Dim names() As String

For i = 1 To Len(path)
    If Mid(path, i, 1) <> "\" Then
        names = Split(Right(path, Len(path) - i + 1), "\")
        Exit For
    End If
Next i

CheckPath = CheckNodeName(doc.childNodes, names, 0)

End Function

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.071 из 5