Macro: seleccionar campo de una lista e imprimir de a uno
Macro: seleccionar campo de una lista e imprimir de a uno
Estimados, tengo una libreta de calificaciones donde al seleccionar el nombre del alumno, me trae toooodas las notas y calificaciones del mismo. Luego selecciono el nombre del alumno e imprimo el archivo en formato PDF, pegando el nombre del alumno como nombre del archivo antes de darle click a Guardar.
Existe alguna manera de crear una macro que haga de manera automática este proceso hasta completar toda la lista de alumnos?
Existe alguna manera de crear una macro que haga de manera automática este proceso hasta completar toda la lista de alumnos?
Office 4.3.7.2
OpenSuse 13.1
Escritorio KD4
OpenSuse 13.1
Escritorio KD4
Re: Macro: seleccionar campo de una lista e imprimir de a un
Hice esto, no lo hace completamente automático, pero creo que lo hace muchísimo más fácil que hacerlo completamente manual.
Lo que tienes que hacer es:
1. Seleccionar la lista de estudiantes.
2. Apretar el “botón” que dice “Ejecutar”
3. Apretar “CTR + V” o “Click Derecho, pegar” en cualquier lugar, ya sea el buscador de Windows, internet, otro archivo que tengas abierto, lo que sea.
4. En el interfaz de impresión, seleccionar “doPDF v6”, seleccionar las hojas que quieres “imprimir”, y apretar aceptar.
5. En el interfaz de doPDF, marcar la ruta que aparece por defecto y reemplazarla con la que tienes en el porta papeles.
6. Repetir el paso 3.
Lo que hace es básicamente tomar todos los elementos de la lista, uno por uno, los coloca en la celda donde debe ir el alumno para que se formule la hoja, copia la ruta donde debería guardarse el nuevo archivo y ejecuta el interfaz de impresión de LibreOffice.
No sé como acceder a las opciones del interfaz de impresión de LibreOffice desde código, lo segundo mejor que podía hacer era acceder a la interfaz desde código y de ahí que se haga manual.
Ahora, notas importantes:
Yo uso LibreOffice, no sé si saltará algún error en OpenOffice.
Para convertir a PDF desde el interfaz de impresión, utilizo la opción “doPDF V6” no sé si OpenOffice también tiene la misma opción disponible, me parece que es un programa aparte de LibreOffice, pero la verdad no lo sé, desconozco.
Una cosa súper importante que tienes que tener en cuenta, hay un error loco pero ni medio normal cuando se abre el interfaz de doPDF, si apreto aceptar y abro el interfaz, cuando trato de copiar lo que tengo en el porta papeles, LibreOffice colapsa, y eso es porque en el porta papeles tengo… no sé lo que sea, pero es como si estuviera en blanco y colapsa cualquier cosa en la que lo pegué, (cualquier cosa, fuera de juego), pero si antes de abrir el interfaz de doPDF, pego lo que tiengo en el porta papeles en cualquier lugar, entonces cuando se abro el interfaz de doPDF, si tengo la información en el porta papeles. No tengo idea de porque ocurre eso. Conclusión: Antes de abrir el interfaz de doPDF, apreta “CTR + V” o “Click Derecho, pegar” en cualquier lugar, ya sea el buscador de Windows, internet, otro archivo que tengas abierto, lo que sea, y después abres el interfaz de doPDF.
Podría haberlo hecho para que se adaptara específicamente al formato de tu archivo, pero no no tengo dicho formato, hice el mio propio, sin embargo, es sumamente simple de adaptar para cualquier formato, solo hay 2 referencias que deben ser cambiadas y están señaladas en el macro, así que no debería ser ninguna complicación adaptarlo para tu archivo específico.
Lo que tienes que hacer es:
1. Seleccionar la lista de estudiantes.
2. Apretar el “botón” que dice “Ejecutar”
3. Apretar “CTR + V” o “Click Derecho, pegar” en cualquier lugar, ya sea el buscador de Windows, internet, otro archivo que tengas abierto, lo que sea.
4. En el interfaz de impresión, seleccionar “doPDF v6”, seleccionar las hojas que quieres “imprimir”, y apretar aceptar.
5. En el interfaz de doPDF, marcar la ruta que aparece por defecto y reemplazarla con la que tienes en el porta papeles.
6. Repetir el paso 3.
Lo que hace es básicamente tomar todos los elementos de la lista, uno por uno, los coloca en la celda donde debe ir el alumno para que se formule la hoja, copia la ruta donde debería guardarse el nuevo archivo y ejecuta el interfaz de impresión de LibreOffice.
No sé como acceder a las opciones del interfaz de impresión de LibreOffice desde código, lo segundo mejor que podía hacer era acceder a la interfaz desde código y de ahí que se haga manual.
Ahora, notas importantes:
Yo uso LibreOffice, no sé si saltará algún error en OpenOffice.
Para convertir a PDF desde el interfaz de impresión, utilizo la opción “doPDF V6” no sé si OpenOffice también tiene la misma opción disponible, me parece que es un programa aparte de LibreOffice, pero la verdad no lo sé, desconozco.
Una cosa súper importante que tienes que tener en cuenta, hay un error loco pero ni medio normal cuando se abre el interfaz de doPDF, si apreto aceptar y abro el interfaz, cuando trato de copiar lo que tengo en el porta papeles, LibreOffice colapsa, y eso es porque en el porta papeles tengo… no sé lo que sea, pero es como si estuviera en blanco y colapsa cualquier cosa en la que lo pegué, (cualquier cosa, fuera de juego), pero si antes de abrir el interfaz de doPDF, pego lo que tiengo en el porta papeles en cualquier lugar, entonces cuando se abro el interfaz de doPDF, si tengo la información en el porta papeles. No tengo idea de porque ocurre eso. Conclusión: Antes de abrir el interfaz de doPDF, apreta “CTR + V” o “Click Derecho, pegar” en cualquier lugar, ya sea el buscador de Windows, internet, otro archivo que tengas abierto, lo que sea, y después abres el interfaz de doPDF.
Podría haberlo hecho para que se adaptara específicamente al formato de tu archivo, pero no no tengo dicho formato, hice el mio propio, sin embargo, es sumamente simple de adaptar para cualquier formato, solo hay 2 referencias que deben ser cambiadas y están señaladas en el macro, así que no debería ser ninguna complicación adaptarlo para tu archivo específico.
- Adjuntos
-
- Importar Varios PDFs.ods
- (11 KiB) Descargado 134 veces
LibreOffice 7.2.6.2 | Windows 7 Ultimate
Re: Macro: seleccionar campo de una lista e imprimir de a un
respondí más abajo citando
Última edición por droplon el Jue Ago 05, 2021 5:28 pm, editado 1 vez en total.
Office 4.3.7.2
OpenSuse 13.1
Escritorio KD4
OpenSuse 13.1
Escritorio KD4
Re: Macro: seleccionar campo de una lista e imprimir de a un
Neftali R escribió:Hice esto, no lo hace completamente automático, pero creo que lo hace muchísimo más fácil que hacerlo completamente manual.
Lo que tienes que hacer es:
1. Seleccionar la lista de estudiantes.
2. Apretar el “botón” que dice “Ejecutar”
3. Apretar “CTR + V” o “Click Derecho, pegar” en cualquier lugar, ya sea el buscador de Windows, internet, otro archivo que tengas abierto, lo que sea.
4. En el interfaz de impresión, seleccionar “doPDF v6”, seleccionar las hojas que quieres “imprimir”, y apretar aceptar.
5. En el interfaz de doPDF, marcar la ruta que aparece por defecto y reemplazarla con la que tienes en el porta papeles.
6. Repetir el paso 3....................
Muchísimas gracias por tu ayuda, pero debo confesar que no logré entender todo el proceso que me explicas. Incluso lo intenté pero me parece que no es posible porque no tengo instalado el "doPDF".
Yo también utilizo LibreOffice Calc (V7.1.4.2=
Intentaré explicar el paso a paso de todo el proceso y el resultado final al que quiero lograr.
Mi intención era poder poner un Botón que diga "GENERAR LIBRETAS" y que todo el proceso que detallo más abajo, se lo pueda hacer automáticamente
Mi documento está compuesto por dos hojas
Hoja 1 = "Alumnos y Notas"
Hoja 2 = "Libreta" (Boletin de calificaciones)
Paso 1:
Desde la hoja "Libreta", selecciono el alumno desde una lista desplegable. (Lista desplegable generada a partir de la lista de alumnos en la Hoja 1)
Imagen 01
Imagen 02
Paso 2:
Selecciono el nombre del alumno en cuestión para poder usarlo como nombre de archivo al momento de imprimir en PDF
Imagen 03
Paso 3:
Desde la interfaz de impresión, selecciono una de las dos impresoras PDF. (por defecto siempre uso la "Microsoft Print to PDF")
Imagen 04
Paso 4:
Elijo la ruta donde voy a guardar el PDF y el nombre del documento, pego el nombre del alumno copiado en el "paso 2"
Imagen 05
IMAGEN FINAL - RESULTADO DEL BOLETIN EN DPDF
Imagen 06
Office 4.3.7.2
OpenSuse 13.1
Escritorio KD4
OpenSuse 13.1
Escritorio KD4
Re: Macro: seleccionar campo de una lista e imprimir de a un
Yo no tengo esa opción para crear el PDF, pero puedo modificar el macro para que se adapte a lo que vi en las imágenes.
Lo que tienes que hacer es:
1.copiar este código.
2.Pegarlo en cualquier Módulo de tu archivo.
3.Seleccionar algunos de los alumnos de la hoja "Alumnos y Notas" así como se muestra en la imagen. 4. Ejecutar el macro que previamente copiaste y pegaste.
5. Hacer lo que siempre haces en el interfaz de impresión.
6. Repetir el paso 4 hasta que se termine la lista.
Prueba lo a ver si funciona.
Lo que tienes que hacer es:
1.copiar este código.
Código: Seleccionar todo
Sub VariosPDFs()
Dim oLibretaSheet, oName, oSel As Object
Dim c As Integer, mNames()
oLibretaSheet = ThisComponent.Sheets.getByIndex(1)
oName = oLibretaSheet.getCellRangeByName("C6") 'Colocar aquí la celda en la que debe ir el nombre del alumno.
oSel = ThisComponent.getCurrentSelection
If Not (oSel.getImplementationName = "ScCellRangeObj") Then
MsgBox "Por favor seleccione un rango de celdas contiguas"
Else
mNames() = oSel.getDataArray
For c = 0 to UBound(mNames)
If mNames(c)(0) <> "" Then
oName.String = mNames(c)(0)
Wait 100
ThisComponent.getCurrentController.SetActiveSheet(oLibretaSheet)
Call ElPrint
End If
Next
End If
End Sub
Sub ElPrint
Dim document, dispatcher As Object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
Dim args1(0) As New com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$C$6" 'Aquí colocar la celda donde estará formulada la ruta del archivo PDF
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
Wait 300
dispatcher.executeDispatch(document, ".uno:Print", "", 0, Array())
Wait 100
End Sub
3.Seleccionar algunos de los alumnos de la hoja "Alumnos y Notas" así como se muestra en la imagen. 4. Ejecutar el macro que previamente copiaste y pegaste.
5. Hacer lo que siempre haces en el interfaz de impresión.
6. Repetir el paso 4 hasta que se termine la lista.
Prueba lo a ver si funciona.
LibreOffice 7.2.6.2 | Windows 7 Ultimate
Re: Macro: seleccionar campo de una lista e imprimir de a un
No funcionó. estoy haciendo un video para mostrarte
Office 4.3.7.2
OpenSuse 13.1
Escritorio KD4
OpenSuse 13.1
Escritorio KD4
Re: Macro: seleccionar campo de una lista e imprimir de a un
Neftali R escribió:Yo no tengo esa opción para crear el PDF, pero puedo modificar el macro para que se adapte a lo que vi en las imágenes.
Lo que tienes que hacer es:
1.copiar este código.2.Pegarlo en cualquier Módulo de tu archivo.Código: Seleccionar todo
Sub VariosPDFs() Dim oLibretaSheet, oName, oSel As Object Dim c As Integer, mNames() oLibretaSheet = ThisComponent.Sheets.getByIndex(1) oName = oLibretaSheet.getCellRangeByName("C6") 'Colocar aquí la celda en la que debe ir el nombre del alumno. oSel = ThisComponent.getCurrentSelection If Not (oSel.getImplementationName = "ScCellRangeObj") Then MsgBox "Por favor seleccione un rango de celdas contiguas" Else mNames() = oSel.getDataArray For c = 0 to UBound(mNames) If mNames(c)(0) <> "" Then oName.String = mNames(c)(0) Wait 100 ThisComponent.getCurrentController.SetActiveSheet(oLibretaSheet) Call ElPrint End If Next End If End Sub Sub ElPrint Dim document, dispatcher As Object document = ThisComponent.CurrentController.Frame dispatcher = createUnoService("com.sun.star.frame.DispatchHelper") Dim args1(0) As New com.sun.star.beans.PropertyValue args1(0).Name = "ToPoint" args1(0).Value = "$C$6" 'Aquí colocar la celda donde estará formulada la ruta del archivo PDF dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1()) dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array()) Wait 300 dispatcher.executeDispatch(document, ".uno:Print", "", 0, Array()) Wait 100 End Sub
3.Seleccionar algunos de los alumnos de la hoja "Alumnos y Notas" así como se muestra en la imagen. 4. Ejecutar el macro que previamente copiaste y pegaste.
5. Hacer lo que siempre haces en el interfaz de impresión.
6. Repetir el paso 4 hasta que se termine la lista.
Prueba lo a ver si funciona.
Te compartí este video: https://youtu.be/Q_bBEIuzdvs
Office 4.3.7.2
OpenSuse 13.1
Escritorio KD4
OpenSuse 13.1
Escritorio KD4
Re: Macro: seleccionar campo de una lista e imprimir de a un
Eso de que no funcione el macro en absoluto es raro, muy raro, yo uso LibreOffice 6.3.2.2, pero la verdad dudo que sea un problema de incompatibilidad con la versión de LibreOffice.
El macro que es el que tiene todas las acciones, es VariosPDFs, ElPrint solo son las declaraciones de algunas variables y 3 acciones, es un macro hecho con la grabadora de macros de LibreOffice, además, hay un llamado explicito de ElPrint desde VariosPDFs. Como sea.
Ya has usado macros antes? Cómo está la configuración de seguridad para las macros en tu computadora? Revisa en “Herramientas”, “Opciones...”, “LibreOffice”, “Seguridad”, “Seguridad de Macros”, Y configura la como “Medio”, después de eso es que debes abrir tu archivo y seleccionar la opción de activar macros, si con eso todavía no funciona ningún macro, graba un macro haciendo lo que sea y mandalo en el siguiente mensaje a ver si los servicios invocados son diferentes, sin embargo, no me explico porque el macro que te pasé no funciona en absoluto, si la configuración de seguridad de macros no está bloqueando las macros, no tiene sentido.
Aquí una nueva versión del macro que obitne la lista directamente de los datos de validación de la celda C6 (ya no tienes que selccionar la lista de alumnos para que el macro sepa donde está la lista).
El macro que es el que tiene todas las acciones, es VariosPDFs, ElPrint solo son las declaraciones de algunas variables y 3 acciones, es un macro hecho con la grabadora de macros de LibreOffice, además, hay un llamado explicito de ElPrint desde VariosPDFs. Como sea.
Ya has usado macros antes? Cómo está la configuración de seguridad para las macros en tu computadora? Revisa en “Herramientas”, “Opciones...”, “LibreOffice”, “Seguridad”, “Seguridad de Macros”, Y configura la como “Medio”, después de eso es que debes abrir tu archivo y seleccionar la opción de activar macros, si con eso todavía no funciona ningún macro, graba un macro haciendo lo que sea y mandalo en el siguiente mensaje a ver si los servicios invocados son diferentes, sin embargo, no me explico porque el macro que te pasé no funciona en absoluto, si la configuración de seguridad de macros no está bloqueando las macros, no tiene sentido.
Aquí una nueva versión del macro que obitne la lista directamente de los datos de validación de la celda C6 (ya no tienes que selccionar la lista de alumnos para que el macro sepa donde está la lista).
Código: Seleccionar todo
Sub VariosPDFs()
Dim oAlumYNotSheet, oName As Object
Dim sFormula, sPos1, sPos2 As String
Dim p, dp, c As Integer, mNames()
oName = ThisComponent.Sheets.getByIndex(1).getCellRangeByName("C6")
sFormula = oName.ValidationLocal.getFormula1
p = InStr(1,sFormula,".")+1
dp = InStr(1,sFormula,":")
sPos1 = Mid(sFormula,p,dp-p)
p = InStr(dp,sFormula,".")+1
sPos2 = Mid(sFormula,p,Len(sFormula))
oAlumYNotSheet = ThisComponent.Sheets.getByIndex(0)
mNames() = oAlumYNotSheet.getCellRangeByName(sPos1 & ":" & sPos2).getDataArray()
For c = 0 to UBound(mNames)
If mNames(c)(0) <> "" Then
oName.String = mNames(c)(0)
Wait 100
Call ElPrint
End If
Next
End Sub
Sub ElPrint
Dim document, dispatcher As Object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
Dim args1(0) As New com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$C$6" 'Aquí colocar la celda donde estará formulada la ruta del archivo PDF
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
Wait 300
dispatcher.executeDispatch(document, ".uno:Print", "", 0, Array())
Wait 100
End Sub
LibreOffice 7.2.6.2 | Windows 7 Ultimate