2014-02-05 3 views
3

Я хочу загрузить курсы обмена с этого сайта на еженедельной основе с помощью VBA Я очень новичок в XML и оглядывался вокруг обмена стеками и видел несколько реализаций, которые используют форма (я хочу, чтобы избежать этого метода)Использование VBA для импорта XML-сайта в Access

Я пытался импортировать его с помощью мастера MS Access, но все поля в таблицах, являются пустыми

Я хотел бы осуществить эти действия, если возможные

  1. Загрузить XML с веб-страницы http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml
  2. шлейфом через XML и поместить валюту и курс обмена в любой новой или существующей таблице

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

Sub Test() 

'********************************************************** 
' DOWNLOAD XML DATA 
' ref: http://stackoverflow.com/questions/7091162/access-vba-how-to-download-xml-file- and-enter-its-data-into-a-recordset 
'********************************************************** 

Dim obj As MSXML2.ServerXMLHTTP 
Set obj = New MSXML2.ServerXMLHTTP 

obj.Open "GET", "http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml", False 
'in case you are sending a form *POST* or XML data to a SOAP server set content type 
obj.setRequestHeader "Content-Type", "text/xml" 
obj.send 

Dim status As Integer 
status = obj.status 

If status >= 400 And status <= 599 Then 
    Debug.Print "Error Occurred : " & obj.status & " - " & obj.statusText 
End If 

    '********************************************************** 
    'CREATE XML DOM DOCUMENT 
    '********************************************************** 

Dim xmlDoc As MSXML2.DOMDocument 
Dim xmlElement As MSXML2.IXMLDOMElement 
Dim xmlNode As MSXML2.IXMLDOMElement 
Set xmlDoc = New MSXML2.DOMDocument 
xmlDoc.loadXML (obj.responseText) 

    '********************************************************** 
    'ACCESS ROWS 
    'http://stackoverflow.com/questions/11305/how-to-parse-xml-in-vba 
    '********************************************************** 

Dim point As IXMLDOMNode 
Set point = xmlDoc.firstChild 

Debug.Print point.selectSingleNode("subject").Text 

End Sub 
+1

Вы можете упростить начало этой задачи, загрузив «DOMDocument» непосредственно из URL вместо того, чтобы сначала извлекать XML-данные, а затем загружать этот XML-документ в документ. Сделайте это: 'xmlDoc.async = False' И затем это:' xmlDoc.Load "http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml" ' – HansUp

+0

Спасибо HansUp, это действительно далеко лучше. У вас есть идея, как извлечь элементы из XMLDOC? –

ответ

3

Использование XPath для выбора элементов, которые вы хотите, а затем getAttribute в извлеките значения для атрибутов currency и rate из каждого выбранного элемента.

Const cstrXPath As String = "/gesmes:Envelope/Cube/Cube/Cube" 
Dim xmlDoc As MSXML2.DOMDocument 
Dim xmlElement As MSXML2.IXMLDOMElement 
Dim xmlSelection As MSXML2.IXMLDOMSelection 
Dim i As Long 
Dim strUrl As String 

strUrl = "http://www.ecb.europa.eu/stats/" & _ 
    "eurofxref/eurofxref-daily.xml" 

Set xmlDoc = New MSXML2.DOMDocument 
xmlDoc.async = False 
xmlDoc.Load strUrl 

Set xmlSelection = xmlDoc.SelectNodes(cstrXPath) 
Debug.Print "xmlSelection.Length: " & xmlSelection.Length 
i = 1 
For Each xmlElement In xmlSelection 
    Debug.Print i, xmlElement.getAttribute("currency"), _ 
     xmlElement.getAttribute("rate") 
    i = i + 1 
Next xmlElement 

Вы можете просмотреть вывод в окне Immediate; вы можете использовать Ctrl + g, чтобы туда попасть. Вот сокращенный пример вывода ...

xmlSelection.Length: 32 
1   USD   1.3495 
2   JPY   136.93 
3   BGN   1.9558 

В конечном итоге вы хотите сохранить эти ценности, а не только Debug.Print их. Когда вы доберетесь до этого момента, обратите внимание, что getAttribute возвращает текстовые значения. Если вы будете хранить rate в числовом поле, например. Single, вы можете преобразовать текстовое значение в число при его сохранении.

CSng(xmlElement.getAttribute("rate")) 
+0

Большое спасибо Hansup, Это именно то, что я искал. Хороших выходных –

Смежные вопросы