Excel это не сложно
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
25.04.2024, 16:48:10

Войти
Хотите поблагодарить участника за дельный совет? Нажмите [Повысить]. Так вы заслуженно поднимите репутацию активному участнику.
33 243 Сообщений в 5 458 Тем от 6 763 Пользователей
Последний пользователь: tetrapack
*
Перейти на сайт Хитрости Надстройка MulTEx Обучающие тренинги Наша группа ВКонтакте
Правила форума Начало Помощь Поиск Календарь Войти Регистрация Выйти
+  Excel это не сложно
|-+  Основные форумы
| |-+  Вопросы по Excel и VBA
| | |-+  выборка данных из кучи xml файлов в таблицу excel
Страниц: 1 2 [3] 4  Все   Вниз
Печать
Автор Тема: выборка данных из кучи xml файлов в таблицу excel  (Прочитано 17034 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 831



Просмотр профиля WWW
« Ответ #30 : 14.09.2021, 08:24:09 »

я как то неправильно формулирую свои запросы гуглу
почти уверен в этом. Я вот набираю xpath xml и нахожу кучу примеров под различные нужды.
Например, под Вашу задачу должно быть что-то вроде этого:
Код: (vb)
For each oEl in xmlDoc.DocumentElement.SelectNodes("//ESADout_CU/ESADout_CUGoodsShipment/ESADout_CUGoods/ESADout_CUPresentedDocument[catESAD_cu:PresentedDocumentModeCode=0422]/cat_ru:PrDocumentNumber")
' обработка
Next
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
dr_peper
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 43


Просмотр профиля
« Ответ #31 : 15.09.2021, 09:02:08 »


Например, под Вашу задачу должно быть что-то вроде этого:


Вы уж меня простите, но не пойму как дописать Вашу часть кода чтоб заработало.
Записан
dr_peper
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 43


Просмотр профиля
« Ответ #32 : 04.10.2021, 09:14:21 »

Например, под Вашу задачу должно быть что-то вроде этого:
Код: (vb)
For each oEl in xmlDoc.DocumentElement.SelectNodes("//ESADout_CU/ESADout_CUGoodsShipment/ESADout_CUGoods/ESADout_CUPresentedDocument[catESAD_cu:PresentedDocumentModeCode=0422]/cat_ru:PrDocumentNumber")
' обработка
Next


Не получается у меня с Вашим примером разобраться. Написал вот так, но он перебирает все значения и пишет только последнее. А как взять 0422 не пойму.
Код: (vb)
Set nESADout_CUPresentedDocument = xdoc.DocumentElement.SelectNodes("//ESADout_CU/ESADout_CUGoodsShipment/ESADout_CUGoods/ESADout_CUPresentedDocument")
                For Each nPresentedDocument In nESADout_CUPresentedDocument
                sGoodsPresentedDocumentModeCode = nPresentedDocument.SelectSingleNode("catESAD_cu:PresentedDocumentModeCode").Text
                Next
Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 831



Просмотр профиля WWW
« Ответ #33 : 04.10.2021, 10:11:59 »

перебирает все значения и пишет только последнее
изучайте циклы. For Each перебирает все значения, но в переменную sGoodsPresentedDocumentModeCode Вы запомнить можете только одно. Вот оно одно и запоминается - то, которое было на последнем проходе цикла, ибо все предыдущие затираются, что логично.
А как взять 0422 не пойму
внимательнее смотреть, что предлагают. Посмотрите на мой код и на свой - найдите отличия. Хотя бы по значению 0422.
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
dr_peper
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 43


Просмотр профиля
« Ответ #34 : 04.10.2021, 10:44:39 »

Посмотрите на мой код и на свой - найдите отличия. Хотя бы по значению 0422.


Код: (vb)
Set nESADout_CUPresentedDocument = xdoc.DocumentElement.SelectNodes("//ESADout_CU/ESADout_CUGoodsShipment/ESADout_CUGoods/ESADout_CUPresentedDocument")
                For Each nPresentedDocument In nESADout_CUPresentedDocument.SelectSingleNode("//ESADout_CU/ESADout_CUGoodsShipment/ESADout_CUGoods/ESADout_CUPresentedDocument[catESAD_cu:PresentedDocumentModeCode=0422]/cat_ru:PrDocumentNumber").Text


Ну вот так переписал, выдает ошибку
Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 831



Просмотр профиля WWW
« Ответ #35 : 04.10.2021, 14:47:57 »

Ну вот так переписал, выдает ошибку
Ну и да. Вы упорно не хотите понимать и учить принципы xpath и даже переписать мой код не можете правильно. Мне на протяжении трех страниц темы немного уже поднадоело про азы программирования рассказывать и давать готовые решения под Ваши задачи.
Вот Вы приложили код. Вы сами понимаете, что он должен сделать? Где должен быть просмотрен заданный Вами в цикле путь к узлу? Уверен, что нет. И опять Вы даже не попытались сравнить мой код со своим.
У меня обращение к узлу в цикле идет напрямую из xmlDoc.DocumentElement.SelectNodes. А у Вас что за выдумки? Сначала указываете в переменной nESADout_CUPresentedDocument путь к "//ESADout_CU/ESADout_CUGoodsShipment/ESADout_CUGoods/ESADout_CUPresentedDocument", а потом еще из этого узла хотите получить опять тот же путь "//ESADout_CU/ESADout_CUGoodsShipment/ESADout_CUGoods/ESADout_CUPresentedDocument....". Конечно, будет ошибка, потому что код делает то, что ему говорят, а не то, что Вы хотите увидеть в итоге.
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
dr_peper
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 43


Просмотр профиля
« Ответ #36 : 04.10.2021, 22:12:50 »

Мне на протяжении трех страниц темы немного уже поднадоело про азы программирования рассказывать и давать готовые решения под Ваши задачи.
Всегда думал, что такого рода форумы создаются для помощи людям которые не особо шарят в чем то, но хотят разобраться.
А такие профи как Вы им помогают в этом.
Я уже много читал про xml и xpath, но пока четкой картинки нет.
Спасибо за помощь.
Записан
dr_peper
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 43


Просмотр профиля
« Ответ #37 : 05.10.2021, 03:40:34 »

Код: (vb)
Set nESADout_CUPresentedDocument = xdoc.DocumentElement.SelectNodes("//ESADout_CU/ESADout_CUGoodsShipment/ESADout_CUGoods/ESADout_CUPresentedDocument")
                For Each nPresentedDocument In nESADout_CUPresentedDocument
                sGoodsPresentedDocumentModeCode = nPresentedDocument.SelectSingleNode("catESAD_cu:PresentedDocumentModeCode").Text
                sPrDocumentNumber = nPresentedDocument.SelectSingleNode("cat_ru:PrDocumentNumber").Text
                
                If sGoodsPresentedDocumentModeCode Like "0422" Then Application.Range("DTRange").Cells(row_number, 8).Value = sGoodsPresentedDocumentModeCode: Application.Range("DTRange").Cells(row_number, 9).Value = sPrDocumentNumber
                
                Next

Не получается как у Вас сделать. Смог только так, при этом виснет жестко, т.к. перебирает каждый узел.

Заменил if на case, обработалось гораздо быстрее.

Код: (vb)
Select Case sGoodsPresentedDocumentModeCode
                Case "0422"
                Application.Range("DTRange").Cells(row_number, 8).Value = sGoodsPresentedDocumentModeCode
                Application.Range("DTRange").Cells(row_number, 9).Value = sPrDocumentNumber
                Case Else
                GoTo a3
                End Select


Может всетаки поделитесь своим решением, чтобы лишние узлы не обрабатывать?
« Последнее редактирование: 05.10.2021, 03:56:55 от dr_peper » Записан
dr_peper
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 43


Просмотр профиля
« Ответ #38 : 05.10.2021, 05:43:51 »

C case вышел самообман Смеющийся
Записан
dr_peper
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 43


Просмотр профиля
« Ответ #39 : 05.10.2021, 10:03:28 »

Код: (vb)
 Set nESADout_CUPresentedDocument = xdoc.DocumentElement.SelectNodes("//ESADout_CU/ESADout_CUGoodsShipment/ESADout_CUGoods/*[catESAD_cu:PresentedDocumentModeCode=04022]")
                For Each nPresentedDocument In nESADout_CUPresentedDocument
                sGoodsPresentedDocumentModeCode = nPresentedDocument.SelectSingleNode("catESAD_cu:PresentedDocumentModeCode").Text
                sPrDocumentNumber = nPresentedDocument.SelectSingleNode("cat_ru:PrDocumentNumber").Text
                Next

Так или нет?
Прокомментируйте пожалуйста.
Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 831



Просмотр профиля WWW
« Ответ #40 : 06.10.2021, 09:53:37 »

Так или нет?
Вот без обид, но. Вы предлагаете мне скачать файл XML из начала темы, убедиться, что там есть все эти узлы, затем написать с нуля код, в который где-то поместить приведенный Вами кусок кода выше и проверить - оно работает или нет? В то время как Вы можете просто запустить свой готовый код у себя на корректных данных и посмотреть даже в пошаговом режиме что отбирается и что получается. Очень странный вопрос ко мне, на мой взгляд...
Могу сказать только это: виду обращение к узлам выглядит верно(в общем-то, я это и предлагал, ну да ладно). Но Вы почему-то так и не ознакомились с азами работы в циклах. У Вас опять будет в переменных значение последнего отобранного узла. Мы это уже обсуждали выше.
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
dr_peper
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 43


Просмотр профиля
« Ответ #41 : 07.10.2021, 02:25:05 »

Вы предлагаете мне скачать файл XML из начала темы, убедиться, что там есть все эти узлы, затем написать с нуля код, в который где-то поместить приведенный Вами кусок кода выше и проверить - оно работает или нет? У Вас опять будет в переменных значение последнего отобранного узла. Мы это уже обсуждали выше.

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

Код: (vb)
Set nESADout_CUPresentedDocument = xdoc.DocumentElement.SelectNodes("//ESADout_CU/ESADout_CUGoodsShipment/ESADout_CUGoods/ESADout_CUPresentedDocument[catESAD_cu:PresentedDocumentModeCode=04022]")
                sGoodsPresentedDocumentModeCode = ""
                sPrDocumentNumber = ""
                For Each nPresentedDocument In nESADout_CUPresentedDocument
                sGoodsPresentedDocumentModeCode = nPresentedDocument.SelectSingleNode("catESAD_cu:PresentedDocumentModeCode").Text
                sPrDocumentNumber = nPresentedDocument.SelectSingleNode("cat_ru:PrDocumentNumber").Text
                Next
Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 831



Просмотр профиля WWW
« Ответ #42 : 07.10.2021, 11:00:36 »

Вот скажите, для чего Вам цикл? Зачем обнулять? Вам же надо эти значения куда-то записывать? Так и записывайте внутри цикла в ячейки, изменяя счетчик по ходу цикла. Или я вообще не понимаю, что Вы хотите и что я должен проверить на правильность...
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
dr_peper
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 43


Просмотр профиля
« Ответ #43 : 07.10.2021, 13:01:48 »

Вот скажите, для чего Вам цикл? Зачем обнулять? Вам же надо эти значения куда-то записывать?
Я их записываю только это ниже в моем коде. Цикл нужен т. К. Эти значения идут потоварно  в дт, по каким то товарам есть, а по каким то нет.
Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 831



Просмотр профиля WWW
« Ответ #44 : 07.10.2021, 13:28:45 »

Вы, видимо, до сих пор не понимаете назначение цикла и принцип работы.
Осваивайте пошаговую отладку - я в теме уже давал ссылку.
Вот найдет код у Вас 10 значений для PresentedDocumentModeCode=04022. И что попадет у Вас при записи
только это ниже в моем коде
?
Очевидно, что только последнее значение, а не все 10. Все же настоятельно рекомендую хотя бы книжку какую-то начать по VBA читать и постигать азы от простого к сложному. Или я до сих пор не понимаю, что Вы там ниже записываете и зачем цикл.
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
Страниц: 1 2 [3] 4  Все   Вверх
Печать
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2011, Simple Machines Valid XHTML 1.0! Valid CSS!
Яндекс.Метрика Рейтинг@Mail.ru