Muchas veces nos resultará más fácil y práctico extender la funcionalidad de las aplicaciones Office a través de la utilización de Web Services, en lugar de crear una aplicación Windows desde cero, por lo tanto lo que hoy les enseñaré será la forma de cómo podemos conectarnos al Web Services mediante Visual Basic para Aplicaciones (VBA) desde las aplicaciones de Microsoft Office 2003. Hoy será utilizando Microsoft Office Word 2003 y en la siguiente publicación lo haremos con Microsoft Office Excel 2003.
Vamos a conectarnos nuevamente al Web Services de Indicadores Financieros de DesaChile.com.
Lo primero que necesitaremos será descargar el Microsoft Office 2003 Web Services Toolkit 2.01 desde el sitio de Microsoft en esta dirección (yo descargue la versión en español) http://www.microsoft.com/downloads/details.aspx?displaylang=es&FamilyID=fa36018a-e1cf-48a3-9b35-169d819ecf18
Luego de instalar el Toolkit, abre Microsoft Word y dirígete a “Herramientas/Macro/Macros…”
Ingresa un nombre para la macro. En mi caso he colocado “macroIndicadores”. Hacer clic en “Crear”.
Una vez abierto el edito de Microsoft Visual Basic, ir al menú “Herramientas/Web Services Referentes…”.
Seleccionar la opción “Dirección URL del servicio Web” e ingresar la URL de Web Services, que en nuestro caso será http://www.desachile.com/webservice.asmx , luego presionar “Buscar” y seleccionar el servicio que se muestra y presionar “Agregar”.
“Microsoft Office 2003 Web Services Toolkit” nos ha creado una clase Proxy llamada “clsws_Servicios” para el Web Services y además nos agrego un código de ejemplo que se encuentra comentariado al inicio de la clase.
Este es el código que nos agrego en un módulo de clase llamado “clsws_Servicios”
Private sc_Servicios As SoapClient30
Private Const c_WSDL_URL As String = "http://www.desachile.com/webservice.asmx?wsdl"
Private Const c_SERVICE As String = "Servicios"
Private Const c_PORT As String = "ServiciosSoap"
Private Const c_SERVICE_NAMESPACE As String = "DESACHILE"
Private Sub Class_Initialize()
'*****************************************************************
'Se llamará a esta subrutina cada vez que se creen instancias de la clase.
'Crea sc_ComplexTypes como SoapClient30 nuevo y, a continuación,
'inicializa sc_ComplexTypes.mssoapinit2 con el archivo WSDL encontrado en
'http://www.desachile.com/webservice.asmx?wsdl.
'*****************************************************************
Dim str_WSML As String
str_WSML = ""
Set sc_Servicios = New SoapClient30
sc_Servicios.MSSoapInit2 c_WSDL_URL, str_WSML, c_SERVICE, c_PORT, c_SERVICE_NAMESPACE
'Utilice el servidor proxy definido en la configuración LAN de Internet Explorer
'estableciendo ProxyServer en <CURRENT_USER>
sc_Servicios.ConnectorProperty("ProxyServer") = "<CURRENT_USER>"
'Detectar automáticamente la configuración proxy si la aplicación Internet Explorer está definida para realizar esta función
'estableciendo EnableAutoProxy en True
sc_Servicios.ConnectorProperty("EnableAutoProxy") = True
End Sub
Private Sub Class_Terminate()
'*****************************************************************
'Se llamará a esta subrutina cada vez que se destruya la clase.
'Establece sc_ComplexTypes a Nothing.
'*****************************************************************
'Intercepción de errores
On Error GoTo Class_TerminateTrap
Set sc_Servicios = Nothing
Exit Sub
Class_TerminateTrap:
ServiciosErrorHandler ("Class_Terminate")
End Sub
Private Sub ServiciosErrorHandler(str_Function As String)
'*****************************************************************
'Esta subrutina es el controlador de errores de clase. Se puede llamar desde cualquier subrutina o función de clases
'cuando dicha subrutina o función encuentra un error. A continuación, generará el error junto con el
'nombre de la subrutina o función que realiza la llamada.
'*****************************************************************
'Error SOAP
If sc_Servicios.FaultCode <> "" Then
Err.Raise vbObjectError, str_Function, sc_Servicios.FaultString
'Error no SOAP
Else
Err.Raise Err.Number, str_Function, Err.Description
End If
End Sub
Public Function wsm_Indicadores(ByVal str_day As String, ByVal str_month As String, ByVal str_year As String) As MSXML2.IXMLDOMNodeList
'*****************************************************************
'Se creó la función proxy desde http://www.desachile.com/webservice.asmx?wsdl.
'
'"wsm_Indicadores" está definido como XML. Consulte el tema Tipos complejos: Variables XML en
'la Ayuda de Web Services Toolkit de Microsoft Office 2003 para obtener detalles acerca de la implementación de variables XML.
'*****************************************************************
'Intercepción de errores
On Error GoTo wsm_IndicadoresTrap
Set wsm_Indicadores = sc_Servicios.indicadores(str_day, str_month, str_year)
Exit Function
wsm_IndicadoresTrap:
ServiciosErrorHandler "wsm_Indicadores"
End Function
Ahora nos vamos a nuestra macro creada anteriormente (macroIndicadores) y escribimos el siguiente código:
Option Explicit
Sub macroIndicadores()
'
' macroIndicadores Macro
' Macro creada el 21/01/2009 por Toby
'
Dim indica As New clsws_Servicios
Dim oFullNodeList As MSXML2.IXMLDOMNodeList
Dim oFilteredNodeList As MSXML2.IXMLDOMNodeList
Dim oNode As MSXML2.IXMLDOMNode
Dim xdd As MSXML2.DOMDocument30
Dim xdlRows As MSXML2.IXMLDOMNodeList
Dim iRow As Integer
Dim valor As String
Dim lcntRows As Integer
Dim uf As String
Dim usd As String
Dim euro As String
Dim utm As String
Set oFullNodeList = indica.wsm_Indicadores("21", "01", "2009")
Set oFilteredNodeList = oFullNodeList.Item(1).SelectNodes("NewDataSet")
Set xdd = New MSXML2.DOMDocument30
With xdd
.async = False
.preserveWhiteSpace = True
.LoadXml oFullNodeList.Item(1).XML
Set xdlRows = xdd.SelectNodes("//indicadores")
End With
lcntRows = xdlRows.Length - 1
For Each oNode In oFilteredNodeList
For iRow = 0 To lcntRows
uf = oNode.ChildNodes.Item(iRow).SelectSingleNode("UF.valor").Text
usd = oNode.ChildNodes.Item(iRow).SelectSingleNode("USD.valor").Text
euro = oNode.ChildNodes.Item(iRow).SelectSingleNode("EURO.valor").Text
utm = oNode.ChildNodes.Item(iRow).SelectSingleNode("UTM.valor").Text
Next
Next
Selection.TypeText Text:="Indicadores Económicos del Día"
Selection.TypeParagraph
Selection.TypeText Text:="Euro = " & euro
Selection.TypeParagraph
Selection.TypeText Text:="Dólar = " & usd
Selection.TypeParagraph
Selection.TypeText Text:="UTM = " & utm
Selection.TypeParagraph
Selection.TypeText Text:="UF = " & uf
End Sub
Luego de ejecutar la macro, el resultado será:
Desde aquí en adelante ustedes pueden hacer lo que quieran con estos valores. Yo me despido hasta la próxima publicación.
Saludos, Toby
No me ha resultado, al poner ejecutar la Macro encuentra un error en tiempo de ejecución.
ResponderEliminarSet oFullNodeList = indica.wsm_Indicadores("21", "01", "2009")
Williams,
ResponderEliminarPrimero prueba apuntando a otro WebServices, ya al parecer desachile ya dejo de ser gratuito y el servicio no esta disponible.
Saludos
Tienes toda la razón, el Servicio ya no esta disponible.
ResponderEliminarEra justo lo que necesitaba un servicio que entregara los indicadores económicos UF y Dolar específicamente.
Me ha costado encontrar WebServices que ofrezcan estos valores crees que me puedas ayudar.
De antemano gracias por la disposición.
Este comentario ha sido eliminado por el autor.
ResponderEliminarWilliams, lamentablemente ese era el unico Web Services que conocia y que además era gratuito. Si llego a encontrar algo lo publicaré.
ResponderEliminarSaludos
Encontré esto, que tal ves a un usuario le sea útil.
ResponderEliminarhttp://averigualo.cl/rss
en mi caso estoy modificando mi programa para que rescate los valores desde el XML.
http://averigualo.cl/feed/indicadores.xml
Saludos.
soy novato en esto... me puedes decir como se contruye la plantilla en word para mostrar los datos d ela web services..gracias
ResponderEliminarNo trabajes en la plantilla de word.
ResponderEliminarHola toby gracias por el articulo nos ayuda mucho, no se si me puedas ayudar, lo que yo necesito es enviar datos a un web services para que me regrese lo que yo necesite.
ResponderEliminarpor ejemplo necesito enviarle Nombre de usuario / contraseña y el numero de articulo, para que el me regrese. al rededor de 10 campos con los datos de ese articulo. ojala me puedas ayudar gracias y saludos