Гость
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Импорт через VBA из xml / 18 сообщений из 18, страница 1 из 1
09.05.2016, 23:33
    #39231999
Aleksiie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт через VBA из xml
Добрый день! Помогите, пожалуйста, с кодом в 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
10.05.2016, 09:04
    #39232081
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт через VBA из xml
по идее 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
10.05.2016, 23:53
    #39232908
Aleksiie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт через VBA из xml
Более полностью 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
11.05.2016, 00:11
    #39232912
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт через VBA из xml
Что за </THEADER>?
...
Рейтинг: 0 / 0
11.05.2016, 00:32
    #39232915
Aleksiie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт через VBA из xml
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
11.05.2016, 00:45
    #39232917
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт через VBA из xml
Ну блин, ЦБР ЦБР-ом, но стандарты XML никто не отменял.
Тэги внутри тэгов быть не могут
Комментарии должны начинаться с "<!--"

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

предоставляемого кредитной организацией (регистрационный номер кредитной организации - 123; период, за который предоставлена информация о счетах бухгалтерского учета - с 1 января 2009 года по 31 декабря 2011 года; дата формирования файла электронного документа - 3 марта 2012 года; отсутствуют электронные документы с наименованиями (именами файлов), содержащими одинаковые значения параметров NBf, NFf, Fggggmmdd, Lggggmmdd, Cggggmmdd), -
LSOZ_0123.0000_F20090101_L20111231_C20120303.000.xml ;
...
Рейтинг: 0 / 0
11.05.2016, 00:52
    #39232919
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт через VBA из xml
Shocker.ProКомментарии должны начитаться с "<!--"на сайте Гаранта - да, косяк, а вот в Главбухе, например, корректно
http://www.glavbukh.ru/npd/edoc/99_420245011_XA00MBO2NG
...
Рейтинг: 0 / 0
11.05.2016, 08:02
    #39232979
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт через VBA из xml
тогда по идее так
Код: 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
12.05.2016, 01:22
    #39233881
Aleksiie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт через VBA из xml
HandKot,
не хочет все равно "вытягивать"... Вложил примерный xml файл по указанному стандарту из этого Указания ЦБ, вдруг получится. Спасибо большое, кто откликнулся!
...
Рейтинг: 0 / 0
12.05.2016, 07:39
    #39233926
sergeyvg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт через VBA из xml
Предложенное 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
12.05.2016, 08:19
    #39233932
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт через VBA из xml
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
13.05.2016, 00:48
    #39234774
Aleksiie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт через VBA из xml
Спасибо за ответ! Но у меня макрос срабатывает без ошибок и чего бы то ещё ни было, а в результате тот же пустой лист без изменений на нем. Вариант sergeyvg с возможностью выбора файла дает тот же результат. У меня office 2013, библиотека XML, v3.0 включена... В существующих подключениях после работы макроса тоже пусто... В чем может быть проблема, не могу никак понять?
...
Рейтинг: 0 / 0
13.05.2016, 00:53
    #39234778
Aleksiie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт через VBA из xml
И еще офис 64 битный...
...
Рейтинг: 0 / 0
13.05.2016, 01:13
    #39234786
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт через VBA из xml
Aleksiieа в результате тот же пустой листА какой результат вы ожидаете от этого макроса?
...
Рейтинг: 0 / 0
13.05.2016, 09:30
    #39234866
Aleksiie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт через VBA из xml
Вывод на лист только заданных "полей" и в обозначенном формате (текст). Чтобы уйти от ручного "импорта" через вкладку данные - импорт данных... Потом хотел добавить возможность не выбора "отдельно" файла, а обозначения папки, в которой могут находиться тысячи таких xml (на форуме этот код есть - для обозначения папки с файлами, думал, что добавить его смогу, поэтому в задаче не указывал)...
...
Рейтинг: 0 / 0
13.05.2016, 09:39
    #39234872
Aleksiie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт через VBA из xml
Shocker.Pro,

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

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


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