VBA Xml: Импорт xml файлов в Excel
Формулировка задачи:
Нижеследующий код выполняет поиск всех .xml файлов в папке и импортирует в excel необходимые атрибуты. Проблема в том, что не все xml файлы имеют одинаковый тег(возможны 4 варианта). Если в папку положить xml файлы только с "правильными" тегами все работает, но если там окажется "неправильный" xml файл, то программа вылетает с ошибкой (Run time Error 91). Это случается по причине того, что функция SelectNode не может возвращать значение Nothing. Вопрос в том, можно ли каким-либо образом сделать так чтобы программа перебирала 4 варианта возможных тегов.
В xml файлах возможны только 4 варианта(loc1,loc2,loc3,loc4). Пробовал через оператор управления ошибками не получается. Буду признателен за пример.
В 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