[RESUELTO] Macro abra una hoja con una plantilla y color

Discute sobre la aplicación de hojas de cálculo
Responder
labotica
Mensajes: 19
Registrado: Lun Dic 14, 2015 3:41 pm

[RESUELTO] Macro abra una hoja con una plantilla y color

Mensaje por labotica »

Hola. Tengo una macro, que conseguí gracias a este foro, que al escribir en cualquier celda de una columna me crea una hoja nueva con el nombre de esa celda. Ahora lo que quisiera es poder darle un color específico a esa hoja y si pudiese ser, que esa hoja se abriese con una plantilla que ya tengo hecha. Imagino que se debe poder hacer, pero no tengo ni idea de como hacerlo. Cualquier sugerencia será bienvenida, y como siempre muchas gracias por adelantado
Última edición por labotica el Mar Abr 17, 2018 6:16 pm, editado 1 vez en total.
OpenOffice 4.0 en Ubuntu 14.04
Avatar de Usuario
PepeOooSevilla
Mensajes: 1480
Registrado: Sab Abr 04, 2009 6:10 pm
Ubicación: Sevilla (España)

Re: Macro que abra una hoja con una plantilla y color de pes

Mensaje por PepeOooSevilla »

Hola.
Adjunto una posible solución (versión 2).

Código: Seleccionar todo

REM  *****  BASIC  *****
Option Explicit

Sub CrearHojaSegunColumna()
	Dim DocCalc As Object
	Dim Seleccion As Object
	Dim NombreNuevaHoja As String
	Dim HojasEnLibro As Object
	Dim ArchivoPlantilla As String
	Dim HojaCreada As Object
	
	On Error Goto CONTROL_ERRORES
	DocCalc = ThisComponent
	Seleccion = DocCalc.getCurrentSelection()
	With Seleccion
		'Solo si es una sola celda
		If .supportsService("com.sun.star.sheet.SheetCell") Then
			'También If .getImplementationName() = "ScCellObj" Then
			'Si no es la columna A sale del procedimiento
			'En OOBasic las columnas y filas comienzan en 0 (cero)
			If .getCellAddress.Column <> 0 Then Exit Sub
			NombreNuevaHoja = .getString()
			'Si la celda está vacía sale del procedimiento
			If NombreNuevaHoja = "" Then Exit Sub
			NombreNuevaHoja = "Ficha Técnica " & NombreNuevaHoja
			HojasEnLibro = DocCalc.getSheets()
			With HojasEnLibro
				If Not .hasByName(NombreNuevaHoja) Then
					'Si no existe la insertamos el final de acuerdo al modelo de hoja que se encuentra
					'en el archivo cuya ruta es la siguiente:
					'¡¡¡Cambiar la ruta!!!
					ArchivoPlantilla = "K:\PEPE_16GB\FORO OOO\FORO CALC\FORO_CALC_EJEMPLO_PLANTILLA.ods"
					.insertNewByName(NombreNuevaHoja, .getCount())
					HojaCreada = .getByIndex(.getCount()-1)
					With HojaCreada
						'PLANTILLA_01: es el nombre de la hoja que va a servir de modelo. El archivo modelo puede
						'tener varias hojas y podemos seleccionar la que nos interese
						.link(ConvertToURL(ArchivoPlantilla), "PLANTILLA_01", "", "", com.sun.star.sheet.SheetLinkMode.NORMAL)
						.setLinkMode(com.sun.star.sheet.SheetLinkMode.NONE)
						'El color de la pestaña lo decide la macro aleatoriamente. Si quieres un color determinado
						'tendrías que poner los números apropiados de 0 a 255 siendo:
						'RGB(0, 0, 0) el color NEGRO; RGB(255, 255, 255) el color BLANCO;
						'RGB(255, 0, 0) el color ROJO; RGB(0, 255, 0) el color VERDE;
						'RGB(0, 0, 255) el color AZUL; etc, etc.
						.TabColor = RGB(AleatorioEntre(0, 255), AleatorioEntre(0, 255), AleatorioEntre(0, 255))
					End With
				Else
					MsgBox "Esta hoja ya existe", 16, "¡Atención!"
				End If
			End With
		End If
	End With
	Exit Sub
CONTROL_ERRORES:
	MsgBox "Se ha producido un error ...", 16, "¡Atención!"
End Sub

Function AleatorioEntre(nDesde As Long, nHasta As Long) As Long
' Devuelve un valor aleatorio entre nDesde y nHasta
' Ver http://blog.open-office.es/basic/macro-aleatorio-entre-para-openoffice-y-libreoffice-basic#more535
	AleatorioEntre = Int((nHasta - nDesde + 1)*Rnd() + nDesde)
End Function

A tener en cuenta:
  • - Debes modificar la ruta de la variable "ArchivoPlantilla" por la ruta correcta del archivo que va a servir como modelo o plantilla.
  • - "PLANTILLA_01" es el nombre de la hoja que va a servir de modelo dentro del "ArchivoPlantilla". El archivo modelo/plantilla puede tener varias hojas y podemos seleccionar la que nos interese.
  • - El color de la pestaña lo decide la macro aleatoriamente. Si quieres un color determinado tendrías que poner los números apropiados de 0 a 255 siendo:
    • - RGB(0, 0, 0) el color NEGRO; RGB(255, 255, 255) el color BLANCO;
      - RGB(255, 0, 0) el color ROJO; RGB(0, 255, 0) el color VERDE;
      - RGB(0, 0, 255) el color AZUL; etc, etc..
Saludos cordiales.
Adjuntos
FORO_CALC_Crear hojas a partir de una columna_v2.ods
LibreOffice Calc
(12.14 KiB) Descargado 155 veces
FORO_CALC_EJEMPLO_PLANTILLA.ods
LibreOffice Calc
(9.85 KiB) Descargado 145 veces
LibreOffice 6.4.6. Windows 10. Java 8 rev. 261 (64 bits)
Por favor, utiliza el Foro para tus consultas, no los mensajes privados
Si usas OpenOffice/LibreOffice trabaja y guarda en ODT, ODS, ODP, ... Y haz copias de seguridad.
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Macro que abra una hoja con una plantilla y color de pes

Mensaje por mauricio »

Veo más sencillo que tengas la hoja/plantilla en el mismo documento, de forma oculta, y solo se copia y listo...
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Macro que abra una hoja con una plantilla y color de pes

Mensaje por mauricio »

Para los que usamos Python e EasyMacro:
https://gitlab.com/mauriciobaeza/easy-m ... s/index-es

Versión con una hoja como plantilla en el mismo documento:

Código: Seleccionar todo

from libo import LIBO
import random


def main():
    app = LIBO()
    doc = app.doc
    sel = doc.selection
    if not sel.is_cell or sel.column or not sel.value:
        return

    nuevo_nombre = 'Ficha Técnica {}'.format(sel.value)
    if doc.sheets.exists(nuevo_nombre):
        msg = 'La hoja ya existe'
        app.msgbox(msg)
        return

    nueva_hoja = doc.sheets.copy('plantilla', nuevo_nombre)
    nueva_hoja.obj.TabColor = random.randint(10000, 100000)
    return
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
labotica
Mensajes: 19
Registrado: Lun Dic 14, 2015 3:41 pm

Re: Macro que abra una hoja con una plantilla y color de pes

Mensaje por labotica »

Hola, hola y hola!! Y gracias, gracias, gracias! Muchisimas gracias!!! Ya casi lo tengo, y sólo me queda una duda, que en caso de no poder solucionarla, tendría fácil solución. Con esta macro que me has mandado, la he adaptado a lo que realmente necesito que es:
Cada vez que escribo en una casilla de una columna, al darle intro, me abre dos hojas nuevas. Una con la Ficha Técnica y otra con un Escandallo, la primera de color verde y la segunda de color rojo. Tanto en la hoja de la ficha técnica como en la del escandallo, quiero que me abra una plantilla que tengo guardada en mis plantillas, y que uso siempre, para otros archivos también.
Ahora bien, he hecho algun cambio en lo que me has mandado, y funciona todo a la perfección menos una cosa. Como ves, en la macro tengo puesto que el archivo/plantilla del escandallo que me abre en la hoja del escandallo, es un archivo .ods, que está guardado en mi carpeta de Documentos, en cambio, la de la Ficha Técnica, es un archivo .ots, guardado en la carpeta de /Template de libreoffice.

Código: Seleccionar todo

Sub CrearFichaTecnica()
   Dim DocCalc As Object
   Dim Seleccion As Object
   Dim NombreNuevaHoja As String
   Dim HojasEnLibro As Object
   Dim ArchivoPlantilla As String
   Dim HojaCreada As Object
   
   On Error Goto CONTROL_ERRORES
   DocCalc = ThisComponent
   Seleccion = DocCalc.getCurrentSelection()
   With Seleccion
      'Solo si es una sola celda
      If .supportsService("com.sun.star.sheet.SheetCell") Then
         'También If .getImplementationName() = "ScCellObj" Then
         'Si no es la columna A sale del procedimiento
         'En OOBasic las columnas y filas comienzan en 0 (cero)
         If .getCellAddress.Column <> 2 Then Exit Sub
         NombreNuevaHoja = .getString()
         'Si la celda está vacía sale del procedimiento
         If NombreNuevaHoja = "" Then Exit Sub
         NombreNuevaHoja = "FT " & NombreNuevaHoja
         HojasEnLibro = DocCalc.getSheets()
         With HojasEnLibro
            If Not .hasByName(NombreNuevaHoja) Then
               'Si no existe la insertamos al final
               ArchivoPlantilla = "∕home∕xavi∕.config∕libreoffice∕4∕user∕template∕FichaTecnica2.ods"
               .insertNewByName(NombreNuevaHoja, .getCount())
               HojaCreada = .getByIndex(.getCount()-1)
               With HojaCreada
                  'PLANTILLA_01: es el nombre de la hoja que va a servir de modelo. El archivo modelo puede
                  'tener varias hojas y podemos seleccionar la que nos interese
                  .link(ConvertToURL(ArchivoPlantilla), "FichaTecnica", "", "", com.sun.star.sheet.SheetLinkMode.NORMAL)
                  .setLinkMode(com.sun.star.sheet.SheetLinkMode.NONE)
                  'El color de la pestaña lo decide la macro aleatoriamente. Si quieres un color determinado
                  'tendrías que poner los números apropiados de 0 a 255 siendo:
                  'RGB(0, 0, 0) el color NEGRO; RGB(255, 255, 255) el color BLANCO;
                  'RGB(255, 0, 0) el color ROJO; RGB(0, 255, 0) el color VERDE;
                  'RGB(0, 0, 255) el color AZUL; etc, etc.
                  .TabColor = RGB(0, 255, 0)
               End With
            Else
               MsgBox "Esta hoja ya existe", 16, "¡Atención!"
            End If
         End With
         End If
         
      If .supportsService("com.sun.star.sheet.SheetCell") Then
         'También If .getImplementationName() = "ScCellObj" Then
         'Si no es la columna A sale del procedimiento
         'En OOBasic las columnas y filas comienzan en 0 (cero)
         If .getCellAddress.Column <> 2 Then Exit Sub
         NombreNuevaHoja = .getString()
         'Si la celda está vacía sale del procedimiento
         If NombreNuevaHoja = "" Then Exit Sub
         NombreNuevaHoja = "Esc " & NombreNuevaHoja
         HojasEnLibro = DocCalc.getSheets()
         With HojasEnLibro
            If Not .hasByName(NombreNuevaHoja) Then
               'Si no existe la insertamos al final
               ArchivoPlantilla = "/home/xavi/Documentos/Escandallo.ots"
               .insertNewByName(NombreNuevaHoja, .getCount())
               HojaCreada = .getByIndex(.getCount()-1)
               With HojaCreada
                  'PLANTILLA_01: es el nombre de la hoja que va a servir de modelo. El archivo modelo puede
                  'tener varias hojas y podemos seleccionar la que nos interese
                  .link(ConvertToURL(ArchivoPlantilla), "Hoja1", "", "", com.sun.star.sheet.SheetLinkMode.NORMAL)
                  .setLinkMode(com.sun.star.sheet.SheetLinkMode.NONE)
                  'El color de la pestaña lo decide la macro aleatoriamente. Si quieres un color determinado
                  'tendrías que poner los números apropiados de 0 a 255 siendo:
                  'RGB(0, 0, 0) el color NEGRO; RGB(255, 255, 255) el color BLANCO;
                  'RGB(255, 0, 0) el color ROJO; RGB(0, 255, 0) el color VERDE;
                  'RGB(0, 0, 255) el color AZUL; etc, etc.
                  .TabColor = RGB(255, 0, 0)
               End With
            Else
               MsgBox "Esta hoja ya existe", 16, "¡Atención!"
            End If
         End With
      End If
      
   End With
   Exit Sub
CONTROL_ERRORES:
   MsgBox "Se ha producido un error ...", 16, "¡Atención!"
End Sub

Pues bien, sólo me funciona la primera (el archivo .ods). Imagino que debe ser porque en donde dice "HojasEnLibro = DocCalc.getSheets()" debo cambiarlo por algo conmo "HojasEnLibro = TemplateCalc.getSheets()" o algo así? Puede ser? No tengo mucha idea, pero como funciona todo perfectamente, menos este pequeño detalle, imaginno que debe ser algo que vaya por ahí.
Es imposible no repetirme: Muchísimas gracias por todo!
OpenOffice 4.0 en Ubuntu 14.04
labotica
Mensajes: 19
Registrado: Lun Dic 14, 2015 3:41 pm

Re: Macro que abra una hoja con una plantilla y color de pes

Mensaje por labotica »

Perdón, ya está, ni template ni nada. Era un fallo mío: como no me funcionaba he estado haciendo cambios, y como fallaba justo a partir de donde le decía la ruta del archivo he probado de cambiar la barra /home/... por la que tengo en el teclado numérico ∕home∕...
Loi he cambiado y funciona todo perfecto! Muchas gracias y ahora edito el tema
OpenOffice 4.0 en Ubuntu 14.04
labotica
Mensajes: 19
Registrado: Lun Dic 14, 2015 3:41 pm

Re: [RESUELTO]Macro que abra una hoja con una plantilla y co

Mensaje por labotica »

Hola Mauricio, como ya he dicho, no tengo mucha idea, pero eso no quita que me pase las horas que haga falta! Ahora me miraré esto que me has mandado, porque parece la bomba. Sólo por la cantidad de código que se ahorra ya me parece increíble. Gracias y hasta pronto
OpenOffice 4.0 en Ubuntu 14.04
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: [RESUELTO] Macro abra una hoja con una plantilla y color

Mensaje por mauricio »

Por acá puedes ver un video de como instalar EasyMacro:
https://forum.openoffice.org/es/forum/v ... 50&t=13062

para poder usar la macro que te muestro, en la misma te pase la documentación de la misma, y aquí estamos por cualquier duda con su uso.

Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Responder