una teclas teclado onkey metodo macro ejemplos delete cómo combinación atajo asignar application excel excel-vba shortcut key-bindings hotkeys

excel - teclas - sendkeys vba ejemplos



Excel VBA para enumerar enlaces de teclas(OnKey?) (2)

Estoy trabajando con un gran conjunto de scripts de Excel vba y algunos de ellos están sujetos a combinaciones de teclas Ctrl.

Sé cómo configurar uno a la vez en la interfaz de usuario para Excel: abra la lista de scripts vba (Alt-F8), seleccione un script y haga clic en Opciones. Luego puede vincular / desvincular la secuencia de comandos a una combinación de teclas Ctrl. Sin embargo, puede vincular más de un script a la misma clave, y Excel elegirá uno (probablemente el primero que encuentre de alguna manera) e ignorará los otros enlaces.

Entonces, quiero asignar Ctrl-e a una secuencia de comandos, pero primero tengo que encontrar a qué otras secuencias de comandos está enlazado actualmente, de una lista de cientos de secuencias de comandos.

¿Hay alguna manera de hacer que Excel muestre los enlaces de teclas actuales (supongo que con una macro de VBA)? He visto una solución para Word, que examina la colección "KeyBindings". Sin embargo, esto no funciona en Excel. Excel tiene un objeto diferente?


Después de buscar por un tiempo, no pude encontrar ninguna posibilidad de obtener programáticamente una lista de todas las asociaciones de teclas.

Sin embargo, si básicamente desea averiguar qué procedimiento se ejecuta en un acceso directo, pero no está seguro y no desea rastrear a través de su Libro de trabajo personal, Complementos, etc., puede crear un punto de interrupción dinámico que siempre se detiene en la primera línea del código VBA ejecutado. Para hacer esto, simplemente use el cuadro de diálogo Add Watch (haga clic derecho en algún lugar de la ventana de código) ingrese los siguientes parámetros:

Luego, simplemente ejecute el acceso directo que le interesa, y el VBE le mostrará la rutina que está vinculada a él ...


Puede enumerar las claves asignadas a una macro con una macro VBA. Resulta que aunque no se puede acceder a la tecla de acceso directo "directamente", si exporta un módulo, cualquier tecla de método abreviado aparece en el archivo exportado. Ese archivo se puede analizar para devolver el nombre del procedimiento y la tecla de acceso directo asociada.

La línea en el archivo exportado que tiene esta información se ve así:

Atributo MacroShortCutKeys .VB_ProcData.VB_Invoke_Func = " a / n14"

La información en negrita anterior es el nombre de una macro y la tecla de atajo asociada. No sé el significado de / n14 al final (y no estoy seguro de si será consistente, ya que no lo he probado exhaustivamente).

Ejecutar la macro a continuación requiere que establezca la opción Confiar en el acceso al modelo de objetos del Proyecto VBA en la configuración del Centro de confianza; y también que establece referencias en VBA como figuran en el código.

Acabo de enviar los resultados a la ventana Inmediato, pero también podría ponerlos fácilmente en una hoja de trabajo.

El archivo exportado se almacena en una carpeta C: / Temp y el archivo se elimina cuando terminamos. Si C: / Temp no existe, tendrá que crearlo. (Eso podría haberse hecho en la macro, pero me puse perezoso).

Si una macro no tiene una tecla de método abreviado, no aparecerá en la lista.

EDITAR La rutina solo muestra los accesos directos que se asignaron utilizando el cuadro de diálogo Macro en la hoja de trabajo de Excel. NO enumerará las teclas de método abreviado que se asignaron utilizando el método Application.OnKey. Aún no estoy seguro de cómo conseguirlos.

Option Explicit ''MUST set to Trust Access to the VBA Project Object Model '' in Excel Options ''Set reference to: ''Microsoft Visual Basic for Applications Extensibility ''Microsoft Scripting Runtime ''Microsoft VBScript Regular Expressions 5.5 Sub MacroShortCutKeys() Dim VBProj As VBIDE.VBProject Dim VBComp As VBIDE.VBComponent Dim CodeMod As CodeModule Dim LineNum As Long Dim ProcKind As VBIDE.vbext_ProcKind Dim sProcName As String, sShortCutKey As String Const FN As String = "C:/Temp/Temp.txt" Dim S As String Dim FSO As FileSystemObject Dim TS As TextStream Dim RE As RegExp, MC As MatchCollection, M As Match Set RE = New RegExp With RE .Global = True .IgnoreCase = True .Pattern = "Attribute/s+(/w+)/.VB_ProcData/.VB_Invoke_Func = ""(/S+)(?=//)" End With Set FSO = New FileSystemObject Set VBProj = ActiveWorkbook.VBProject For Each VBComp In VBProj.VBComponents Select Case VBComp.Type Case Is = vbext_ct_StdModule VBComp.Export FN Set TS = FSO.OpenTextFile(FN, ForReading, Format:=TristateFalse) S = TS.ReadAll TS.Close FSO.DeleteFile (FN) If RE.Test(S) = True Then Set MC = RE.Execute(S) For Each M In MC Debug.Print VBComp.Name, M.SubMatches(0), M.SubMatches(1) Next M End If End Select Next VBComp End Sub