powered by simpleCommunicator - 2.0.39     © 2025 Programmizd 02
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Импорт через VBA из xml
18 сообщений из 18, страница 1 из 1
Импорт через VBA из xml
    #39231999
Aleksiie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день! Помогите, пожалуйста, с кодом в VBA.
Не могу понять, что я должен указать для моего случая в коде в значении XMLDoc.getElementsByTagName("???")
Здесь код
Sub ReadXML()
Dim fileToOpen As Variant
Dim XMLDoc As New DOMDocument
Dim xmlE As IXMLDOMElement
Dim XMLNode As IXMLDOMNode
Dim o As Object
fileToOpen = Application.GetOpenFilename
XMLDoc.Load fileToOpen
For Each xmlE In XMLDoc.getElementsByTagName("???")
On Error Resume Next
Debug.Print xmlE.getAttribute("TNAME")
Debug.Print xmlE.SelectSingleNode("ACCOUNT").Text
Next
End Sub
xml файл имеет следующую структуру
<Rec len="222" RecID="1">
<OPEN>01.01.2014</OPEN>
<AGREE_DATE></AGREE_DATE>
<AGREE_NUM></AGREE_NUM>
<TNAME>//имя адрес//</TNAME>
<TNAME_2>Транзит CNY</TNAME_2>
<ACCOUNT>10000000000000000001</ACCOUNT>
</Rec>
<Rec len="234" RecID="2">
<OPEN>26.10.2013</OPEN>
<AGREE_DATE></AGREE_DATE>
<AGREE_NUM></AGREE_NUM>
<TNAME>//имя адрес2//</TNAME>
<TNAME_2>Касса</TNAME_2>
<ACCOUNT>20000000000900000008</ACCOUNT>
</Rec>
и так далее <RecID="n" len="n"><меняются и являются началом каждой n-й строки -->
Заранее спасибо за помощь!
...
Рейтинг: 0 / 0
Импорт через VBA из xml
    #39232081
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по идее XML не валидный, нет корневого элемента
был бы, то надо так
Код: vbnet
1.
2.
3.
4.
5.
For Each xmlE In XMLDoc.SelectNodes("ROOT/Rec")
 On Error Resume Next
 Debug.Print xmlE.SelectSingleNode("TNAME").Text
 Debug.Print xmlE.SelectSingleNode("ACCOUNT").Text
Next
...
Рейтинг: 0 / 0
Импорт через VBA из xml
    #39232908
Aleksiie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Более полностью xml файл выглядит так
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
<?xml version="1.0" encoding="WINDOWS-1251"?>
<TRANSPORT verspo="I-век">
<PBDate>01.01.2015</PBDate>
<PLDate>01.04.2016</PLDate>
</THEADER>
<Table len="" nRec="15307">
<Rec len="222" RecID="1">
<OPEN>01.01.2014</OPEN>
<AGREE_DATE></AGREE_DATE>
<AGREE_NUM></AGREE_NUM>
<TNAME>//имя адрес//</TNAME>
<TNAME_2>Транзит CNY</TNAME_2>
<ACCOUNT>10000000000000000001</ACCOUNT>
</Rec>
<Rec len="234" RecID="2">
<OPEN>26.10.2013</OPEN>
<AGREE_DATE></AGREE_DATE>
<AGREE_NUM></AGREE_NUM>
<TNAME>//имя адрес2//</TNAME>
<TNAME_2>Касса</TNAME_2>
<ACCOUNT>20000000000900000008</ACCOUNT>
</Rec>
и так далее <RecID="n" len="n"><меняются и являются началом каждой n-й строки -->


Модератор: Для оформления XML есть специальный тэг - FAQ
в xml файле каждая запись обозначается Rec len="значение" RecID="последовательный номер" и имеет соответственно следующий номер. Получается нельзя обозначить корневой элемент таким образом, чтобы через VBA его прочитать...
...
Рейтинг: 0 / 0
Импорт через VBA из xml
    #39232912
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что за </THEADER>?
...
Рейтинг: 0 / 0
Импорт через VBA из xml
    #39232915
Aleksiie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Немного обрезал и не убрал до конца, а сам формат файла xml сделан по форме из Указания Банка России от 30 ноября 2014 г. N 3462-У
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
<?xml version="1.0" encoding="windows-1251"?>
<TRANSPORT verspo="nver">
<THEADER len="n" date="дд.мм.гггг" time="чч:мм:сс" nmbbank="NB/NF"
vsp="naimen"
file="LSOZ_<NBf>_<NFf>_F<ggggmmdd>_L<ggggmmdd>__C<ggggmmdd>_<NPP> .xml">
<! -- начало данных заголовка -->
данные заголовка
</THEADER><! -- окончание данных заголовка -->
<Таblе len="n" nRec="n"><! -- начало данных о счетах -->
<Rec RecID="1" len="n"><! -- начало 1-й строки -->
данные о счете
</Rec><! -- окончание 1-й строки -->
<Rec RecID="2" len="n"><! -- начало 2-й строки -->
данные о счете
</Rec><! -- окончание 2-й строки -->
<Rec RecID="n" len="n"><! -- начало n-й строки -->
данные о счете
</Rec><! -- окончание n-й строки -->
</Table><! -- окончание данных о счетах -->
</TRANSPORT>

...
Рейтинг: 0 / 0
Импорт через VBA из xml
    #39232917
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну блин, ЦБР ЦБР-ом, но стандарты XML никто не отменял.
Тэги внутри тэгов быть не могут
Комментарии должны начинаться с "<!--"

Проверяйте тут
http://www.xmlvalidation.com
...
Рейтинг: 0 / 0
Импорт через VBA из xml
    #39232918
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но и само Указание тоже стоило бы прочесть не через слово:
Пример наименования (имени файла) электронного документа:

предоставляемого кредитной организацией (регистрационный номер кредитной организации - 123; период, за который предоставлена информация о счетах бухгалтерского учета - с 1 января 2009 года по 31 декабря 2011 года; дата формирования файла электронного документа - 3 марта 2012 года; отсутствуют электронные документы с наименованиями (именами файлов), содержащими одинаковые значения параметров NBf, NFf, Fggggmmdd, Lggggmmdd, Cggggmmdd), -
LSOZ_0123.0000_F20090101_L20111231_C20120303.000.xml ;
...
Рейтинг: 0 / 0
Импорт через VBA из xml
    #39232919
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProКомментарии должны начитаться с "<!--"на сайте Гаранта - да, косяк, а вот в Главбухе, например, корректно
http://www.glavbukh.ru/npd/edoc/99_420245011_XA00MBO2NG
...
Рейтинг: 0 / 0
Импорт через VBA из xml
    #39232979
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тогда по идее так
Код: vbnet
1.
2.
3.
4.
5.
For Each xmlE In XMLDoc.SelectNodes("TRANSPORT/Table/Rec")
 On Error Resume Next
 Debug.Print xmlE.SelectSingleNode("TNAME").Text
 Debug.Print xmlE.SelectSingleNode("ACCOUNT").Text
Next
...
Рейтинг: 0 / 0
Импорт через VBA из xml
    #39233881
Aleksiie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HandKot,
не хочет все равно "вытягивать"... Вложил примерный xml файл по указанному стандарту из этого Указания ЦБ, вдруг получится. Спасибо большое, кто откликнулся!
...
Рейтинг: 0 / 0
Импорт через VBA из xml
    #39233926
sergeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Предложенное HandKot вполне работает
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Dim XMLDoc As New DOMDocument

Sub test()
  Set FS = CreateObject("Scripting.FileSystemObject")
  fileToOpen = Application.GetOpenFilename(FileFilter:="XML Files (*.xml),*.xml", MultiSelect:=False, _
    Title:="Выберите файл XML с вашими данными")
  If VarType(fileToOpen) = vbBoolean Then End
  XMLDoc.loadXML FS.GetFile(fileToOpen).OpenAsTextStream(1).ReadAll()
  Set XMLNode = XMLDoc.documentElement
  If XMLNode Is Nothing Then
    MsgBox ("Файл не открылся. Попробуйте закрыть и вновь запустить Excel")
    End
  End If
  For Each xmlE In XMLDoc.SelectNodes("TRANSPORT/Table/Rec")
    On Error Resume Next
    Debug.Print xmlE.selectSingleNode("TNAME").Text
    Debug.Print xmlE.selectSingleNode("ACCOUNT").Text
  Next
End Sub
...
Рейтинг: 0 / 0
Импорт через VBA из xml
    #39233932
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AleksiieHandKot,
не хочет все равно "вытягивать"... Вложил примерный xml файл по указанному стандарту из этого Указания ЦБ, вдруг получится. Спасибо большое, кто откликнулся!

что-то не так сделали. Вот по Вашему файлу
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Public Sub test()
    Dim XMLDoc As Object
    
    Set XMLDoc = CreateObject("MSXML2.DOMDocument")

    bParse = XMLDoc.Load("путь до файла")
    If Not bParse Then
        Debug.Print "Ошибка парсинга файла- " & XMLDoc.parseError.reason
    Else
        For Each xmlE In XMLDoc.SelectNodes("TRANSPORT/Table/Rec")
            On Error Resume Next
            Debug.Print xmlE.SelectSingleNode("TNAME").Text
            Debug.Print xmlE.SelectSingleNode("ACCOUNT").Text
        Next
    End If
    Set XMLDoc = Nothing
End Sub



ЗЫЖ XML чувствителен к регистру букв
...
Рейтинг: 0 / 0
Импорт через VBA из xml
    #39234774
Aleksiie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ответ! Но у меня макрос срабатывает без ошибок и чего бы то ещё ни было, а в результате тот же пустой лист без изменений на нем. Вариант sergeyvg с возможностью выбора файла дает тот же результат. У меня office 2013, библиотека XML, v3.0 включена... В существующих подключениях после работы макроса тоже пусто... В чем может быть проблема, не могу никак понять?
...
Рейтинг: 0 / 0
Импорт через VBA из xml
    #39234778
Aleksiie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И еще офис 64 битный...
...
Рейтинг: 0 / 0
Импорт через VBA из xml
    #39234786
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksiieа в результате тот же пустой листА какой результат вы ожидаете от этого макроса?
...
Рейтинг: 0 / 0
Импорт через VBA из xml
    #39234866
Aleksiie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вывод на лист только заданных "полей" и в обозначенном формате (текст). Чтобы уйти от ручного "импорта" через вкладку данные - импорт данных... Потом хотел добавить возможность не выбора "отдельно" файла, а обозначения папки, в которой могут находиться тысячи таких xml (на форуме этот код есть - для обозначения папки с файлами, думал, что добавить его смогу, поэтому в задаче не указывал)...
...
Рейтинг: 0 / 0
Импорт через VBA из xml
    #39234872
Aleksiie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Теперь понял,
Debug.Print выводит текст с специальное окно - Immediate Window
Спасибо! Дальше поправлю )
...
Рейтинг: 0 / 0
Импорт через VBA из xml
    #39235081
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AleksiieShocker.Pro,

Теперь понял,
Debug.Print выводит текст с специальное окно - Immediate Window
Спасибо! Дальше поправлю )
как раз про Debug.Print подумал, что не убрали :-)
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Импорт через VBA из xml
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]