domingo, 21 de junio de 2020

Interactuando con Microsoft Word (II): Enviar datos de Excel a Word (VBA) y darles formato.

Hace varias semanas le comenté sobre cómo comenzar a interactuar entre Excel y Word usando VBA. (Enlace). En aquella ocasión sobre todo nos centramos en enviar tablas hacia Word en diversos formatos. En esta ocasión iremos un poco más allá y enviaremos datos y modificaremos su formato en el archivo de Word creado, entonces ¡Manos a la obra!

Para el ejemplo vamos a usar una cosa muy simple de datos en Excel, así:

Ahora, lo primero, como ya saben, será activar las referencias a “Microsoft Word 16.0 Object Library”, hecho eso corresponde declarar nuestras variables, en donde la primera será la de nuestro objeto Word.

Dim MiappWord As Word.Application

Ahora vamos a crear el objeto Word y un documento nuevo en blanco.

Set MiappWord = CreateObject("Word.Application") 
MiappWord.Documents.Add 
Como ya está creado nuestro objeto y ya tenemos un archivo nuevo en él, así no lo veamos, copiaremos nuestros datos de Excel.
Hoja1.Range("A1:C11").Copy

A partir de aquí empezaremos a usar el objeto Word por lo que usaremos la instrucción With para ahorrarnos algunas líneas de código.

With MiappWord 

Luego pegaremos nuestros datos en Word pero manteniendo el formato de origen.

  .Selection.PasteExcelTable False, False, False

Como es un archivo nuevo, la tabla pegada tendrá el índice 1, por lo que para referirnos a ella usaremos dicho índice como tabla dentro del documento activo (ActiveDocument) de Word y por ende, para seguir facilitándonos escribir un poco menos, usaremos otro With, ya que los formatos a aplicar estarán dentro de celdas de dicha tabla.

With .ActiveDocument.Tables(1)

Como en la tabla tenemos objetos Cell, lo que haremos es cambiar las propiedades respectivas de cada uno de los objetos que requerimos. Voy a dejar las líneas en VBA comentadas para que se sepa qué hace cada una.

         'Fuente de color rojo
         .Cell(2, 3).Range.Font.ColorIndex = wdRed
         'Fondo de color verde obtenido con constante de Word
         .Cell(3, 3).Shading.BackgroundPatternColor = wdColorGreen
         'Fondo de color verde gris obtenido con RGB
         .Cell(4, 3).Shading.BackgroundPatternColor = RGB(184, 183, 153)
         'Fuente en negrita
         .Cell(5, 3).Range.Font.Bold = wdToggle
         'Fuente en cursiva
         .Cell(6, 3).Range.Font.Italic = wdToggle
         'Fondo en rojo para toda una fila
         .Rows(7).Shading.BackgroundPatternColor = wdColorRed
         'Escribir hola en una celda
         .Cell(Row:=8, Column:=3).Range = "Hola"
 End With 

Para seguir aprendiendo sobre este tema, también vamos a ver cómo hacer cambios a varias celdas de la tabla que son contiguas, pero están en distintas filas y columnas.  Lo primero es definir dicho rango de celdas. En este caso iniciaremos en la fila 9, columna 1 y terminaremos en la fila 11, columna 3.

With .ActiveDocument
    Set mirango = .Range(Start:=.Tables(1).Cell(9, 1).Range.Start, End:=.Tables(1).Cell(11, 3).Range.End)
End With 

Para que no se mareen con los With, tranquilos/as, al final veremos todo junto. Volviendo a lo anterior, ya definido el rango, a través de un For-Each vamos a colocar la misma palabra en dichas celdas.

For Each miCelda In mirango.Cells
     miCelda.Range = "Repetir"
Next miCelda  

Quizás si tenemos todo junto nos sea más fácil entenderlo:

Option Explicit
'Todo Sobre Excel 
'Abraham Valencia 
'https://abrahamexcel.blogspot.com/ 
'Lima, Perú 
'Junio del 2020 

EnviardatosaWord() 

Dim MiappWord As Word.Application 
Dim mirango As Word.Range, miCelda As Word.Cell 

Set MiappWord = CreateObject("Word.Application") 
MiappWord.Documents.Add Hoja1.Range("A1:C11").Copy 

With MiappWord

          .Selection.PasteExcelTable False, False, False

          With .ActiveDocument.Tables(1)
              'Fuente de color rojo
              .Cell(2, 3).Range.Font.ColorIndex = wdRed
	            'Fondo en verde con constante de Word         
              .Cell(3, 3).Shading.BackgroundPatternColor = wdColorGreen
              'Fondo en verde gris con función RGB         
              .Cell(4, 3).Shading.BackgroundPatternColor = RGB(184, 183, 153)
              'Fuente en formato negrita
              .Cell(5, 3).Range.Font.Bold = wdToggle
              'Fuente en formato cursiva
              .Cell(6, 3).Range.Font.Italic = wdToggle
              'Fondo de color rojo para toda una fila
              .Rows(7).Shading.BackgroundPatternColor = wdColorRed
              'Escibir hola en una celda
              .Cell(Row:=8, Column:=3).Range = "Hola"
           End With

           With .ActiveDocument
               Set mirango = .Range(Start:=.Tables(1).Cell(9, 1).Range.Start, End:=.Tables(1).Cell(11, 3).Range.End)
           End With

          .Visible = True 
End With 

'Escribir la palabra Repetir en todas las celdas del rango elegido
For Each miCelda In mirango.Cells
     miCelda.Range = "Repetir" 
Next miCelda 

Application.CutCopyMode = False 
Set MiappWord = Nothing 

End Sub  

Si todo salió bien, en su Word deben tener algo como esto:

Y eso es todo en esta ocasión, espero que hayan aprendido un poco más sobre interactuar con Word desde Excel. Hasta la próxima.

Abraham Valencia
Lima, Perú

Descargue el ejemplo de aquí

 

viernes, 12 de junio de 2020

Publicando en Facebook desde Excel con VBA (II)

Hace algunos días vimos como publicar un post de texto en nuestras páginas de Facebook (Enlace). Además, ahí explicamos cómo obtener la clave token de nuestra página, la cual es necesaria para poder seguir publicando diversas cosas como imágenes, que es lo que haremos en esta oportunidad.

Como asumo que ya todos/as leyeron el artículo anterior, ahora me centrare en las características que debe tener la imagen que vamos a usar. Ah, eso sí, la imagen debe estar ya en internet de manera previa, es decir, vamos a usar una imagen que hayamos colocado en alguna web o de alguna web que lo permita. Sobre el formato, pueden usarse los siguientes: JPG/JPEG, BMP, PNG, GIF y TIFF. “Facebook For Developers” recomienda que los archivos PNG tengan un tamaño menor a 1 MB, asimismo, para otros formatos recomiendan imágenes de menos de 4 MB.

Para lograr nuestro cometido, nuevamente usaremos el objeto MSXML2.XMLHTTP60 y el método POST. Para ello los parámetros que usaremos en esta ocasión serán los siguientes:

"https://graph.facebook.com/[Aquí_el_ID_de_la_página]/photos?&url=[Aquí_la_URL_de_tu_imagen]&caption=[Aquí_el_texto_que_queremos_con_la_foto]&access_token=[Aquí_tu_clave_token]"

Por si acaso, una forma fácil de conseguir el URL de una imagen es darle clic derecho y elegir la opción “Copiar dirección de imagen” o “Copiar vínculo de la imagen” (el mensaje exacto dependerá del navegador d que uses).

Ahora sí vamos a lo que les gusta, el VBA. Lo primero será declarar nuestras variables. No ovliden activar las referencias a “Microsoft XML, v6.0” (el 6 puede variar dependiendo de tu versión de Office).

Dim WebXML As New MSXML2.XMLHTTP60 
Dim miURL As String
Ahora a la variable miURL, le vamos a asignar la cadena dar con parámetros que necesitamos y habíamos comentado líneas arriba.  Como verán los parámetros deben ser reemplazados en la cadena (sin los corchetes, por si acaso.). Una vez conseguida la cadena, se la asignamos a la variable, quedando en mi caso así:
miURL = "https://graph.facebook.com/ 389999999905731/photos?&url=https://1.bp.blogspot.com/9TKACuCKzyA/XtmyFrZXGNI/AAAAAAAADzc/YofqAsYp1SHGi9U9reyxtitmzOIQCK4BGAsYHg/w400h330/Face11.jpg&caption=Imagen de prueba&access_token=EAAkUiClZCzDgBAB0ZA2P4iGZBdNjC1O999JvsI8AeZBufiwUw18jAAOZAF9nZB30QEIeEZCfXh6ZC1KsE9yNXad7rTnZCpOkRURpbbIt1SU35P2z4GXhBMNtdwZB8HggZBL1LZBwXAyeSpo844y1n4a3U8KcdZCHsjyPCAZAuSrHyLYjgZDZD"

Lo que toca ahora es usar la instrucción Open combinada con el método Post para configurar la solicitud (cadena URL) a la web y de inmediato usaremos el método Send para abrir la conexión y enviar la solicitud al servidor. Todo junto debe quedar así: 

Sub EnviaraFacebook()  

Dim WebXML As New MSXML2.XMLHTTP60  
Dim miURL As String 

miURL = "https://graph.facebook.com/ 389999999905731/photos?&url=https://1.bp.blogspot.com/9TKACuCKzyA/XtmyFrZXGNI/AAAAAAAADzc/YofqAsYp1SHGi9U9reyxtitmzOIQCK4BGAsYHg/w400h330/Face11.jpg&caption=Imagen de prueba&access_token=EAAkUiClZCzDgBAB0ZA2P4iGZBdNjC1O999JvsI8AeZBufiwUw18jAAOZAF9nZB30QEIeEZCfXh6ZC1KsE9yNXad7rTnZCpOkRURpbbIt1SU35P2z4GXhBMNtdwZB8HggZBL1LZBwXAyeSpo844y1n4a3U8KcdZCHsjyPCAZAuSrHyLYjgZDZD" 

WebXML.Open "POST", URL, False  
WebXML.send  

MsgBox "Listo"  

End Sub 

Al correr la macro, en nuestra página tendremos algo así:

¿Notan que, nuevamente, sale el nombre de la app creada para Facebook en el primer artículo? Ese post no lo borraré para que quede como una nueva prueba. Les recuerdo que el token les seguirá sirviendo para próximas publicaciones.

Eso es todo en esta oportunidad ¡Hasta la próxima!

Abraham Valencia
Lima, Perú

jueves, 4 de junio de 2020

Publicando en Facebook desde Excel con VBA (I)

Hoy veremos la primera entrega de cómo hacer publicaciones en Facebook desde Excel usando VBA. En esta ocasión comenzaremos con una forma de publicar post, de texto, en nuestra página de Facebook. Si les adelanto que por ser la primera entrega gran parte del artículo será sobre la forma para habilitar la cuenta de desarrolladores de Facebook y dar los permisos necesarios, y similares, para poder conectar a Excel con Facebook.

Comenzado, entonces lo primero que debemos hacer es habilitar nuestra cuenta de Facebook Developers, no necesitas crear algo nuevo, solo usa tu cuenta de Facebook ya existente. Para ello entra aquí: Enlace.  Una vez hecho eso, entra aquí: Enlace y activa la opción “Mis apps” – “Crear app”.

Elige el nombre que desees, yo usaré “AppExcel”

Dale clic a “Crear identificador de la app”. Si te sale un captcha, solo acepta. Te aparecerá una página como esta.

En el menú de la izquierda elige “Configuración” y luego “Básica”. Debes tener algo como lo siguiente en pantalla:

En “Categoría” sugiero colocar “Negocios y páginas” y dale clic a “Guardar cambios”. Ahora entra al siguiente enlace: Enlace. La página debe ser similar a esta:

En “Usuario o página” elige la opción “Obtener token de acceso a la página”. Lo más probable es que te salga una ventana emergente que te pregunte si deseas continuar con el mismo usuario de Facebook, obviamente acepta. Luego te saldrá algo como la siguiente imagen, solo elige la pagina que desees y dale clic al botón “Siguiente”.

Si te sale una ventana emergente más, tranquilo, son más permisos, solo dale clic al botón “Listo” y en la otra ventana al botón “Aceptar”. Ahora en la página en la que ya estabas, nuevamente expande las opciones de “Usuario o página” y aparecerá el nombre de la página que elegiste; elígela. Luego en la sección “Permisos” elige “Page_manage_post” y presiona el botón “Generate Access Token”.  

Aparecerán nuevamente las ventanas emergentes, acepta todas y vuelve a la página. En “Usuario o página” elige nuevamente tu página y ahora sí ya se generó el token que necesitas; cópialo. Verás que es bastante largo, pero es lo normal. Esa clave token es la llave para que podamos publicar en Facebook.

Ahora entra aquí: Enlace. Tendrás esto en pantalla:

En el cuadro de texto correspondiente pega tu clave token y luego dale clic al botón “Depurar”. El resultado será similar a lo que muestro a continuación:

Las claves token tienen un periodo corto de duración, pero si ven al final hay un botón “Ampliar token de acceso”, denle clic. Por protocolo quizás Facebook les pida su clave, ingrésenla sin miedo. Luego obtendrán lo siguiente:

Clic a “Depurar”. Copien el nuevo token y no lo pierdan que ya viene lo bueno, pero primero anda a tu página elige el menú “Información” y cuando cargue la página correspondiente, anda a la parte baja final y verás lo siguiente:

Copia el número identificador de tu página.

Ahora sí vamos a Excel. Anda al editor de VBA y lo primero que debes hacer es activar las referencias a “Microsoft XML, v6.0” (el 6 puede variar dependiendo de tu versión de Office).

Nosotros usaremos el objeto MSXML2.XMLHTTP60 que se usa para realizar solicitudes HTTP. Dichas solicitudes nos permiten interactuar con un servicio web, API y similares. Dicho eso, declararemos nuestras variables; solo vamos a usar dos:

Dim URL As String 
Dim WebXML As New MSXML2.XMLHTTP60 

Ahora vamos a recurrir a la “API Graph” de Facebook la cual nos dice que con el método POST podemos enviar información y publicarla, pero hay que seguir cierttos parámetros. En esta ocasión usaremos lo siguiente:

"https://graph.facebook.com/[Aquí_el_ID_de_la_página]/feed?message=[Aquí_el_texto_que_queremos_en_el_post]&access_token=[Aquí_tu_clave_token]"

Como ven los parámetros deben ser reemplazados en la cadena y son los que ya obtuvimos líneas arriba (sin los corchetes, por si acaso.). Una vez conseguida la cadena, será la que asignemos a nuestra variable URL. En mi caso quedaría así:

URL = "https://graph.facebook.com/389999999905731/feed?message=Hola, esto es una prueba&access_token=EAAkUiClZCzDgBAB0ZA2P4iGZBdNjC1O999JvsI8AeZBufiwUw18jAAOZCAF9nZB30QEIeEZCfXh6ZC1KsE9yNXad7rTnZCpOkRURpbbIt1SU35P2z4GXhBMNtdwZB8HggZBLO1LZBwXAyeSpo844y1n4a3U8KcdZCHsjyPCAZAuSrHyLYjgZDZD"

Ahora lo que haremos es usar la instrucción Open combinada con el método Post, para configurar la solicitud (cadena URL) a la web.

WebXML.Open "POST", URL, False

Para finalizar usaremos el método Send para abrir la conexión y enviar la solicitud al servidor.

WebXML.Send 

Si queremos ver todo junto tendremos esto:

Sub EnviaraFacbook() 

Dim WebXML As New MSXML2.XMLHTTP60 
Dim URL As String

 URL = "https://graph.facebook.com/389999999905731/feed?message=Hola, esto es una prueba&access_token=EAAkUiClZCzDgBAB0ZA2P4iGZBdNjC1O999JvsI8AeZBufiwUw18jAAOZCAF9nZB30QEIeEZCfXh6ZC1KsE9yNXad7rTnZCpOkRURpbbIt1SU35P2z4GXhBMNtdwZB8HggZBLO1LZBwXAyeSpo844y1n4a3U8KcdZCHsjyPCAZAuSrHyLYjgZDZD"

WebXML.Open "POST", URL, False 
WebXML.send 

MsgBox "Listo" 

End Sub 

Una vez que corremos la macro, en nuestra página tendremos algo así:


¿Notan que sale el nombre de la app creada para Facebook? Ese post no lo borraré para que quede como prueba. No olviden que el mensaje puede ser reemplazado por variables o datos de celdas u objetos ActiveX. No olviden que este token les servirá para las próximas publicaciones que enseñaremos.

Eso es todo en esta oportunidad, continuaré pronto con más sobre publicaciones en Facebook desde Excel y VBA ¡Hasta la próxima!

Abraham Valencia
Lima, Perú

sábado, 21 de marzo de 2020

Descargando datos del Coronavirus a través de Power Query

Lamentablemente una pandemia acecha al mundo y muchos/as nos hemos visto obligados a refugiarnos en nuestras casas. Muchos países, ante el temor de más contagios, han ordenado que solo salgan de sus casas los/as encargados/as de abastecer a las familias. En medio de esto el trabajo desde casa se ha incrementado y, asimismo, mucha gente comienza a querer conocer y/o ver datos sobre la afectación de Coronavirus no solo en su país, sino también en el mundo. Para lo primero, sin lugar a duda Excel debe ser una de los programas más usados, como siempre, pero ¿para lo segundo nos será útil? La respuesta casi obvia es: Sí. Ahora lo que veremos es cómo hacer para facilitarnos ver y/o trabajar con los datos del Coronavirus a nivel mundial. Comencemos.

Por suerte Google ha implementado una web en la cual coloca los datos a disposición de todos/as y en un formato tipo tabla que nos permite extraer los datos usando Power Query (Obtener y transformar datos) que es la herramienta que usaremos en esta ocasión. El enlace de dicha web es el siguiente, por cierto: Enlace

Ahora en nuestra hoja de Excel vamos a ir a la pestaña “Datos” y en el grupo “Obtener y transformar datos” vamos a darle clic al botón “Desde la web”.

En el cuadro de diálogo que sale ingresaremos el enlace comentado líneas arriba y le daremos clic al botón “aceptar”.

En el siguiente cuadro, no nos hagamos un mundo y solo démosle clic a “Conectar”.

En el cuadro “Navegador” vamos a elegir la segunda opción “Table 0” y le daremos clic al botón “Transformar datos”.

Se abrirá el editor de Power Query y ahí podemos elegir quitar las columnas que no nos interesen. Por ejemplo, yo no uso la columna “Case per 1M people”, así que basta darle clic derecho a su encabezado y elegir “Quitar”.

En mi caso quiero, también, cambiar el formato a algunas columnas. Por ejemplo, la columna “Recovered” está en formato texto, le doy clic al “ABC” y elijo la opción “Número entero” y listo:

Una vez hecho eso, vamos a la pestaña “Inicio” y le damos clic al botón “Cerrar y cargar”.

Si hicimos todo bien, en nuestra hoja tendremos algo así:

Para terminar, vamos a la pestaña “Datos” de nuestro Excel y en el grupo “Consultas y conexiones” dale clic al botón “Actualizar todo” y en la lista que se despliega dale clic a “Propiedades de conexión…” y en el diálogo que se mostrará vamos a ir a la pestaña “Uso” y ahí activen la opción “Actualizar cada” y coloquen 30 minuto (o lo que deseen).  También activen la opción “Actualizar al abrir el archivo”. Clic al botón “Aceptar” y listo, ya está listo nuestro archivo. Cada 30 minutos, o lo que hayamos elegido, y al abrir el archivo tendremos los datos del avance del Coronavirus en cada país.

Ah, por supuesto que se puede cambiar el formato, ordenar como queramos y sobre todo, trabajar los datos como necesitemos, pero eso ya es tarea para ustedes. Hasta la próxima.

Abraham Valencia
Lima, Perú

Descargue el ejemplo aquí