Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Импорт XML > Excel - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Импорт XML > Excel (Макросы/Sub)
Импорт XML > Excel
Beerukoff Дата: Четверг, 08.12.2016, 18:10 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
Второй день бьюсь с импортом XML файлов в Excel и превращением их в красивый формат для сохранения и печати.

По примерам с этого форума (http://www.excelworld.ru/forum/10-9741-1) и других научился открывать пробные файлы и вытягивать из них какие-то данные.

Но с моим рабочим файлом ничего не получается (видимо сути пока не понял или структура моего файла сложнее).

Можете мне дать волшебный пендель в нужном направлении и дать код для вытаскивания из этого файла:
1) к примеру, ФИО представителя (в файле это "Прохоров Александр Александрович")
2) всех ID и Description с формированием по ним таблички

А дальше я уже как-нибудь сам поковыляю.

Заранее спасибо!!!
К сообщению приложен файл: RegistrationCer.xml (11.0 Kb)
 
Ответить
СообщениеВторой день бьюсь с импортом XML файлов в Excel и превращением их в красивый формат для сохранения и печати.

По примерам с этого форума (http://www.excelworld.ru/forum/10-9741-1) и других научился открывать пробные файлы и вытягивать из них какие-то данные.

Но с моим рабочим файлом ничего не получается (видимо сути пока не понял или структура моего файла сложнее).

Можете мне дать волшебный пендель в нужном направлении и дать код для вытаскивания из этого файла:
1) к примеру, ФИО представителя (в файле это "Прохоров Александр Александрович")
2) всех ID и Description с формированием по ним таблички

А дальше я уже как-нибудь сам поковыляю.

Заранее спасибо!!!

Автор - Beerukoff
Дата добавления - 08.12.2016 в 18:10
krosav4ig Дата: Четверг, 08.12.2016, 18:58 | Сообщение № 2
Группа: Друзья
Ранг: Старожил
Сообщений: 2346
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
К сообщению приложен файл: Import.xlsx (13.7 Kb)


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460
 
Ответить
Сообщениеимпорт по карте xml не подходит?
создание карты
Сопоставление XML-элементов ячейкам листа
Импорт данных по существующей карте xml

Автор - krosav4ig
Дата добавления - 08.12.2016 в 18:58
Udik Дата: Четверг, 08.12.2016, 19:09 | Сообщение № 3
Группа: Друзья
Ранг: Старожил
Сообщений: 1588
Репутация: 192 ±
Замечаний: 0% ±

Excel 2016 х 64
ну вот база, дальше сами разберетесь
[vba]
Код

Option Explicit

Public Sub getXML()
Dim docXML As Object, docNodes As Object, docNode As Object
Dim strURL As String

strURL = ThisWorkbook.Path & "\RegistrationCer.xml"
Set docXML = CreateObject("MSXML2.DOMDocument")
docXML.Load (strURL)
Debug.Print docXML.SelectSingleNode("//RegistrationCertificate/RegistrationCertificateNotaryData/NotaryName").Text

Set docNodes = docXML.SelectNodes("//*/ID")
For Each docNode In docNodes
Debug.Print docNode.Text
Next
End Sub

[/vba]


вот вам барабан
яд 41001231307558 wm R419131876897
udik1968@gmail.com
 
Ответить
Сообщениену вот база, дальше сами разберетесь
[vba]
Код

Option Explicit

Public Sub getXML()
Dim docXML As Object, docNodes As Object, docNode As Object
Dim strURL As String

strURL = ThisWorkbook.Path & "\RegistrationCer.xml"
Set docXML = CreateObject("MSXML2.DOMDocument")
docXML.Load (strURL)
Debug.Print docXML.SelectSingleNode("//RegistrationCertificate/RegistrationCertificateNotaryData/NotaryName").Text

Set docNodes = docXML.SelectNodes("//*/ID")
For Each docNode In docNodes
Debug.Print docNode.Text
Next
End Sub

[/vba]

Автор - Udik
Дата добавления - 08.12.2016 в 19:09
Beerukoff Дата: Пятница, 09.12.2016, 13:15 | Сообщение № 4
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
Udik, спасибо огромное!!! Направление понятно, пошел в нужную сторону.

В итоге сделал красивый шаблон, в котором поставил коды и нужный формат выхода, а дальше макрос пробегается по шаблону и по всем кодам заполняет данными выходной файл (с аналогичным шаблону внешним видом).
 
Ответить
СообщениеUdik, спасибо огромное!!! Направление понятно, пошел в нужную сторону.

В итоге сделал красивый шаблон, в котором поставил коды и нужный формат выхода, а дальше макрос пробегается по шаблону и по всем кодам заполняет данными выходной файл (с аналогичным шаблону внешним видом).

Автор - Beerukoff
Дата добавления - 09.12.2016 в 13:15
Beerukoff Дата: Пятница, 09.12.2016, 16:37 | Сообщение № 5
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
Почти все сделал, но не могу разобраться с построением таблицы из трех колонок по кодам 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]

Но он почему-то ничего не выбирает


Сообщение отредактировал Pelena - Пятница, 09.12.2016, 18:33
 
Ответить
СообщениеПочти все сделал, но не могу разобраться с построением таблицы из трех колонок по кодам 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]

Но он почему-то ничего не выбирает

Автор - Beerukoff
Дата добавления - 09.12.2016 в 16:37
Udik Дата: Пятница, 09.12.2016, 19:31 | Сообщение № 6
Группа: Друзья
Ранг: Старожил
Сообщений: 1588
Репутация: 192 ±
Замечаний: 0% ±

Excel 2016 х 64
Чет не увидел ни одного VIN в файле, но в принципе так можно
[vba]
Код

Option Explicit

Public Sub getXML()
Dim docXML As Object, docNodes As Object, docNode As Object, childN As Object
Dim strURL As String

strURL = ThisWorkbook.Path & "\RegistrationCer.xml"
Set docXML = CreateObject("MSXML2.DOMDocument")
docXML.Load (strURL)
Debug.Print docXML.SelectSingleNode("//RegistrationCertificate/RegistrationCertificateNotaryData/NotaryName").Text

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]


вот вам барабан
яд 41001231307558 wm R419131876897
udik1968@gmail.com
 
Ответить
СообщениеЧет не увидел ни одного VIN в файле, но в принципе так можно
[vba]
Код

Option Explicit

Public Sub getXML()
Dim docXML As Object, docNodes As Object, docNode As Object, childN As Object
Dim strURL As String

strURL = ThisWorkbook.Path & "\RegistrationCer.xml"
Set docXML = CreateObject("MSXML2.DOMDocument")
docXML.Load (strURL)
Debug.Print docXML.SelectSingleNode("//RegistrationCertificate/RegistrationCertificateNotaryData/NotaryName").Text

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]

Автор - Udik
Дата добавления - 09.12.2016 в 19:31
Beerukoff Дата: Понедельник, 19.12.2016, 10:01 | Сообщение № 7
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
Udik, неделю грипповал, поэтому отвечаю с некоторой задержкой.

В этих xml файлах между данными верхней и нижней "шапок" идет табличка с 3-мя графами "VIN", "ID" и "Description", причем, насколько я понял, поле "Description" заполняется всегда, а вот соответствующие этой строчке поля "VIN" и "ID" только что-то одно.

В итоге я с помощью вашего кода реализовал перенос данных в таблицу, просто дважды повторяя второй цикл, сначала для "VIN", а потом для "ID". Все работает, но как-то не до конца элегантно :(

Можно ли сделать обработку таблицы по полю "Description", к которому будет подставляться соответствующая инфа из поля "VIN" или "ID"?


Сообщение отредактировал Beerukoff - Понедельник, 19.12.2016, 10:12
 
Ответить
СообщениеUdik, неделю грипповал, поэтому отвечаю с некоторой задержкой.

В этих xml файлах между данными верхней и нижней "шапок" идет табличка с 3-мя графами "VIN", "ID" и "Description", причем, насколько я понял, поле "Description" заполняется всегда, а вот соответствующие этой строчке поля "VIN" и "ID" только что-то одно.

В итоге я с помощью вашего кода реализовал перенос данных в таблицу, просто дважды повторяя второй цикл, сначала для "VIN", а потом для "ID". Все работает, но как-то не до конца элегантно :(

Можно ли сделать обработку таблицы по полю "Description", к которому будет подставляться соответствующая инфа из поля "VIN" или "ID"?

Автор - Beerukoff
Дата добавления - 19.12.2016 в 10:01
Beerukoff Дата: Понедельник, 19.12.2016, 10:30 | Сообщение № 8
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
Немного поспешил в своих выводах, оказывается может быть заполнено только поле "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]


Сообщение отредактировал Beerukoff - Понедельник, 19.12.2016, 10:32
 
Ответить
СообщениеНемного поспешил в своих выводах, оказывается может быть заполнено только поле "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]

Автор - Beerukoff
Дата добавления - 19.12.2016 в 10:30
krosav4ig Дата: Понедельник, 19.12.2016, 11:15 | Сообщение № 9
Группа: Друзья
Ранг: Старожил
Сообщений: 2346
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
Beerukoff, а может быть вы все-таки покажете файл с реальной структурой и таблицу в Excel, которую нужно получить?


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460
 
Ответить
СообщениеBeerukoff, а может быть вы все-таки покажете файл с реальной структурой и таблицу в Excel, которую нужно получить?

Автор - krosav4ig
Дата добавления - 19.12.2016 в 11:15
Beerukoff Дата: Понедельник, 19.12.2016, 11:49 | Сообщение № 10
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
krosav4ig, прикладываю немного сокращенные файлы (список имущества может состоять из десятка тысяч записей) и с затертой персональной инфой (на всякий случай). В первом для примера нету ID и VIN, во втором есть строки только с VIN и есть только с ID.

Таблица просто из трех колонок "ID", "VIN" и "Description"
К сообщению приложен файл: 3361336.xml (5.7 Kb) · 0371957.xml (7.7 Kb)


Сообщение отредактировал Beerukoff - Понедельник, 19.12.2016, 11:49
 
Ответить
Сообщениеkrosav4ig, прикладываю немного сокращенные файлы (список имущества может состоять из десятка тысяч записей) и с затертой персональной инфой (на всякий случай). В первом для примера нету ID и VIN, во втором есть строки только с VIN и есть только с ID.

Таблица просто из трех колонок "ID", "VIN" и "Description"

Автор - Beerukoff
Дата добавления - 19.12.2016 в 11:49
Beerukoff Дата: Понедельник, 19.12.2016, 12:24 | Сообщение № 11
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
Вот шаблон для выходного файла. Сейчас я его отлично заполняю, проблема возникла со случаем когда для Description одновременно нету ID и VIN
К сообщению приложен файл: __.xlsx (10.9 Kb)
 
Ответить
СообщениеВот шаблон для выходного файла. Сейчас я его отлично заполняю, проблема возникла со случаем когда для Description одновременно нету ID и VIN

Автор - Beerukoff
Дата добавления - 19.12.2016 в 12:24
Udik Дата: Понедельник, 19.12.2016, 16:25 | Сообщение № 12
Группа: Друзья
Ранг: Старожил
Сообщений: 1588
Репутация: 192 ±
Замечаний: 0% ±

Excel 2016 х 64
А код в таком виде почему-то не работает

Так правильно не работает. Искомые поля расположены до поля Description, а у Вас используется NextSibling. Нужно PreviousSibling применить.
[vba]
Код

Option Explicit

Public Sub getXML()
Dim docXML As Object, docNodes As Object, docNode As Object, childN As Object
Dim strURL As String

strURL = ThisWorkbook.Path & "\RegistrationCer.xml"
Set docXML = CreateObject("MSXML2.DOMDocument")
docXML.Load (strURL)

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

Loop

Next
End Sub

[/vba]


вот вам барабан
яд 41001231307558 wm R419131876897
udik1968@gmail.com
 
Ответить
Сообщение
А код в таком виде почему-то не работает

Так правильно не работает. Искомые поля расположены до поля Description, а у Вас используется NextSibling. Нужно PreviousSibling применить.
[vba]
Код

Option Explicit

Public Sub getXML()
Dim docXML As Object, docNodes As Object, docNode As Object, childN As Object
Dim strURL As String

strURL = ThisWorkbook.Path & "\RegistrationCer.xml"
Set docXML = CreateObject("MSXML2.DOMDocument")
docXML.Load (strURL)

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

Loop

Next
End Sub

[/vba]

Автор - Udik
Дата добавления - 19.12.2016 в 16:25
Beerukoff Дата: Понедельник, 19.12.2016, 17:09 | Сообщение № 13
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
Всем спасибо!!! Макрос (во всяком случае на бета тесте) работает вполне корректно.
 
Ответить
СообщениеВсем спасибо!!! Макрос (во всяком случае на бета тесте) работает вполне корректно.

Автор - Beerukoff
Дата добавления - 19.12.2016 в 17:09
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Импорт XML > Excel (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!