Macro para asignar una macro a un atajo de teclado

Macro para crear atajos de teclado asignados a nuestras macros

 

¿Podemos asignar una macro a un atajo de teclado desde otra macro? La respuesta es sí.

Así que ahora podemos hacer que una macro cree atajos de teclado a nuestras macros fácilmente.

¿Podemos hacer que al abrir un documento se asignen atajos de teclado a las macros contenidas en el documento y que al cerrarlo los atajos se eliminen? La respuesta de nuevo es afirmativa.

Por lo tanto, podremos enviar un documento o plantilla con macros y que al abrirlo, cree los atajos de teclado personalizados para ejecutar las macros que el propio documento contiene.

Pero ¿cómo? Si quieres conocer la respuesta, puedes seguir leyendo :D

Crear un módulo específico para las macros de atajos de teclado

Puede ser muy interesante crear un módulo específico en el contenedor Mis macros y diálogos para las macros que van a gestionar los atajos de teclado. Sabemos que de esta forma dispondremos de las macros para todos nuestros documentos, pero lo más importante, podremos fácilmente asignar una copia del módulo a un nuevo documento, y hacer transportable nuestro trabajo con este sencillo truco. Lo veremos más adelante. Por ahora, creemos el nuevo módulo.

  1. Selecciona desde el menú Herramientas > Macros > Organizar macros > OpenOffice.Basic...
  2. Haz clic sobre el botón Organizador...
  3. Comprueba que está activada la librería Standard del contenedor Mis Macros y haz clic sobre el botón Nuevo...

  4. Teclea el nombre del módulo (por ejemplo, AtajosTeclado) y haz clic sobre el botón Aceptar.
  5. Con el módulo AtajosTeclado seleccionado, haz clic sobre el botón Editar.
  6. Se presentará el IDE (editor de Basic) y estará activado el módulo AtajosTeclado.

Las macros para crear o eliminar atajos de teclado

Vamos a definir tres macros para gestionar los atajos de teclado:

  • AtajosTeclado_Agregar: nos permitirá definir un nuevo atajo de teclado. Esta macro es auxiliar, pues la vamos a utilizar para asignarla al evento del documento Abrir documento, de forma que cada vez que se abra el documento ejecutará su código y dará de alta los atajos de teclado personalizados.
  • AtajosTeclado_Eliminar: nos permitirá eliminar un atajo de teclado ya existente. Esta macro es auxiliar, pues la vamos a utilizar para asignarla al evento del documento Documento va a ser cerrado, de forma al cerrar el documento ejecutará su código y dará de baja los atajos de teclado creados.
  • AtajosTeclado: Es la macro que se encarga de gestionar los dos procesos anteriores según los parámetros que le indiquemos.

Para definir un atajo de teclado debemos primero conocer la combinación de teclas que deseamos utilizar. Por supuesto, debe ser una combinación de teclas que esté libre.

Las aplicaciones Writer, Calc, Impress, Draw, Math y Base tienen por defecto libres las combinaciones de teclas desde Alt+0 hasta Alt+9 y son las que vamos a utilizar en este ejemplo. Por supuesto que puedes seleccionar otras, y en cualquier caso debemos comprobar que no están siendo utilizadas por la aplicación.

Para definir el atajo deberemos conocer los códigos de las teclas que se van a pulsar. Necesitamos conocer en realidad dos datos, lo que en el API llaman modificador y la tecla pulsados:

  • el modificador, que es un indicador de si se mantiene pulsada la tecla Shift, Alt o Ctrl (Cmd en MacOs) y que podemos obtener de esta página: Constants Group Modifiers.
  • la tecla, que es un código numérico que podemos obtener de la siguiente página: Constans Group Key.

En nuestro ejemplo hemos definido unas constantes para que sea más fácil la asignación de teclas a los atajos, constantes que definimos a nivel de módulo (antes de declarar cualquier función o subrutina) para que sean visibles para todo el módulo.

El código de las macros (que puedes teclear o mejor copiar y pegar) es el siguiente:

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

Const MODIFIER_SHIFT = 1 ' Tecla Shift
Const MODIFIER_CTRL = 2 ' Tecla Ctrl (o Cmd en MacOs)
Const MODIFIER_ALT = 4 ' Tecla Alt

Const KEY_NUM0 = 256
Const KEY_NUM1 = 257
Const KEY_NUM2 = 258
Const KEY_NUM3 = 259
Const KEY_NUM4 = 260
Const KEY_NUM5 = 261
Const KEY_NUM6 = 262
Const KEY_NUM7 = 263
Const KEY_NUM8 = 264
Const KEY_NUM9 = 265

Sub AtajosTeclado_Agregar()
AtajosTeclado MODIFIER_ALT, KEY_NUM1, True, True, "Standard", "Module1", "MiMacro"
MsgBox ("Macro 'MiMacro' asignada al atajo de teclado Alt+1" & Chr(10) & _
"Pulse Alt+1 para activar la macro", 192, "Información")
End Sub

Sub AtajosTeclado_Eliminar()
AtajosTeclado MODIFIER_ALT, KEY_NUM1
MsgBox ("Eliminada la asignación de la macro al atajo de teclado Alt+1", 192, "Información")
End Sub

Sub AtajosTeclado( _
nModifiers As Integer, nKeyCode As Integer, _
Optional lAccion As Boolean, Optional lDesdeDocumento As Boolean, _
Optional cBiblio As String, Optional cModulo As String, Optional cMacro As String )
' Agrega o elimina un atajo de teclado asociado a una macro
' Para eliminar sólo son necesarios los dos primeros argumentos
' Para agregar son necesarios todos
' lAccion es True para agregar, False (por defecto) para eliminar
' lDesdeDocumento indica si la macro está almacenada en el documento actual

Dim oKeyEvent As New com.sun.star.awt.KeyEvent
Dim oModCfgMgrSupp As Object, oAppCfgMgr As Object, oAppShortCutMgr As Object

' Definir la combinación de teclas del atajo de teclado
oKeyEvent.Modifiers = nModifiers
oKeyEvent.KeyCode = nKeyCode

' Acceso al manejador de atajos de teclado global
' oGlobalAccelCfgMgr = CreateUNOService("com.sun.star.ui.GlobalAcceleratorConfiguration")

' Acceso al módulo de configuración central
oModCfgMgrSupp = CreateUNOService("com.sun.star.ui.ModuleUIConfigurationManagerSupplier")

' Acceso al módulo de configuración en función de la aplicación
' Ver com.sun.star.frame.ModuleManager para más información
oAppCfgMgr = oModCfgMgrSupp.getUIConfigurationManager( "com.sun.star.text.TextDocument" )
' com.sun.star.text.TextDocument Writer
' com.sun.star.sheet.SpreadsheetDocument Calc
' com.sun.star.presentation.PresentationDocument Impress
' com.sun.star.drawing.DrawingDocument Draw
' com.sun.star.formula.FormulaProperties Math
' com.sun.star.sdb.OfficeDatabaseDocument Base: This module represents Base main application; that is, the application main window when you open an ODB file
' com.sun.star.sdb.TableDesign Base: Table Design module
' com.sun.star.sdb.QueryDesign Base: This is the module where you design queries and views. The module is the same for Design View and SQL View.
' com.sun.star.sdb.RelationDesign Base: Module to design database relations
' com.sun.star.sdb.FormDesign Base: Module for creating/editing and viewing embedded forms
' com.sun.star.report.ReportDefinition Base: new Sun Report Builder in design view. The executed report will be a com.sun.star.text.TextDocument or com.sun.star.sheet.SpreadsheetDocument
' com.sun.star.sdb.TextReportDesign Base: Module for creating/editing and viewing reports created using the report wizzard
' com.sun.star.sdb.DataSourceBrowser In OpenOfice.org Base: the component where you open tables/view/queries; in other modules: component to access every datasource registered in (pressing F4)
' com.sun.star.script.BasicIDE Basic IDE
' com.sun.star.frame.StartModule The start module is the last component that remains when you close every Office document with the X at the right corner of the menu bar, without termitating the Desktop

'Acceso al módulo manejador de atajos de teclado de la aplicación
oAppShortCutMgr = oAppCfgMgr.getShortCutManager()

' Si lAccion = true generamos el atajo; caso contrario lo eliminamos
If lAccion Then
' Valores por defecto si no se pasan los argumentos
If IsMissing(cBiblio) Then cBiblio = "Standard"
If IsMissing(cModulo) Then cModulo = "Module1"
If IsMissing(cMacro) Then cMacro = "Main"

' Ruta completa de la macro
cMacro = cBiblio & "." & cModulo & "." & cMacro

' Si la macro está almacenada en el documento
If lDesdeDocumento Then
cMacro= "vnd.sun.star.script:" & cMacro & "?language=Basic&location=document"

' Si la macro está en 'Mis macros y diálogos'
Else
cMacro = "macro:///" & cMacro
EndIf

' Generamos el atajo de teclado
oAppShortCutMgr.setKeyEvent( oKeyEvent, cMacro )

Else
' Eliminamos el atajo de teclado
oAppShortCutMgr.removeKeyEvent( oKeyEvent )

EndIf

' Guardamos los cambios realizados
oAppShortCutMgr.store()

End Sub

El resultado será similar a este:

 

 

La macro AtajosTeclado

Esta macro sirve tanto para crear como para eliminar un atajo de teclado.

Asignar macro a una nueva combinación de teclas

En el caso de crear un nuevo atajo de teclado le debemos llamar a la macro indicando los siguientes parámetros:

  • nModifiers: El modificador que indica si debemos pulsar Shift, Ctrl, Alt o cualquier combinación de ellas junto a la tecla. Podemos utilizar las constantes que hemos definido. Por ejemplo:
    • si se debe mantener la tecla Alt pulsada pasaremos el modificador MODIFIER_ALT.
    • si son dos o más teclas, el modificador se indica como la suma de los modificadores; por ejemplo, si debe pulsar Shift+Ctrl pasaremos MODIFIER_SHIFT + MODIFIER_CTRL
  • nKeyCode: El código numérico de la tecla pulsada, según la tabla indicada anteriormente. Podemos utilizar las constantes que hemos definido. Por ejemplo:
    • si se debe pulsar la tecla numérica correspondiente al 1, podemos pasarle KEY_NUM1.
  • lAccion: valor booleano, por lo que puede ser True o False. En el primer caso, indica que queremos agregar un nuevo atajo de teclado. En caso contrario, indica que queremos eliminarlo. Se ha hecho opcional para no tener que pasarlo en este segundo caso.
  • lDesdeDocumento: valor booleano que indica si la macro a ejecutar por el atajo del teclado se encuentra en el documento actual o en el contenedor Mis macros de tu suite. Si es True significa que la macro asignada estará en el documento.
  • cBiblio, cModulo y cMacro: respectivamente, los nombres de la librería, módulo y macro a ejecutar. Si no se indican, se toman por defecto los valores Standar, Module1 y Main respectivamente.

En el código, la macro AtajosTeclado_Agregar puede servir como ejemplo; en ella se le indica que asigne a la combinación de teclas Alt+1 una macro existente en el documento actual, en la librería Standard, módulo Module1, llamada MiMacro.

La asignación es permanente, por lo que si no la eliminamos, permanecerá definida para todos nuestros documentos.

La asignación se realiza sobre una determinada aplicación, por lo que los atajos de teclado asignados a Writer, por ejemplo, no están disponibles para el resto de aplicaciones. Qué aplicación es a la que se le asigna el atajo de teclado lo define la línea:

    oAppCfgMgr = oModCfgMgrSupp.getUIConfigurationManager( "com.sun.star.text.TextDocument" )

En este caso se ha seleccionado la aplicación Writer. Para otras aplicaciones, consulta la información incluída en el ejemplo, o consulta esta página para conocer las definiciones de los Módulos de OpenOffice.

Eliminar la asignación de teclas de la macro

En el caso de eliminar un atajo de teclado previamente creado, debemos llamar a la macro indicando los siguientes parámetros:

  • nModifiers: Idem que en el caso anterior.
  • nKeyCode: Idem que en el caso anterior.

El resto de argumentos no se utilizan para este caso, por lo que se hicieron opcionales.

En el código, la macro AtajosTeclado_Eliminar puede servir como ejemplo; en ella se le indica que elimine la asignación realizada a la combinación de teclas Alt+1.

La eliminación es permanente, hasta que se defina una nueva asignación.

Crear un atajo de teclado para una macro local

Si tu macro está almacenada en el contenedor Mis macros y quieres asignarle un atajo de teclado, llama a la subrutina AtajosTeclado indicando como argumentos:

  • nModifiers: Ver arriba.
  • nKeyCode: Ver arriba.
  • lAccion: True.
  • lDesdeDocumento: False o no se indica.
  • cBiblio, cModulo y cMacro: respectivamente, los nombres de la librería, módulo y macro a ejecutar.

Un ejemplo es la macro AtajosTeclado_Agregar.

Eliminar el atajo de teclado para la macro local

Si quieres eliminar el atajo de teclado creado y asignado a la macro almacenada en el contenedor Mis macros, llama a la subrutina AtajosTeclado indicando como argumentos:

  • nModifiers: Ver arriba.
  • nKeyCode: Ver arriba.

El resto de parámetros no son necesarios.

Un ejemplo es la macro AtajosTeclado_Eliminar.

Crear un atajo de teclado para una macro en un documento

Si tu macro está almacenada en un documento y quieres asignarle un atajo de teclado, llama a la subrutina AtajosTeclado indicando como argumentos:

  • nModifiers: Ver arriba.
  • nKeyCode: Ver arriba.
  • lAccion: True.
  • lDesdeDocumento: True.
  • cBiblio, cModulo y cMacro: respectivamente, los nombres de la librería, módulo y macro a ejecutar.

Un ejemplo es la macro AtajosTeclado_Agregar.

Para que las macros viajen junto al documento debemos agregarlas al mismo. Como hemos avanzado antes, disponemos de un método muy rápido y eficaz de copiar nuestro módulo a un documento. Para ello:

  1. Selecciona desde el menú Herramientas > Macros > Organizar macros > OpenOffice.Basic...
  2. Haz clic sobre el botón Organizador....
  3. Haz clic sobre el + que se muestra justo delante del nombre de tu documento; se mostrará la librería Standard.
  4. Arrastra el módulo AtajosTeclado a esa librería, manteniendo pulsada la tecla Ctrl para que cree una copia.
  5. Haz clic en el módulo recien copiado. Clic en el botón Editar.
  6. Personaliza las macros del módulo recien copiado para que los atajos de teclado ejecuten las macros contenidas en el documento.

Para que la macro se ejecute tras cargar el documento, debes asignar esta macro al evento Abrir documento; sigue el siguiente proceso:

  1. Guarda tu documento
  2. Desde el documento, selecciona desde el menú Herramientas > Personalizar > ficha Eventos > Abrir Documento
  3. Verifica que los cambios se almacenarán en tu documento y haz clic sobre el botón Macro...
  4. Selecciona en Bibilioteca el módulo correspondiente a tu documento,  desde Nombre de macro selecciona la macro que se ejecutará al abrir el documento. Haz clic sobre el botón Aceptar.
  5. Obtendrás el siguiente resultado
  6. Cierra los diálogos y guarda tu documento

Eliminar el atajo de teclado para la macro al cerrar el documento

Si has asignado un atajo de teclado a una macro de tu documento y quieres eliminarlo al cerrar el mismo, llama a la subrutina AtajosTeclado indicando como argumentos:

  • nModifiers: Ver arriba.
  • nKeyCode: Ver arriba.

Un ejemplo es la macro AtajosTeclado_Eliminar.

Para que la macro se ejecute al cerrar el documento, debes asignar esta macro al evento Documento va a ser cerrado; sigue el siguiente proceso:

  1. Guarda tu documento
  2. Desde el documento, selecciona desde el menú Herramientas > Personalizar > ficha Eventos > Documento va a ser cerrado
  3. Verifica que los cambios se almacenarán en tu documento y haz clic sobre el botón Macro...
  4. Selecciona en Bibilioteca el módulo correspondiente a tu documento,  desde Nombre de macro selecciona la macro que se ejecutará al cerrar el documento. Haz clic sobre el botón Aceptar.
  5. Obtendrás el siguiente resultado
  6. Cierra los diálogos y guarda tu documento

Conclusión

Es conveniente que configures la seguridad de macros al nivel medio. De esta forma siempre puedes elegir si quieres que se puedan ejecutar o no las macros de los documentos.

Adjuntamos a este artículo un documento que contiene el módulo de macros creado y un ejemplo de macro llamada MiMacro, que símplemente escribe un texto en el documento abierto.

Asignar y quitar atajos de teclado.odt

Hemos visto cómo podemos asignar atajos de teclado a nuestras macros desde nuestras propias macros, eliminarlos, y lo más interesante, cómo podemos hacer para que se activen al abrir un documento con macros y que al cerrarlo se eliminen.

Ahora puedes dotar a tus plantillas y documentos de Writer, Calc, Impress, Draw o Base de atajos de teclado propios que se activen al abrirlos, y se eliminen al cerrarlos copiando tan sólo un módulo que es fácilmente adaptable y reutilizable a los mismos.

 

No hay reacciones, todavía


Form is loading...