Второй день бьюсь с импортом XML файлов в Excel и превращением их в красивый формат для сохранения и печати.
По примерам с этого форума (http://www.excelworld.ru/forum/10-9741-1) и других научился открывать пробные файлы и вытягивать из них какие-то данные.
Но с моим рабочим файлом ничего не получается (видимо сути пока не понял или структура моего файла сложнее).
Можете мне дать волшебный пендель в нужном направлении и дать код для вытаскивания из этого файла: 1) к примеру, ФИО представителя (в файле это "Прохоров Александр Александрович") 2) всех ID и Description с формированием по ним таблички
А дальше я уже как-нибудь сам поковыляю.
Заранее спасибо!!!
Второй день бьюсь с импортом XML файлов в Excel и превращением их в красивый формат для сохранения и печати.
По примерам с этого форума (http://www.excelworld.ru/forum/10-9741-1) и других научился открывать пробные файлы и вытягивать из них какие-то данные.
Но с моим рабочим файлом ничего не получается (видимо сути пока не понял или структура моего файла сложнее).
Можете мне дать волшебный пендель в нужном направлении и дать код для вытаскивания из этого файла: 1) к примеру, ФИО представителя (в файле это "Прохоров Александр Александрович") 2) всех ID и Description с формированием по ним таблички
Udik, спасибо огромное!!! Направление понятно, пошел в нужную сторону.
В итоге сделал красивый шаблон, в котором поставил коды и нужный формат выхода, а дальше макрос пробегается по шаблону и по всем кодам заполняет данными выходной файл (с аналогичным шаблону внешним видом).
Udik, спасибо огромное!!! Направление понятно, пошел в нужную сторону.
В итоге сделал красивый шаблон, в котором поставил коды и нужный формат выхода, а дальше макрос пробегается по шаблону и по всем кодам заполняет данными выходной файл (с аналогичным шаблону внешним видом).Beerukoff
Почти все сделал, но не могу разобраться с построением таблицы из трех колонок по кодам ID, VIN и Description
Проблема в том, что для некоторых строк ID или VIN могут отсутствовать и простое последовательное применение кода
[vba]
Код
Set docNodes = docXML.SelectNodes("//*/ID")[/i][b] 'потом VIN, потом Description (со вставление в разные колонки)[/b][i] For Each docNode In docNodes Debug.Print docNode.Text Next
[/vba] приводит к смещению данных по строкам.
В итоге набросал такой код [vba]
Код
XPath = "//PersonalProperties" Set objListOfNodes = .SelectNodes(XPath) i = 0 ReDim RZ(1 To objListOfNodes.Length, 1 To 3) For Each objNode In objListOfNodes i = i + 1 For Each oElem In objNode.ChildNodes Select Case oElem.BaseName Case "//ID" RZ(i, 1) = oElem.Text Case "//VIN" RZ(i, 2) = oElem.Text Case "//Description" RZ(i, 3) = oElem.Text End Select Next Next
[/vba]
Но он почему-то ничего не выбирает
Почти все сделал, но не могу разобраться с построением таблицы из трех колонок по кодам ID, VIN и Description
Проблема в том, что для некоторых строк ID или VIN могут отсутствовать и простое последовательное применение кода
[vba]
Код
Set docNodes = docXML.SelectNodes("//*/ID")[/i][b] 'потом VIN, потом Description (со вставление в разные колонки)[/b][i] For Each docNode In docNodes Debug.Print docNode.Text Next
[/vba] приводит к смещению данных по строкам.
В итоге набросал такой код [vba]
Код
XPath = "//PersonalProperties" Set objListOfNodes = .SelectNodes(XPath) i = 0 ReDim RZ(1 To objListOfNodes.Length, 1 To 3) For Each objNode In objListOfNodes i = i + 1 For Each oElem In objNode.ChildNodes Select Case oElem.BaseName Case "//ID" RZ(i, 1) = oElem.Text Case "//VIN" RZ(i, 2) = oElem.Text Case "//Description" RZ(i, 3) = oElem.Text End Select Next Next
Set docNodes = docXML.SelectNodes("//*/ID") For Each docNode In docNodes Debug.Print docNode.Text Do While Not docNode.NextSibling Is Nothing Set docNode = docNode.NextSibling If docNode.BaseName = "Description" Then Debug.Print docNode.Text
ElseIf docNode.BaseName = "VIN" Then Debug.Print docNode.Text End If
Loop
Next End Sub
[/vba]
Чет не увидел ни одного VIN в файле, но в принципе так можно [vba]
Код
Option Explicit
Public Sub getXML() Dim docXML As Object, docNodes As Object, docNode As Object, childN As Object Dim strURL As String
Set docNodes = docXML.SelectNodes("//*/ID") For Each docNode In docNodes Debug.Print docNode.Text Do While Not docNode.NextSibling Is Nothing Set docNode = docNode.NextSibling If docNode.BaseName = "Description" Then Debug.Print docNode.Text
ElseIf docNode.BaseName = "VIN" Then Debug.Print docNode.Text End If
Udik, неделю грипповал, поэтому отвечаю с некоторой задержкой.
В этих xml файлах между данными верхней и нижней "шапок" идет табличка с 3-мя графами "VIN", "ID" и "Description", причем, насколько я понял, поле "Description" заполняется всегда, а вот соответствующие этой строчке поля "VIN" и "ID" только что-то одно.
В итоге я с помощью вашего кода реализовал перенос данных в таблицу, просто дважды повторяя второй цикл, сначала для "VIN", а потом для "ID". Все работает, но как-то не до конца элегантно
Можно ли сделать обработку таблицы по полю "Description", к которому будет подставляться соответствующая инфа из поля "VIN" или "ID"?
Udik, неделю грипповал, поэтому отвечаю с некоторой задержкой.
В этих xml файлах между данными верхней и нижней "шапок" идет табличка с 3-мя графами "VIN", "ID" и "Description", причем, насколько я понял, поле "Description" заполняется всегда, а вот соответствующие этой строчке поля "VIN" и "ID" только что-то одно.
В итоге я с помощью вашего кода реализовал перенос данных в таблицу, просто дважды повторяя второй цикл, сначала для "VIN", а потом для "ID". Все работает, но как-то не до конца элегантно
Можно ли сделать обработку таблицы по полю "Description", к которому будет подставляться соответствующая инфа из поля "VIN" или "ID"?Beerukoff
Сообщение отредактировал Beerukoff - Понедельник, 19.12.2016, 10:12
Немного поспешил в своих выводах, оказывается может быть заполнено только поле "Description" без соответствующих "ID" и "VIN". Это разломало уже работающий макрос Надо менять логику.
А код в таком виде почему-то не работает [vba]
Код
Set docNodes = docXML.SelectNodes("//*/Description") For Each docNode In docNodes Debug.Print docNode.Text Do While Not docNode.NextSibling Is Nothing Set docNode = docNode.NextSibling If docNode.BaseName = "ID" Then Debug.Print docNode.Text
ElseIf docNode.BaseName = "VIN" Then Debug.Print docNode.Text End If
[/vba]
Немного поспешил в своих выводах, оказывается может быть заполнено только поле "Description" без соответствующих "ID" и "VIN". Это разломало уже работающий макрос Надо менять логику.
А код в таком виде почему-то не работает [vba]
Код
Set docNodes = docXML.SelectNodes("//*/Description") For Each docNode In docNodes Debug.Print docNode.Text Do While Not docNode.NextSibling Is Nothing Set docNode = docNode.NextSibling If docNode.BaseName = "ID" Then Debug.Print docNode.Text
ElseIf docNode.BaseName = "VIN" Then Debug.Print docNode.Text End If
krosav4ig, прикладываю немного сокращенные файлы (список имущества может состоять из десятка тысяч записей) и с затертой персональной инфой (на всякий случай). В первом для примера нету ID и VIN, во втором есть строки только с VIN и есть только с ID.
Таблица просто из трех колонок "ID", "VIN" и "Description"
krosav4ig, прикладываю немного сокращенные файлы (список имущества может состоять из десятка тысяч записей) и с затертой персональной инфой (на всякий случай). В первом для примера нету ID и VIN, во втором есть строки только с VIN и есть только с ID.
Таблица просто из трех колонок "ID", "VIN" и "Description"Beerukoff
Set docNodes = docXML.SelectNodes("//*/Description") For Each docNode In docNodes Debug.Print docNode.Text Do While Not docNode.PreviousSibling Is Nothing Set docNode = docNode.PreviousSibling If docNode.BaseName = "ID" Then Debug.Print docNode.Text
ElseIf docNode.BaseName = "VIN" Then Debug.Print docNode.Text End If
Set docNodes = docXML.SelectNodes("//*/Description") For Each docNode In docNodes Debug.Print docNode.Text Do While Not docNode.PreviousSibling Is Nothing Set docNode = docNode.PreviousSibling If docNode.BaseName = "ID" Then Debug.Print docNode.Text
ElseIf docNode.BaseName = "VIN" Then Debug.Print docNode.Text End If