Parece que la entrada que levanté hace un tiempo (sobre Word) ha dado sus buenos frutos, y aquí estamos ahora, intentando resolver un problema presentado a la hora de codificar macros..... en PowerPoint. Si, desde ya (y como en toda gran aplicación de la suite de Office), en PP también podemos grabar o generar nuestras propias macros las cuales, practicamente, pueden hacer cualquier cosa.
Para la gran mayoría de los usuarios promedios de una PC, realizar una buena presentación de diapositivas no es mayor inconveniente. Microsoft ha facilitado mucho la tarea y sonidos, videos, animaciones, gráficos, etc, etc, son objetos sencillos de manejar y configurar dentro de PowerPoint. Pero lo presentado por mi lector (médico, rubro que utiliza asiduamente esta herramienta) es algo mas complejo: diseñó un test para sus pacientes, en PowePoint, compuesto de varias preguntas. Las diapositivas se van sucediendo una tras otra y el usuario ingresa información o selecciona la expuesta. La pregunta: ¿como hacemos para que esas respuestas queden almacenadas en un archivo de Excel? Bien: con macros. En esta entrada intentaremos unir dos herramientas muy poderosas y distintas: la facilidad del diseño gráfico y de animación de PowerPoint, con las macros y Excel, este último para almacenar y analizar las respuestas dadas.
Empecemos por el principio. El ejemplo que les presento consta de 3 diapositivas, aunque el original (que no muestro por el derecho intelectual del autor) es mucho mayor. Los pacientes que realizan este test deben ir respondiendo a una serie de preguntas o bien completar información, a lo largo de estas 3 diapositivas.
El código en VBA se encargará de:
1) Chequear los datos ingresados / seleccionados
2) Ir a la siguiente diapositiva
3) Al concluir la presentación, volcar esos registros a Excel
El pase a Excel (aunque bien podría ser Access o un archivo de texto) es para que mi lector lleve un registro histórico de las respuestas, y en base a ellas elaborar las respectivas estadísticas.
Como mas arriba mencioné, hay tres diapositivas: se las expongo a continuación:
seleccionar una de las tres opciones
ingresar cuatro números, de acuerdo a la imagen situada a la izquierda.
entrar el número de la serie y seleccionar de la lista una palabra.
Al pié de cada diapositiva se encuentra una flecha (insertar / autoforma), a la cual le asignamos la macro que controla el ingreso de datos y nos lleva a la diapositiva siguiente. Recordemos que para hacer esto, damos click derecho sobre la autoforma y del menú emergente seleccionamos la opción: "configuración de la acción":
De acuerdo a la imagen superior, vemos varios caminos a tomar:
Ninguna: no hace nada.
Hipervínculo a: podemos saltar a distintas diapositivas, urls u otros archivos.
Ejecutar programa: abrir un archivo "exe"
Ejecutar una macro: en la lista desplegable nos aparecen todas las macros del proyecto. Seleccionamos la indicada y listo.
Para manejar los controles, con sus propiedades, métodos y eventos, no necesitaremos mas que nuestros conocimientos de VBA, ya que es exactamente igual que Excel. Deberíamos estudiar un poco mas si deseamos echar mano del objeto Application (aplicación) ya que ahora hablamos de PowerPoint, pero esto no se presenta en este ejemplo. En las diapositivas puse ciertos controles (combobox, text, optionbutton) y cada una de ellas se maneja (casi) de igual forma que un UserForm.
Lo mas provechoso de esta entrada, para el público en general, será ver la forma en la que utilizamos Excel desde otro programa. Los pasos son simples:
1) Creo el objeto "Excel" (application)
2) Creo el objeto "Libro" (workbook)
3) Creo el objeto "Hoja" (worksheet)
A medida que ejecuto los pasos anteriores, vinculo: le digo a VBA de PowerPoint que la Hoja pertenece a Libro y que Libro a Excel. Así armamos la "jerarquía" de objetos, relacionándolos.
Para manejarme con soltura dentro del proyecto e ir almacenando las respuestas, definí una variable global, una Matriz, del tipo Variant. Dicha variable se llama Matrix(). En cada una de sus posiciones Matrix(0), Matrix(1), Matrix(n), voy guardando las respuestas, para luego volcar esa matriz a Excel. Me pareció una forma rápida y sencilla para guardar la información ingresada por el usuario, a la vez que ocupo una sola variable y hago uso de pocos recursos.
Así se ve el entorno VBA en PowerPoint:
Entonces, pasemos al código:
Para que el proyecto funcione correctamente, debe existir el libro: "base-de-datos.xls" dentro del mismo directorio en donde tenemos nuestro PowerPoint. En el caso que necesiten guardar los registros en otro libro, o bien que este se encuentre en otra ubicación del disco, tendrán a bien cambiar la siguiente línea de código:
Ruta = Application.ActivePresentation.Path & "\base-de-datos.xls"
por la que necesiten. Al final del post les dejo el link a un archivo .rar que posee ambos archivos.
Con macros como estas podemos potenciar nuestros trabajo a límites inimaginables, prescindiendo por completo de software adicional y centrándonos solo en las aplicaciones de Microsoft Office.
Noten la ductilidad de PowerPoint para generar programas multimedia de alto vuelo (ni hablar de la versión 2010, que es sencillamente espectacular, por que hasta nos deja editar video), el cual puede ser combinado con la capacidad de análisis de Excel o de almacenamiento de Access. ¿Y por que no crear reportes en Word, con los resultados? Todo esto se puede lograr mediante las macros y otras herramientas presentes en la suite, solo es cuestión de tenerlas en cuenta y comenzar a trabajar con ellas.
Link a los archivos
Ninguna: no hace nada.
Hipervínculo a: podemos saltar a distintas diapositivas, urls u otros archivos.
Ejecutar programa: abrir un archivo "exe"
Ejecutar una macro: en la lista desplegable nos aparecen todas las macros del proyecto. Seleccionamos la indicada y listo.
Para manejar los controles, con sus propiedades, métodos y eventos, no necesitaremos mas que nuestros conocimientos de VBA, ya que es exactamente igual que Excel. Deberíamos estudiar un poco mas si deseamos echar mano del objeto Application (aplicación) ya que ahora hablamos de PowerPoint, pero esto no se presenta en este ejemplo. En las diapositivas puse ciertos controles (combobox, text, optionbutton) y cada una de ellas se maneja (casi) de igual forma que un UserForm.
Lo mas provechoso de esta entrada, para el público en general, será ver la forma en la que utilizamos Excel desde otro programa. Los pasos son simples:
1) Creo el objeto "Excel" (application)
2) Creo el objeto "Libro" (workbook)
3) Creo el objeto "Hoja" (worksheet)
A medida que ejecuto los pasos anteriores, vinculo: le digo a VBA de PowerPoint que la Hoja pertenece a Libro y que Libro a Excel. Así armamos la "jerarquía" de objetos, relacionándolos.
Para manejarme con soltura dentro del proyecto e ir almacenando las respuestas, definí una variable global, una Matriz, del tipo Variant. Dicha variable se llama Matrix(). En cada una de sus posiciones Matrix(0), Matrix(1), Matrix(n), voy guardando las respuestas, para luego volcar esa matriz a Excel. Me pareció una forma rápida y sencilla para guardar la información ingresada por el usuario, a la vez que ocupo una sola variable y hago uso de pocos recursos.
Así se ve el entorno VBA en PowerPoint:
dentro del Módulo 1 ingresé mis macros. Vean que cada diapositiva (slide) es tratada como una hoja de cálculos en Excel, dentro de los objetos de PowerPoint
Entonces, pasemos al código:
'defino la variable global Matrix(), para tener acceso a ella 'dentro de cualquier ámbito del proyecto: Public Matrix(1 To 10) As String Sub PrimerDiapositiva() 'de acuerdo al boton de opción seleccionado, cargo 'en la primer posición de la matriz la respuesta 'dada por el usuario With Slide1 If .optMariposa.Value = True Then Matrix(1) = "mariposa" ElseIf .optMancha.Value = True Then Matrix(1) = "mancha" ElseIf .optPayaso.Value = True Then Matrix(1) = "payaso" End If End With 'por las dudas (hay veces que queda escrito) 'quito cualquier valor presente en la cuadro de 'texto de la siguiente diapositiva: Slide2.txtNumeros.Text = "" 'me voy a la proxima diapositiva SlideShowWindows(Index:=1).View.Next End Sub Sub SegundaDiapositiva() Dim M As Variant Dim Cadena As String With Slide2 'si no ingresó nada, le aviso al participante: If Trim(.txtNumeros.Text) = "" Then MsgBox "Por favor ingrese los 4 números, separados por coma", vbExclamation Else 'utilizo Split para armar una matriz con el texto ingresado, en donde el 'delimitador es la coma que separa cada número: M = Split(.txtNumeros.Text, ",") 'ahora me fijo la cantidad de elementos: si es distinto a 3 (las matrices 'se inicializan en 0, o sea que 3 es, en realidad, 4 elementos) 'aviso que algo anda mal If UBound(M) <> 3 Then MsgBox "Debe ingresar 4 números, separados por coma (,)", vbCritical ElseIf Right(.txtNumeros.Text, 1) = "," Then 'aqui me aseguro que no pongan una coma al final, x las dudas MsgBox "La serie no puede terminar en comar (,)", vbCritical Else 'con este for.. limpio cualquier espacio entre caracteres For x = 0 To UBound(M) M(x) = Trim(M(x)) Next x 'ahora (con los caracteres limpios) uno todo en una variable Cadena = Join(M, ",") 'la cual luego asigno a la segunda posicion de Matrix Matrix(2) = Cadena End If End If End With 'borro la matriz utilizada en el ambito local: Erase M 'borro cualquier dato en la diapositiva siguiente, cargando el 'combobox With Slide3 .txtSerie.Text = "" 'cargo los items que se mostrarán en el combobox de la 'siguiente diapositiva .cboAnimales.Clear .cboAnimales.AddItem "leon" .cboAnimales.AddItem "puma" .cboAnimales.AddItem "guepardo" .cboAnimales.AddItem "lobo" .cboAnimales.AddItem "tigre" .cboAnimales.AddItem "leopardo" End With 'y me voy a la tercer diapositiva SlideShowWindows(Index:=1).View.Next End Sub Sub TerceraDiapositiva() With Slide3 'controlo los datos If Trim(.txtSerie.Text) = "" Then MsgBox "Ingrese el nro faltante", vbExclamation ElseIf Not IsNumeric(.txtSerie.Text) Then MsgBox "El dato ingresado debe ser numérico", vbCritical ElseIf .cboAnimales.Text = "" Then MsgBox "Seleccione una palabra", vbExclamation Else 'y cargo las repuestas en Matrix Matrix(3) = Trim(.txtSerie) Matrix(4) = .cboAnimales.Text 'mando todo a excel PasarAExcel 'aviso y cierro: MsgBox "Test finalizado, gracias por participar", vbInformation 'Application.Quit End If End With End Sub Sub PasarAExcel() 'defino las variable de suo local: Dim Excel, Libro, Hoja As Object Dim Ruta As String Dim UltimaFila As Long 'armo la ruta en donde tengo el archivo: Ruta = Application.ActivePresentation.Path & "\base-de-datos.xls" 'creo el objeto Application: Excel Set Excel = CreateObject("Excel.Application") 'lo hago invisible, para que sea mas agil y a la vez no inte 'rrumpa a PowerPoint Excel.Visible = False 'ahora creo el libro, abriendo el archivo existente. noten que 'aquí vinculo a Libro con Excel Set Libro = Excel.workbooks.Open(Ruta) 'creo la Hoja, que ya existe dentro del libro. y aquí relaciono 'a Hoja con Libro: Set Hoja = Libro.sheets("resultados") 'inserto una fila. al ser Hoja un objeto de Libro, y este a su 'vez de Excel, ya estoy en condiciones de manejar sentencias 'de Excel desde PowerPoint, como "EntireRow.Insert" Hoja.Range("a2").entirerow.Insert 'y vuelco los datos: Hoja.Cells(2, 1).Value = Matrix(1) Hoja.Cells(2, 2).Value = Matrix(2) Hoja.Cells(2, 3).Value = Matrix(3) Hoja.Cells(2, 4).Value = Matrix(4) Hoja.Cells(2, 5).Value = Now 'agrego la fecha y hora 'guardo los cambios: Libro.Save 'cierro el libro: Libro.Close 'quito la aplicación Excel Excel.Quit 'borro y destruyo todo, para liberar recursos Erase Matrix Set Excel = Nothing Set Libro = Nothing Set Hoja = Nothing End Sub
los registros de 4 pacientes, guardados en Excel, listos para que puedan ser agrupados, analizados, etc, etc, con funciones, tablas dinámicas y todas las herramientas disponibles.
Ruta = Application.ActivePresentation.Path & "\base-de-datos.xls"
por la que necesiten. Al final del post les dejo el link a un archivo .rar que posee ambos archivos.
Con macros como estas podemos potenciar nuestros trabajo a límites inimaginables, prescindiendo por completo de software adicional y centrándonos solo en las aplicaciones de Microsoft Office.
Noten la ductilidad de PowerPoint para generar programas multimedia de alto vuelo (ni hablar de la versión 2010, que es sencillamente espectacular, por que hasta nos deja editar video), el cual puede ser combinado con la capacidad de análisis de Excel o de almacenamiento de Access. ¿Y por que no crear reportes en Word, con los resultados? Todo esto se puede lograr mediante las macros y otras herramientas presentes en la suite, solo es cuestión de tenerlas en cuenta y comenzar a trabajar con ellas.
Link a los archivos
disculpa la pregunta, para abrir el excel de una gráfica dentro de power point, en 2003 se ejecuta perfectamente con este código, pero ya en 2007 no funciona:
ResponderEliminarDim Ograph As Object
Set Ograph = sh.OLEFormat.Object
sh.OLEFormat.Activate
y para 2007 como es ? de antemano gracias
Estimado: deberías enviarme el archivo, así puedo analizarlo "en vivo" y probar distintas alternativas. No me pases todo el proyecto, simplemente esa parte que está fallando.
ResponderEliminarUn abrazo
Buenos días:
ResponderEliminarTe planteo la siguiente consulta:
Tengo una serie de presentaciones powerpoint con cuadros numéricos vinculados a excel, ¿es posible actualizar los vínculos desde el powerpoint con una macro?? como se haría?
Muchas gracias de antemano
Se pueden actualizar los vínculos de una tabla de datos de powerpoint, que toma dichos datos de un excel, mediante una macro??
ResponderEliminarCarlos: vas a tener que enviarme un ejemplo, ya que necesito ver de que forma armaste ese PowerPoint y como lo vinculaste con Excel. ¿Incrustaste un objeto Excel que lee desde un libro xls externo?
ResponderEliminarAnónimo:
ResponderEliminartambién voy a necesitar que me pases el ejemplo, me resulta imprescindible ver de que forma armaste el proyecto.