Vba excel xml createelement

July 3 2015, 15:35

Category:

  • IT
  • Cancel

Часто возникает задача записать xml файл. В системе Windows есть своя встроенная библиотека MSXML которая позволяет работать с XML. Можно ей воспользоваться, например, находясь из Excel, открыв встроенный редактор Visual Basic for Application. Можно комбинацией клавиш Alt-F11

Итак мы создаем документ:


Dim xmlDoc As Object
Set xmlDoc = CreateObject("Msxml.DOMDocument")

В какой кодировке нам нужен этот файл создать? Тут не надо ничем заморачиваться, никакой перекодировкой, Microsoft о нас подумал и все преобразования сделает сам. Если это utf-8 пишем так:


Set xmlnode = xmlDoc.createProcessingInstruction("xml", " version='1.0' encoding='utf-8'")
xmlDoc.appendChild xmlnode

А если это windows-1251, то так


Set xmlnode = xmlDoc.createProcessingInstruction("xml", " version='1.0' encoding='windows-1251'")
xmlDoc.appendChild xmlnode

Создаем корневой объект:


Set rootnode = xmlDoc.createElement("rootName")

Можно добавить к нему текст:


rootnode.Text = "Какой-нибудь тест если понадобится"

Можно добавить к нему атрибут:


Set attr = xmlDoc.createAttribute("AttrName")
attr.Value = "Значение"
rootnode.attributes.setNamedItem (attr)

И, наконец, можно добавить новый узел:


Set childnode = xmlDoc.createElement("NodeName")
rootnode.appendChild (childnode)

После всей проделанной работы добавим наш корневой элемент:


xmlDoc.appendChild rootnode

И сохраним в файл:


xmlDoc.Save "ourTest.xml"

Вот и все. Использовался VBA для Excel2003.

Hi Struggling with VBA code. I am using Microsoft XML V6.0 dom object:

I need following xml to be created exactly:

<UserAccountDetail Type="Account">
    <AccountName>
        <Name>rkhan@gmail.com</Name>
        <Pwd>kdfslj</Pwd>
        <Status>N</Status>
        <ClientId>kdjslj</ClientId>
        <ClientSecret>dkfjsl</ClientSecret>
    </AccountName>
</UserAccountDetail>

Here is my Code so far:

' Create a processing instruction targeted for xml.
    Set node = dom.createProcessingInstruction("xml", "version='1.0'")
    dom.appendChild node
    Set node = Nothing
    
    ' Create a comment for the document.
    Set node = dom.createComment("sample xml file created using XML DOM object.")
    dom.appendChild node
    Set node = Nothing
    
    ' Create the root element.
    
    Set root = dom.createElement("AccountName")
    ' Create a "created" attribute for the root element and
    ' assign the "using dom" character data as the attribute value.
    Set attr = dom.createAttribute("Type")
    attr.Value = "Account"
    root.setAttributeNode attr
    Set attr = Nothing
    
    ' Add the root element to the DOM instance.
    dom.appendChild root
    ' Add a newline plus tab.
    root.appendChild dom.createTextNode(vbNewLine + vbTab)
    ' Create a text element Account Name.
    Set node = dom.createElement("Name")
    node.Text = Trim(UserName)
    ' Add text node to the root element.
    dom.getElementsByTagName("AccountName")(0).appendChild node
    Set node = Nothing
    
    ' Create a text element Password.
    'root(0).appendChild dom.createTextNode(vbNewLine + vbTab)
    Set node = dom.createElement("Pwd")
    node.Text = Trim(UserPwd)
    ' Add text node to the root element.
    dom.getElementsByTagName("AccountName")(0).appendChild node
    node.appendChild dom.createTextNode(vbNewLine + vbTab)
    Set node = Nothing
    
    ' Create a text element Status.
    'root(0).appendChild dom.createTextNode(vbNewLine + vbTab)
    Set node = dom.createElement("Status")
    node.Text = Trim(Status)
    ' Add text node to the root element.
    dom.getElementsByTagName("AccountName")(0).appendChild node
    node.appendChild dom.createTextNode(vbNewLine + vbTab)
    Set node = Nothing
    
    ' Create a text element Client Id.
    'root(0).appendChild dom.createTextNode(vbNewLine + vbTab)
    Set node = dom.createElement("ClientId")
    node.Text = Trim(strClientId)
    ' Add text node to the root element.
    dom.getElementsByTagName("AccountName")(0).appendChild node
    node.appendChild dom.createTextNode(vbNewLine + vbTab)
    Set node = Nothing
    
    ' Create a text element Client Secret.
    'root(0).appendChild dom.createTextNode(vbNewLine + vbTab)
    Set node = dom.createElement("ClientSecret")
    node.Text = Trim(strClientSecret)
    ' Add text node to the root element.
    dom.getElementsByTagName("AccountName")(0).appendChild node
    node.appendChild dom.createTextNode(vbNewLine + vbTab)
    Set node = Nothing

Ike's user avatar

Ike

7,8904 gold badges11 silver badges29 bronze badges

asked Jun 4, 2016 at 19:20

Rashid Khan's user avatar

1

Using VBA’s MSXML object to create an XML document will not automatically pretty print output with indentation. To resolve, run an identity transform XSLT just after creating and processing your dom object with child elements. Fortunately, MSXML can run XSLT 1.0 scripts:

Dim xslDoc As New MSXML2.DOMDocument60, newDoc As New MSXML2.DOMDocument60

'...same code to build XML document...'

' PRETTY PRINT RAW OUTPUT '
xslDoc.LoadXML "<?xml version=" & Chr(34) & "1.0" & Chr(34) & "?>" _
        & "<xsl:stylesheet version=" & Chr(34) & "1.0" & Chr(34) _
        & "                xmlns:xsl=" & Chr(34) & "http://www.w3.org/1999/XSL/Transform" & Chr(34) & ">" _
        & "<xsl:strip-space elements=" & Chr(34) & "*" & Chr(34) & " />" _
        & "<xsl:output method=" & Chr(34) & "xml" & Chr(34) & " indent=" & Chr(34) & "yes" & Chr(34) & "" _
        & "            encoding=" & Chr(34) & "UTF-8" & Chr(34) & "/>" _
        & " <xsl:template match=" & Chr(34) & "node() | @*" & Chr(34) & ">" _
        & "  <xsl:copy>" _
        & "   <xsl:apply-templates select=" & Chr(34) & "node() | @*" & Chr(34) & " />" _
        & "  </xsl:copy>" _
        & " </xsl:template>" _
        & "</xsl:stylesheet>"

xslDoc.async = False     
dom.transformNodeToObject xslDoc, newDoc
newDoc.Save ActiveWorkbook.Path & "Output.xml"

answered Jun 4, 2016 at 20:08

Parfait's user avatar

ParfaitParfait

103k17 gold badges95 silver badges123 bronze badges

0

 

Werty

Пользователь

Сообщений: 227
Регистрация: 21.01.2013

Здравствуйте!

Из таблицы Excel генерируется код с определённой структурой для xml файла. Всё вроде так, но никак не пойму как добавить дополнительный атрибут в код … Как есть и как должно — указал в файле Excel. Прилагаю файл с расширением xml для просмотра результата работы макроса (файл xml должен находиться в одной папке с файлом Excel).

Код макроса взят с этого форума, но доделать не смог …

Файлы прилагаю.

Прикрепленные файлы

  • Help.rar (11.95 КБ)

Спокойствие — величайшее проявление силы.

 

EducatedFool

Пользователь

Сообщений: 3631
Регистрация: 23.12.2012

#2

05.02.2013 02:50:13

Код
    For Each cell In ra.Cells    ' перебираем все строки

        With rootnode.appendChild(XML.createElement("table"))    ' создаём узел в XML
            ' и добавляем в него значения
            .Attributes.setNamedItem(XML.createAttribute("name")).Text = "WebXml"

            With .appendChild(XML.createElement("column"))    ' для первого столбца
                .Attributes.setNamedItem(XML.createAttribute("name")).Text = "id"
                .Text = cell.EntireRow.Cells(1)
            End With

            For i = 2 To 4    ' для каждого столбца
                ColumnName$ = Cells(1, i)
                .appendChild(XML.createElement(ColumnName$)).Text = cell.EntireRow.Cells(i)
            Next
        End With
        
    Next cell
 

Werty

Пользователь

Сообщений: 227
Регистрация: 21.01.2013

Здравствуйте!

EducatedFool! Вы невероятны!
Всё работает, всё как нужно. Подскажите пожалуйста где можно об этом почитать? Я изучаю Excel по книге «Профессиональное программирование на VBA в Excel 2003» автор John Walkenbach. Но я в ней не нашёл материала о котором здесь спрашивал. Тот что в ней есть, по формированию xml файлов, я уже могу использовать, но это простой перебор и запись в текстовый файл. Ваше решение задачи для меня мечта.

С большим уважением ко всем и особенно к EducatedFool,
Василий.

Спокойствие — величайшее проявление силы.

 

По книжкам — ничего не могу подсказать, сам я ни одной книги так и не прочитал)

Если мне надо написать какой-то код, в котором я не разбираюсь, — я ищу примеры кода в Яндексе.
В том же XML я ещё полтора года назад совсем не разбирался.
А как понадобилось — поглядел примеры на форумах, и через пару часов уже писал достаточно сложные обработки XML.

 

Werty

Пользователь

Сообщений: 227
Регистрация: 21.01.2013

И снова здравствуйте!

Сделал с помощью добрых людей (EducatedFool) как нужно … разбираюсь по-тихоньку (работаю … поздно прихожу и времени мало  остаётся …). Сейчас вот застрял на добавлении к главному узлу ещё одного общего узла для всех вложенных узлов.
Прошу помощи  :( Пожалуйста.

Прикрепленные файлы

  • Help.rar (13.96 КБ)

Спокойствие — величайшее проявление силы.

 

EducatedFool

Пользователь

Сообщений: 3631
Регистрация: 23.12.2012

#6

05.02.2013 23:16:42

Попробуйте так, со вложенными конструкциями With … End With:
(в описании изменений в Excel вы не написали про тег — я не стал его убирать)

Код
Sub YML_For_Professional()
    On Error Resume Next
    xmlpath$ = ThisWorkbook.Path & "WebXml.xml"
    Set XML = CreateObject("Microsoft.XMLDOM")

    Dim ra As Range, cell As Range
    Set ra = Range([A2], Range("A" & Rows.Count).End(xlUp))    ' заполненные строки

    ' задаем кодировку для XML
    XML.appendChild XML.createProcessingInstruction("xml", "version='1.0' encoding='utf-8'")

    With XML.appendChild(XML.createElement("pma_xml_export"))
        .Attributes.setNamedItem(XML.createAttribute("version")).Text = "1.0"
        With .appendChild(XML.createElement("databas"))
            .Attributes.setNamedItem(XML.createAttribute("name")).Text = "loginuser"
            ' добавляем дочерние узлы для каждой строки
            For Each cell In ra.Cells    ' перебираем все строки
                With .appendChild(XML.createElement("table"))    ' создаём узел в XML
                    ' и добавляем в него значения
                    .Attributes.setNamedItem(XML.createAttribute("name")).Text = "WebXml"
                    For i = 1 To 4    ' для каждого столбца
                        With .appendChild(XML.createElement("column"))    ' к элементу column
                            ColumnName$ = Cells(1, i)    'дописываем атрибут name
                            .Attributes.setNamedItem(XML.createAttribute("name")).Text = ColumnName$
                            .Text = cell.EntireRow.Cells(i)    'и присваиваем значение
                        End With
                    Next
                End With
            Next cell
        End With
    End With

    XML.Save xmlpath$    ' сохраняем XML
End Sub
 

Werty

Пользователь

Сообщений: 227
Регистрация: 21.01.2013

Благодарю Вас! Работает как нужно! Про тег все правильно.

Отпишусь после заливки на сервер. С огромным уважением, Василий.

Спокойствие — величайшее проявление силы.

 

Werty

Пользователь

Сообщений: 227
Регистрация: 21.01.2013

#8

05.02.2013 23:36:15

Залил на сервер — всё работает!
Низкий Вам поклон EducatedFool!

Всем доброй ночи!

Спокойствие — величайшее проявление силы.

createElement Method

Creates an element node using the specified name.

[Script]

Script Syntax

var objXMLDOMElement = oXMLDOMDocument.createElement(tagName);

Parameters

tagName
A string specifying the name for the new element node. The name is case-sensitive. This name is subsequently available as the element node’s nodeName property.

Return Value

An object. Returns the IXMLDOMElement object for the new element.

Example

The following script example creates an element called PAGES and appends it to an IXMLDOMNode object. It then sets the text value of the element to 400.

var xmlDoc = new ActiveXObject("Msxml2.DOMDocument.5.0");
var root;
var newElem;
xmlDoc.async = false;
xmlDoc.load("books.xml");
if (xmlDoc.parseError.errorCode != 0) {
   var myErr = xmlDoc.parseError;
   alert("You have error " + myErr.reason);
} else {
   root = xmlDoc.documentElement;
   newElem = xmlDoc.createElement("PAGES");
   root.childNodes.item(0).appendChild(newElem);
   root.childNodes.item(0).lastChild.text = "400";
   alert(root.childNodes.item(0).xml);
}

[Visual Basic]

Visual Basic Syntax

Set objXMLDOMElement = oXMLDOMDocument.createElement(tagName)

Parameters

tagName
A string specifying the name for the new element node. The name is case-sensitive. This name is subsequently available as the element node’s nodeName property.

Return Value

An object. Returns the IXMLDOMElement object for the new element.

Example

The following Microsoft® Visual Basic® example creates an element called PAGES and appends it to an IXMLDOMNode object. It then sets the text value of the element to 400.

Dim xmlDoc As New Msxml2.DOMDocument50
Dim root As IXMLDOMElement
Dim newElem As IXMLDOMElement
xmlDoc.async = False
xmlDoc.Load ("books.xml")
If (xmlDoc.parseError.errorCode <> 0) Then
   Dim myErr
   Set myErr = xmlDoc.parseError
   MsgBox("You have error " & myErr.reason)
Else
   Set root = xmlDoc.documentElement
   Set newElem = xmlDoc.createElement("PAGES")
   root.childNodes.Item(0).appendChild newElem
   root.childNodes.Item(0).lastChild.Text = "400"
   MsgBox root.childNodes.Item(0).xml
End If

[C/C++]

C/C++ Syntax

HRESULT createElement(
    BSTR tagName,
    IXMLDOMElement **element);

Parameters

tagName [in]
The name for the new element node. It is case-sensitive. This name is subsequently available as the element node’s nodeName property.
element [out,retval]
The address of the IXMLDOMElement interface for the new element.

C/C++ Return Values

S_OK
The value returned if successful.
E_INVALIDARG
The value returned if the element parameter is Null.
E_FAIL
The value returned if an error occurs.

Remarks

Creating an element with this method is the same as using createNode where the type parameter value is NODE_ELEMENT and no namespace is specified.

You cannot create a namespace-qualified element using the createElement method. Regardless of whether a namespace prefix is included in the tagName parameter, the namespaceURI property for the new element node is set to an empty string, «». An element node constructed as part of an XML document load operation will never have both a prefix and an empty namespace Uniform Resource Identifier (URI). You can only create a namespace-qualified element using the createNode method of the DOMDocument object.

Although this method creates the new object in the context of this document, it does not automatically add the new object to the document tree. In other words, although the ownerDocument property of the new node points to this document object, the parentNode property is set to Null. To add the new object, you must explicitly call one of the node insert methods, insertBefore method, replaceChild method, or appendChild method.

The nodeType property has the value NODE_ELEMENT.

To view reference information for Visual Basic, C/C++, or Script only, click the Language Filter button Language Filter in the upper-left corner of the page.

See Also

createNode Method | namespaceURI Property (IXMLDOMNode) | ownerDocument Property | parentNode Property | nodeName Property | nodeType Property | insertBefore Method | replaceChild Method | appendChild Method | IXMLDOMElement

Applies to: DOMDocument

Краткая справка:

Microsoft Excel — Программа для работы с электронными таблицами. Она предоставляет возможности экономико-статистических расчетов, графические инструменты и язык макропрограммирования VBA (Visual Basic for Application).

Visual Basic for Applications (VBA, Visual Basic для приложений) — немного упрощённая реализация языка программирования Visual Basic, встроенная в линейку продуктов Microsoft Office, а также во многие другие программные пакеты.

XML(англ. eXtensible Markup Language — расширяемый язык разметки). XML — язык с простым формальным синтаксисом, удобный для создания и обработки документов программами и одновременно удобный для чтения и создания документов человеком. Разработчик волен создать разметку в соответствии с потребностями к конкретной области, будучи ограниченным лишь синтаксическими правилами языка.

Задача:

Экспортировать данные из таблицы Excel и сформировать XML-файл с заданной структурой для последующей обработки сторонними программными продуктами.

Исходная таблица с некоторыми данными:

Код VBA:

Sub exportXML()

    'Путь для сохранения итогового XML
    xmlFile = ActiveWorkbook.Path & "export.xml"
    
    'Строка и столбец расположения названия компании
    Dim company_row As Integer
    company_row = 1
    Dim company_col As Integer
    company_col = 1
    
    'Номер строки начала таблицы с данными
    Dim data_row As Integer
    data_row = 3
    
    'Номер столбца "Порядковый номер"
    Dim num_col As Integer
    num_col = 1
    
    'Номер столбца "ФИО"
    Dim name_col As Integer
    name_col = 2
    
    'Номер столбца "Профессия"
    Dim profession_col As Integer
    profession_col = 3
    
    'Номер столбца "Наличность"
    Dim profit_col As Integer
    profit_col = 4


    'Cоздание объекта XML
    Set xml = CreateObject("MSXML2.DOMDocument")
    'Добавление описания XML
    xml.appendChild xml.createProcessingInstruction("xml", "version='1.0' encoding='utf-8'")
    
    'Добавление корневого элемента "company"
    Set Company = xml.createElement("company")
    'Добавление атрибута "name"
    Company.setAttribute "name", Cells(company_row, company_col)
    xml.appendChild (Company)
    
    'Цикл по строкам (пока не встретится строка с пустым "Порядковым номером")
    Do While Not IsEmpty(Cells(data_row, num_col))
       'Вызов функции добавления сотрудника компании
        Company.appendChild (createPerson(xml, Cells(data_row, num_col), _
                               Cells(data_row, name_col), _
                               Cells(data_row, profession_col), _
                               Cells(data_row, profit_col)))
        'Переход к следующей строке таблицы
        data_row = data_row + 1
    Loop
        
    'Выполнение XSL-преобразования для добавления отступов в XML
    Call transformXML(xml)
    
    'Сохранение файла (без выбора пути сохранения, удобно при отладке)
    'xml.Save xmlFile
    'MsgBox "Export complete!"

    'Сохранение файла (с выбором пути сохранения)
    xml.Save Application.GetSaveAsFilename("", "Файл экспорта (*.xml),", , "Введите имя файла", "Сохранить")

End Sub


'Функция добавления сотрудника компании(xml, "Порядковый номер", "ФИО", "Профессия", "Наличность") возвращает узел XML
Function createPerson(ByRef xml As Variant, ByVal num As Variant, ByVal name As Variant, _
                      ByVal profession As Variant, ByVal profit As Variant) As Variant

    'Создание элемента person
    Set createPerson = xml.createElement("person")
    createPerson.setAttribute "num", num
    
    'Добавление в виде комментария "Профессия" (просто для примера)
    createPerson.appendChild (xml.createComment(profession))

    'Создание элементов для столбцов "ФИО" и "Наличность"
    createPerson.appendChild(xml.createElement("name")).Text = name
    createPerson.appendChild(xml.createElement("profit")).Text = profit
    
End Function


'Процедура для придания XML читабельного вида (с отступами)
Sub transformXML(ByRef xml As Variant)

    'Cоздание объекта XSL
    Set xsl = CreateObject("MSXML2.DOMDocument")
    
    'Загрузка XSL из строки (не требует наличия отдельного XSL-файла)
    xsl.LoadXML ("<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>" & vbCrLf & _
    "<xsl:output method='xml' version='1.0' encoding='UTF-8' indent='yes'/>" & vbCrLf & _
    "<xsl:template match='@*|node()'>" & vbCrLf & _
    "<xsl:copy>" & vbCrLf & _
    "<xsl:apply-templates select='@*|node()' />" & vbCrLf & _
    "</xsl:copy>" & vbCrLf & _
    "</xsl:template>" & vbCrLf & _
    "</xsl:stylesheet>")
    
    'Выполнение преобразования
    xml.transformNodeToObject xsl, xml

End Sub

Результат в виде XML:

<?xml version="1.0" encoding="UTF-8"?>

<company name="ООО 'Рога и копыта'">
	<person num="1">
		<!--Великий комбинатор-->
		<name>Остап Ибрагимович Бендер</name>
		<profit>225000</profit>
	</person>
	<person num="2">
		<!--Нарушитель конвенции-->
		<name>Михаил Самуэлевич Паниковский</name>
		<profit>30000</profit>
	</person>
	<person num="3">
		<!--Водитель автомобиля «Антилопа-Гну»-->
		<name>Адам Казимирович Козлевич</name>
		<profit>95000</profit>
	</person>
	<person num="4">
		<!--Подпольный миллионер-->
		<name>Александр Иванович Корейко</name>
		<profit>1000000</profit>
	</person>
	<person num="5">
		<!--Сын лейтенанта Шмидта-->
		<name>Шура Балаганов</name>
		<profit>50000</profit>
	</person>
</company>

30.07.2015/



https://skynet48.ru/wp-content/uploads/2015/08/Advanced-Excel-VBA-Macros.png
283
343

admin

https://skynet48.ru/wp-content/uploads/2017/04/logo_skynet.png

admin2015-07-30 16:43:312018-06-20 11:41:49Экспорт из Excel в XML с помощью макроса на VBA

XML files are one of the most common type of data files apart from text and CSV (comma-separated values) files. Reading data files which are not hierarchical (as XML files or JSON) is relatively easy. You can read in the data row by row and process columns separately. With XML (and JSON) the task is not as easy as the data is hierarchical (parent-child relationships exist between records in the schema) and the number of underlying nodes may vary as opposed to tabular data which usually has a constant number of columns separated with a specific delimiter.

Fortunately, we can use the MSXML2.DOMDocument object in VBA. Let’s however, as always, start with a short introduction as to how XML files a structure before we dive into the examples.

Loading XML document in VBA

The MSXML2.DOMDocument object allows you to easily traverse through an XML structure an extract any XML node and/or attribute needed. Let’s look at the example below.

Below we start by loading the XML document. Notice that I am selecting the load to be performed synchronously and not validation be carried out on parsing the document. Feel free to change these options if needed.

Sub TestXML()
    Dim XDoc As Object, root as Object
    
    Set XDoc = CreateObject("MSXML2.DOMDocument")
    XDoc.async = False: XDoc.validateOnParse = False
    XDoc.Load (ThisWorkbook.Path & "test.xml")
    Set root = XDoc.DocumentElement
    '... 
End Sub

Alternatively load an XML from a string:

Sub TestXML()
    Dim XDoc As Object, root as Object
    
    Set XDoc = CreateObject("MSXML2.DOMDocument")
    XDoc.async = False: XDoc.validateOnParse = False
    XDoc.LoadXML ("<root><child></child></root>")
    Set root = XDoc.DocumentElement
    '... 
End Sub

That’s it. You have loaded the XML document into memory into the DOMDocument object. The document has been parsed and you can easily traverse the enclosed elements. See next section.

XML DOM nodes in VBA

For the below I will use the following examples XML:

<?xml version="1.0" encoding="utf-8"?>
<DistributionLists>
    <List>
        <Name>Recon</Name>
        <TO>John;Bob;Rob;Chris</TO>
        <CC>Jane;Ashley</CC>
        <BCC>Brent</BCC>
    </List>
    <List>
        <Name>Safety Metrics</Name>
        <TO>Tom;Casper</TO>
        <CC>Ashley</CC>
        <BCC>John</BCC>
    </List>
    <List>
        <Name>Performance Report</Name>
        <TO>Huck;Ashley</TO>
        <CC>Tom;Andrew</CC>
        <BCC>John;Seema</BCC>
    </List>
</DistributionLists>

The XML document will provide you with the root of the entire DOM (of type XDoc.DocumentElement). Each DocumentElement (XML DOM node) facilitates the following node references:

Node Reference Type Description
parentNode [XDoc.DocumentElement] The parent node, one node higher in the DOM hierarchy
firstChild [XDoc.DocumentElement] The first child node, first node lower in the DOM hierarchy
lastChild [XDoc.DocumentElement] The last child node, last node lower in the DOM hierarchy
childNodes [Array of type XDoc.DocumentElement] All child nodes of the current node, all nodes lower in the DOM hierarchy
nextSibling [XDoc.DocumentElement] Next sibling node i.e. node on the same level in the DOM hierarchy, having the same parent node
previousSibling [XDoc.DocumentElement] Previous sibling node i.e. node on the same level in the DOM hierarchy, having the same parent node

All the above references allow you to free move within the XML DOM.

ChildNodes

Let’s start by extracting the first list and printing it’s XML and text contents. The basics to moving around the XML DOM is using ChildNodes.

Sub TestXML()
    Dim XDoc As Object
    
    Set XDoc = CreateObject("MSXML2.DOMDocument")
    XDoc.async = False: XDoc.validateOnParse = False
    XDoc.Load (ThisWorkbook.Path & "test.xml")
    
    'Get Document Elements
    Set lists = XDoc.DocumentElement
    
    'Get first child ( same as ChildNodes(0) )
    Set getFirstChild = lists.FirstChild
    'Print first child XML
    Debug.Print getFirstChild.XML
    'Print first child Text
    Debug.Print getFirstChild.Text

    Set XDoc = Nothing
End Sub

This is the result

'Print first child XML
<List>
    <Name>Recon</Name>
    <TO>John;Bob;Rob;Chris</TO>
    <CC>Jane;Ashley</CC>
    <BCC>Brent</BCC>
</List>
'Print first child Text
Recon John;Bob;Rob;Chris Jane;Ashley Brent

Traversing through the whole XML in VBA

Now that we got the basics let’s print out the whole contents of the XML DOM including the basenames (node names).

Sub TestXML()
    Dim XDoc As Object
    
    Set XDoc = CreateObject("MSXML2.DOMDocument")
    XDoc.async = False: XDoc.validateOnParse = False
    XDoc.Load (ThisWorkbook.Path & "test.xml")
    
    'Get Document Elements
    Set lists = XDoc.DocumentElement
    
    'Traverse all elements 2 branches deep
    For Each listNode In lists.ChildNodes
        Debug.Print "---Email---"
        For Each fieldNode In listNode.ChildNodes
            Debug.Print "[" & fieldNode.BaseName & "] = [" & fieldNode.Text & "]"
        Next fieldNode
    Next listNode
    
    Set XDoc = Nothing
End Sub

This is the result:

---Email---
[Name] = [Recon]
[TO] = [John;Bob;Rob;Chris]
[CC] = [Jane;Ashley]
[BCC] = [Brent]
---Email---
[Name] = [Safety Metrics]
[TO] = [Tom;Casper]
[CC] = [Ashley]
[BCC] = [John]
---Email---
[Name] = [Performance Report]
[TO] = [Huck;Ashley]
[CC] = [Tom;Andrew]
[BCC] = [John;Seema]

Easy right? Using the basics above we can easily move around the document. But this still seems like a lot of coding right? Well there is an easier way of moving / extracting items using the DOMDocument object – called XPath.

XML Document example node references

Now that we have a hang of our XML document, based on the example XML I provided above I mapped a reference to how to obtain various elements of our XML file by using node references:

  • DistributionLists [FirstChild]
    • List [ChildNodes(0)]
      • Name: Recon [ChildNodes(0).ChildNodes(0).innerText]
      • TO: John;Bob;Rob;Chris [ChildNodes(0).ChildNodes(1).innerText]
      • CC: Jane;Ashley
      • BCC: Brent
    • (…)

    • List [ChildNodes(1)]
      • Name: Performance Report [ChildNodes(1).ChildNodes(0).innerText]
      • TO: Huck;Ashley
      • CC: Tom;Andrew
      • BCC: John;Seema

XPath in VBA

Instead of traversing the elements/nodes in your XML using the .ChildNodes/.FirstChild/NextChild properties we can also use XPath. XPath is a query language used for selecting XML nodes in an XML document. It is represented by a single string. It allows you to extract any number of nodes (0 or more) which match the specified XPath query.

If you want to learn XPath I can recommend this overview:
https://www.w3schools.com/xml/xpath_syntax.asp

Now let’s jump into an example:

Example 1: Extract all Lists

Sub TestXML()
    Dim XDoc As Object
    
    Set XDoc = CreateObject("MSXML2.DOMDocument")
    XDoc.async = False: XDoc.validateOnParse = False
    XDoc.Load (ThisWorkbook.Path & "test.xml")
    
    Set lists = XDoc.SelectNodes("//DistributionLists/List")

    Set XDoc = Nothing
End Sub

Example 2: Extracting all TO fields

Set toFields = XDoc.SelectNodes("//DistributionLists/List/TO")
End Sub

Example 3: Extracting the first and last Name field

Set firstNameField = XDoc.SelectNodes("//DistributionLists/List[0]/Name")

Set lastNameField = XDoc.SelectNodes("//DistributionLists/List[2]/Name")

Example 3: Extracting all child List nodes (Name, TO, CC, BCC)

Set listChildrenField = XDoc.SelectNodes("//DistributionLists/List/*")

XML Attributes in VBA

Let’s tackle one last example – attributes. Let’s slightly modify the XML above and include an example attribute named attribute.

<?xml version="1.0" encoding="utf-8"?>
<DistributionLists>
    <List>
        <Name attribute="some">Recon</Name>

Using XPath (or traversing the DOM) we can easily extract the attribute as shown below.

Set firstNameField = XDoc.SelectNodes("//DistributionLists/List[0]/Name")
Debug.Print firstNameField(0).Attributes(0).Text
'Result: "some"

Creating XML documents

Creating documents is also quite straight forward in VBA.

Dim XDoc As Object, root As Object, elem As Object
Set XDoc = CreateObject("MSXML2.DOMDocument")
Set root = XDoc.createElement("Root")
XDoc.appendChild root
 
'Add child to root
Set elem = XDoc.createElement("Child")
root.appendChild elem
    
'Add Attribute to the child
Dim rel As Object
Set rel = XDoc.createAttribute("Attrib")
rel.NodeValue = "Attrib value"
elem.setAttributeNode rel
    
'Save the XML file
XDoc.Save "C:my_file.xml"

С помощью пользователей данного форума победил задачу по импорту данных из XML в Excel.

Теперь хочется победить и обратную задачу по созданию XML файла из Excel.

Перечитал кучу статей и форумов, найденных с помощью Яндекса, слазил даже к иностранцам. Нашел массу примеров, которые вполне себе работают, но т.к. они сделаны сильно опытными товарищами мне, как человеку, для которого программирование это хобби, они совсем не понятны. Следовательно как-то переделать их под мою задачу пока не получается.

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

К теме приложен примерный файл XML. Он имеет достаточно ветвистую, но в целом понятную (как мне пока кажется), структуру.

Можно как-то совсем по простому (понимаю, что с т.з. опытных программистов это не правильно, но наверняка есть более понятные простым пользователям варианты, чем те, которые находятся в интернете) кодом создавать ветки/подветки и вставлять в них данные из Экселя?

Например, у меня в ячейке А1 стоит «Закрытое акционерное общество «ХХХ»», в ячейке B1 — «1027700000000» и в C1 — «6164070000. Как мне вставить эти данные в XML файл в нужные поля раздела «<Pledgors>»? Ну а дальше я уже сам должен разобраться.

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

Введение в XML DOM

Передача набора записей из VB-приложения в Excel

    Импорт данных

    Ввод данных

    Вопросы перекодировок
данных

Вывод данных о свойствах Word-документа

Создание архива входящей почты

Одна из «горячих» ИТ-тем нынешнего года — проблема интеграции разнородных
информационных ресурсов, решение которой требует создания простого и надежного
механизма обмена данными между различными приложениями. И сегодня, кажется,
все уже знают: XML — тот золотой ключик, который должен открыть дверь в
новый мир, где порядок наконец заменит собой существующий ныне информационный
хаос великого множества форматов данных.

Напомним, что XML и
HTML базируется
на одинаковых синтаксических принципах —
информация записывается в виде простого
текста, в котором имеются управляющие
команды (тэги) и собственно данные. XML
отличается от HTML
тем, что позволяет
передавать не только данные, но также и
информацию об их структуре, то есть HTML
ориентирован на
описание неструктурированных данных, а XML — структурированных.
С точки зрения использования информации
неструктурированные данные предназначены
в первую очередь для визуального
восприятия человеком, струкутрированные —
для автоматической обработки (в том числе
вычислений). Отметим, что оба этих языка
представляют собой упрощенный вариант
давно известного среди компьютерных
лингвистов языка SGML (Standard Generation
Markup Language).

Подчеркнем, что
в принципе
сама идея
языка
XML — текстового
описания
структуры
и содержания
некоторых
данных — совсем
не нова.
Новизна
заключается
лишь в
том, что
лидеры компьютерной
индустрии
вроде бы
осознали
необходимость
перехода
от внутренних,
закрытых,
форматов
к общим,
открытым.
Но, честно
говоря,
о том,
насколько
серьезны
эти намерения
(а не
маркетинговые
акции, предназначенные
для показа
своей готовности
к открытости),
можно будет
судить лишь
спустя некоторое
время.
XML — это
мировой
отраслевой
стандарт,
создание
и развитие
которого
ведется
под эгидой
WWW Consortium, общественной
организации,
представляющей
интересы
входящих
в нее
участников
рынка.

Что касается
прикладных
программистов,
то они
уже очень
давно оценили
преимущества
простых
текстовых
форматов
данных по
сравнению
с двоичными
при информационном
взаимодействии
компонентов
вычислительных
систем.
Могу сослаться
на пример
из собственной
программистской
практики
десятилетней
давности.
При разработке
информационно-аналитических
систем для
обработки
геологических
данных мы
полностью
перешли
на текстовые
форматы
данных и
описаний
их структуры,
резко сократив
время на
отладку
программного
комплекса
и его
конфигурирование
под задачи
пользователей.
Сначала
мы рассматривали
такое решение
как временное
и хотели
для повышения
производительности
перейти
на двоичные
форматы.
Но жизнь
показала,
что это
пустая трата
времени,
так как
производительность
компьютеров
росла быстрее,
чем объем
базы данных.


Здесь следует
сделать
одно важное
замечание.
Текстовое
представление
данных имеет
свои недостатки.
Один из
них — сложности
с использованием
символов,
задействованных
в качестве
специальных
(например,
«<» и
«>»). Вторая
проблема
заключается
в неоднозначности
преобразования
данных из
внутреннего
двоичного
формата
в текст,
и наоборот.
В последнем
случае особое
внимание
нужно уделять
национальной
специфике
форматов,
особенно
при работе
с разными
региональными
установками
и кодовыми
таблицами.

Понятно, что
появление
общего стандарта
описания
данных избавляет
разработчиков
от необходимости
придумывать
собственные
форматы.
Однако за
любую универсальность
приходится
расплачиваться
определенной
избыточностью,
хотя в
данном случае
она будет
не так
велика и
не будет
сколь-нибудь
заметна
на современных
компьютерах.
Например,
мне бы
пришлось
заменить
свои старые
описания
параметров:

 LastName = Колесов

на:

 <LastName>Колесов</LastName>

Прежде чем перейти к конкретным техническим вопросам, стоит сделать еще одно
важное замечание. Сам по себе XML не решает проблемы преобразования XML-документов,
что необходимо для передачи данных между приложениями. Проще говоря, XML лишь
связывает, например, некоторый набор чисел с понятием (тэгом) «цена», но что
именно означает данный термин, язык уже не может расшифровать. Таким образом,
для правильной интерпретации содержимого XML-документов необходимо знать так
называемую XML-схему, которая бы описывала смысл полей данных.

Введение в XML DOM

Visual Basic 6.0 и
приложения MS Office 2000 не
включают в себя поддержку XML на
уровне пользователя и разработчика, хотя
при этом многие приложения Office используют
передачу данных с помощью XML для
выполнения внутренних операций. Вместе с
тем уже сегодня, не дожидаясь новых версий
этих систем (где что-то, связанное с XML,
должно вскоре
появиться), программисты могут применять XML-формат
для обмена информацией с помощью написания
собственных достаточно простых
программных конструкций. Видятся два пути
реализации этой задачи:

  1. Использование специального объекта XML, называемого XMLDOM, или DOMDocument
    (DOM, Document Object Model). Работа с этим объектом выполняется с помощью
    библиотеки Microsoft XML 2.0 (MSXML.DLL), на которую нужно сделать ссылку
    в окне Reference. (Обратите внимание: на моем компьютере в списке ссылок эта
    библиотека в начальный момент имеет индекс 1.0, а уже после ее подключения
    меняет его на 2.0.)

    С точки зрения программиста в применении DOMDocument можно выделить три
    момента:

    • формирование структуры и содержания документа, а также выборка из него
      необходимой информации;
    • преобразование объекта из внутреннего формата во внешний текстовый
      XML-файл (в том числе вставка объекта в уже существующий файл), и наоборот;
    • возможность передачи объекта внутри приложения, а также обеспечение
      доступа к нему из других приложений с помощью ActiveX.
  2. На практике наиболее распространенной задачей является экспорт-импорт с
    помощью XML-файла, что можно делать с помощью обычных средств VB/VBA. Вывод
    данных в формате XML является вообще достаточно тривиальной задаче. С вводом
    дело обстоит посложнее, так как в этом случае нужно «вручную» писать код для
    анализа синтаксиса и для разборки элементов документа. Как бы то ни было,
    в любом случае программист должен иметь в виду «ручной» метод экспорта-импорта,
    который иногда может быть очень полезен.
В начало

В начало

Передача набора записей из VB-приложения в Excel

В наших «Советах для тех, кто программирует на VB» мы приводили два примера
импорта данных из таблицы (набора записей, Recordset) в виде просто текстового
файла (совет 297) и HTM-файла (совет 329). Попробуем выполнить аналогичную задачу
с помощью XML-файла, который потом прочитаем в Excel.

В начало

В начало

Импорт данных

Для тестирования мы сделаем базу данных с
таблицей такого содержания:

FirstName

LastName

BirthDate

Height

Sergey

Sokolov

03.11.52

1,82

Андрей

Petrov

17.08.58

1,77

Света

Суслова

23.09.67

1,65

Далее напишем код, который обращается для импорта данных к процедуре ExportXML
(листинг 1):

Dim strConnectString$, strSQL$, strHeading$
      Dim cnn As ADODB.Connection
      Dim rs As Recordset 
strConnectString = "Provider=Microsoft.Jet.OLEDB.3.51;" & _       "Persist Security Info=False;" & _       "Data Source=C:vb-dbxmltest.mdb" strSQL = "Select FirstName +' ' + LastName as Name, " & _       "BirthDate, Height as Рост" & _       " from Employees Order by LastName, FirstName" strHeading = "Список сотрудников"
Set cnn = New ADODB.Connection    Set rs = New ADODB.Recordset    cnn.Open strConnectString$ ' устанавливаем связь    Set rs = cnn.Execute(strSQL) ' создаем Recordset
   Call ExportXML(rs, strHeading$, "d:file1.xml")

В результате его выполнения получим XML-файла, содержимое которого лучше всего
посмотреть в Internet Explorer (рис.1). Для понимания
выполненных нами действий нужно отметить следующие моменты:

  • в IE 5.0 мы видим почти точное содержимое XML-файла (в отличие от HTML,
    когда браузер выдает документ в отформатированном виде). В содержительном
    плане мы увидели бы то же самое с помощью Notepad, но с некоторыми отличиями
    по форме. В частности, физически файл, сформированный при сохранении документа
    с помощью объекта DOMDocument, представляет одну тестовую строку с
    переводом строки (vbCrLf) в конце. Internet Explorer представил ее в виде
    структурированного иерархического дерева, которое можно просматривать, открывая
    и закрывая его узлы;
  • мы специально использовали в исходных данных русские тексты, чтобы показать,
    что их можно использовать для передачи как названий полей (тэгов), так и их
    содержимого. По умолчанию в XML-файл русский текст записывается в двухбайтовой
    кодировке UTF-8 (это можно увидеть в редакторе Notepad), но при использовании
    параметра encoding можно применять и другие кодировки;
  • имена элементов (тэгов) не могут включать пробелы. Поэтому мы с помощью
    оператора Replace автоматически меняем возможные пробелы на символ подчеркивания.

Создание нового объекта DOMDocument
начинается со
строки кода:

Dim xmlDoc As DOMDocument
Set xmlDoc = New DOMDocument
StartString$ = "<?xml version='1.0'?>" ' начальная строка 
                                                             ' (может отсутствовать)
MainNode$ = "<Главный_узел_объекта/>"   главный узел объекта
xmlDoc.loadXML StartString$ + MainNode$

Для выбора кодировки передаваемых данных
нужно сформировать начальную строку
следующего вида:

StartString$ = "<?xml version='1.0' encoding='Windows-1251'?>"

Однако мне этого не удалось сделать — выдавалось сообщение о невозможности
создания объекта.

В начало

В начало

Ввод данных

Для ввода сформированного XML-файла в Excel используем функцию ImportXML (листинг
2).

Эта функция создает объект DOMDocument, который
можно затем дополнительно обрабатывать, и
записывает введенные значения в рабочую
таблицу. Ввод данных можно сделать с
помощью такой макрокоманды:

 Sub MyMacro()
    Set mXML = ImportXML("D:file1.xml")
End Sub

В результате ее выполнения мы получим заполненную таблицу рабочей книги (рис.
2).

Теперь внимательно рассмотрим, как производится ввод данных из созданного нами
XML-файла. Обращение к функции ImportXML (Excel) в общем случае выглядит следующим
образом:

    Set mXML = ImportXML(xmlFile$, ObjectPath$, PropertyPath$)

Если мы используем установку ObjectPath
= «*» (по
умолчанию), то работа ведется во всеми
объектами документа. В нашем случае это
будут узлы с тэгами <OneRowI> (они
могут иметь произвольные имена, в том числе
одинаковые, например <OneRow>), а
включенные в них тэги — свойствами. При
формировании таблицы в Excel для
определения имен колонок мы анализировали
содержимое только первого узла, считая все
узлы однородными.

Однако если мы укажем ObjectPath = «<//OneRow2>», то выборка
будет сделана только для данного узла. Точно так же можно управлять выборкой
отдельных полей, например указав PropertyPath = «BirthDate».

В начало

В начало

Вопросы перекодировок данных

Анализируя выполненные нами операции по передаче данных, в первую очередь
следует обратить внимание на то, что все данные (содержимое полей набора записей)
передаются в виде текста. Преобразование информации в нашем случае выполнялось
средствами VB, и поэтому был автоматически выбран формат в соответствии с текущими
региональными установками. Принимающее приложение (Excel) также получило обычные
текстовые данные, которые в принципе могут быть интерпретированы самым произвольным
образом. Имейте в виду, что ячейки таблицы (рис. 2) заполнены
обычным текстом в неопределенном формате (внешний признак этого — выравнивание
по левому краю).

Подобная ситуация чревата ошибками при
передаче XML-данных
между компьютерами, имеющими разные
региональные установки (для Америки
значение «23.09.53» является недопустимой
датой, а «1,23» — недопустимым числом). Для
решения этой проблемы есть несколько путей.
Во-первых, можно применять
пользовательские атрибуты, которые будет
понимать как передатчик, так и приемник
информации. Во-вторых, можно присвоить
каждому свойству узла «жесткий» тип данных,
и тогда будет использоваться
соответствующий фиксированный формат.

Для реализации первого способа немного
модифицируем код функции RecordsetToXMLDOM:

 For Each fldField In rs.Fields   ' запись полей записи
   ' создание нового элемента
   Set xmlField = xmlFields.appendChild( _
      xmlDoc.createElement(Replace(fldField.Name, " ", "_")))
   ' установка атрибута "MyType"
   Set attr = xmlDoc.createAttribute("MyType")
   attr.Value = fldField.Type
   xmlField.Attributes.setNamedItem attr
   
   xmlField.Text = fldField.Value   ' запись содержимого
Next

В результате этого в сформированном коде
в тэги с наименованием полей добавятся
атрибуты с

кодами типов данных (рис. 3). Соответственно
при вводе данных их значения можно прочитать и сделать соответствующую установку
форматов ячеек:

DateType = propertyNode.Attributes(0).nodeValue

Для второго варианта нужно использовать
фиксированный, закрепленный за типом
данных формат. Например, для переменных
типа «дата» установку такого атрибута
можно выполнить так:

 Set attr = xmlDoc.createAttribute("dt:dt")
attr.Value = "date"
xmlField.Attributes.setNamedItem attr

или воспользоваться свойством dataType:

xmlField.dataType = "date"

В этом случае записываемые данные должны
иметь обязательный формат даты «ГГГГ-ММ-ДД»:

xmlField.Text = "2000-12-02"

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

В начало

В начало

Вывод данных о свойствах Word-документа

Теперь попробуем решить такую задачу: будем формировать протокол работы с
документами Word 2000, записывая информацию о встроенных свойствах при завершении
работы с документом. Для начала напишем функцию DocPropertiesToXML, формирующую
DOMDocument-объект для одного документа Word (листинг 3).

Поместим эту функцию в модуль в составе
глобального шаблона Normal.dot (нужно
также для шаблона указать ссылку на MSXML.DLL).
Далее создадим
макрокоманду, которая будет формировать XML-файл
для одного документа:

Public Sub OneDocPropertyToXML()
   Dim xmlDoc As DOMDocument    Set xmlDoc = DocPropertiesToXML(ThisDocument)     'можно создавать файл с оригинальным именем    xmlDoc.Save "d:Myfile.xml" End Sub

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

Содержимое полученного файла можно
прочитать созданной ранее процедурой ImportXML
в Excel, но
для этого обращение к ней должно выглядеть
следующим образом (главный узел следует
указать в качестве объекта):

Set mXML = ImportXML("D:myfile.xml", "//DocProperties")

Напишем процедуру DocPropertyToLogXML, которая будет создавать файл протокола
(листинг 4).

Обратите внимание на операции включения
созданного для конкретного документа XML-объекта
в объекта Log-файла.
Теперь создадим макрокоманду, которая
будет добавлять информацию об активном
документе в протокол:

Call DocPropertyToLogXML(ThisDocument)

В результате вы будет автоматически формировать XML-файл, структура которого
приведена на рис. 5). Его также можно прочитать
в Excel:

Set mXML = ImportXML("D:logfile.xml")

Примечание. Обращение на запись информации в Log-файл можно поместить
в процедуру ThisDocument_Close каждого документа. Механизм программного формирования
такого кода в каждом открываемом файле описан в статье Владимира Биллига «Документы
Office 2000 и их проекты» (http://www.microsoft.ru/offext/officedev/).

В начало

В начало

Создание архива входящей почты

Приведем еще один пример использования XML-файла — на этот раз для хранения архива
поступающей электронной почты. Для этого
нужно сначала сформировать две событийные
процедуры:

 Dim mailBagFileName As String
Dim AttachmentsDirectory As String
Private Sub Application_Startup()     ' Инициализация при запуске прилежения       ' файл с архивом входящей почты       mailBagFileName = "d:/xmlPro/mailBag.xml"       ' каталог для хранения присоединенных файлов       AttachmentsDirectory = "d:/xmlPro/" End Sub
Private Sub Application_NewMail()     ' При поступлении нового письма производится запись его в архив       Dim mailItems As Items       Dim mailmsg As MailItem             ' Папка с входящими письмами       Set mailItems = Application.Session.GetDefaultFolder( _          olFolderInbox).Items       Set mailmsg = mailItems.GetLast ' выбираем последнее       ' Запись поступившего письма в XML-объект       Set xmlMail = MessageToXML(mailmsg, AttachmentsDirectory)     ' запись в архив       Call AddMessageToArchive(xmlMail, mailBagFileName) End Sub

Ключевым процедурами в этой задаче являются процедуры MessageToXML и AddMessageToArchive
(листинг 5).

Общая логика формирования архива очень похожа на то, что мы делали, создавая
протокол работы с Word-файлами: сначала преобразуем содержимое письма в DOMDocunemt,
а потом подключим его к единому файлу. Новшеством здесь является то, что документ
письма имеет более сложную структуру (появились вложенные узлы для описания
подключенных файлов), и для хранения тела письма мы используем секцию CDATA
(содержимое письма может иметь символы, нарушающие синтаксис XML). Результат
преобразования в XML показан на рис. 6.

Чтобы закончить с этой задачей, остается только написать ASP-cтраницу (листинг
6) которая преобразует содержимое XML-архива писем в HTML-формат (рис.
7).

КомпьютерПресс 12’2000

  • Remove From My Forums
  • Question

  • Hi guys,

    I made a userform that allows the person to enter entries in the excel spreadsheet.  Everytime that the person clicks on «Submit» button, the entry is added on a new row in the excel spread sheet.  That works perfectly fine.  Now, I would
    like to also have a XML file in C: to record whatever the person enters in the userform.  I know how to do it in C#, but not VBA.  My workplace has access to Excell VBA only.

    This is my macro for the Excel userform:

    Private Sub SubmitCmd_Click()
    ‘this is to make sure that all fields are selected

        
        ‘this is for the submit button, when click, data are put on the excel sheet, may have to play with the A4 and the rows (1,0)
        ‘This button is to add multiple entries.
        ActiveWorkbook.Sheets(«Ticket Tracker»).Activate
        Range(«F1»).Select
        Do

        ActiveCell.Offset(0, 0) = Date  ‘this should be the first node
        ActiveCell.Offset(0, 1) = Time  ‘this is the time node
        ActiveCell.Offset(0, 2) = Environ(«USERNAME») ‘this is the person who enters the entry
        ActiveCell.Offset(0, 3) = Textbox1 ‘this is the commend fields’
        ActiveCell.Offset(0, 4) = Textbox2 ‘this is the action taken

        Call UserForm_Initialize

    End Sub

    So basically everything is working fine to put the entries on the excel spreadsheet.  I want the submit button to also add an entry in the XML file located in C: drive (for example: C:record.xml).

    The node is like this :

    <Entry>
       <Date></Date>
       <Time></Time>
       <Name></Name>
       <Comments></Comments>
       <Action></Action>
    </Entry>

    Anyone knows a solution for this?

    thank you.

Answers

  • >>>where would i put that code?

    The VBA Code goes into SubmitCmd_Click()

    >>> I want whatever entry that I put on the xls (excel file) to be also recorded on the XML.

    The code that I have given you is a sample on how to create an XML file from VBA. If you want an exact copy of the Excel File as an XML file then you can always save the Excel file as an XML spreadsheet once you finish updating the Excel document.

    For example

        ActiveWorkbook.SaveAs Filename:="C:Book1.xml", FileFormat:=xlXMLSpreadsheet, _
        ReadOnlyRecommended:=False, CreateBackup:= False
    

    >>>does your code assumes that ive already imported the XML file?

    No. Like I mentioned above, it will create a fresh XML document with the values that you specify in the SubmitCmd_Click()


    Sid (A good exercise for the Heart is to bend down and help another up) Please do not email me your questions. I do not answer questions by email unless I get paid for it :) If you want, create a thread in VB.Net/Excel forum and email me the link and I
    will help you if I can.

    • Marked as answer by

      Thursday, February 2, 2012 5:25 PM

Понравилась статья? Поделить с друзьями:
  • Vba excel trim описание
  • Vba excel xlup что такое
  • Vba excel variable not defined
  • Vba excel treeview control
  • Vba excel value2 описание