Вопрос по key-bindings, excel, shortcut, excel-vba, hotkeys, vba – Excel VBA для перечисления привязок клавиш (OnKey?)

6

Я работаю с большим набором сценариев Excel vba, и некоторые из них связаны с комбинациями клавиш Ctrl.

Я знаю, как настроить по одному в пользовательском интерфейсе для Excel: разверните список сценариев vba (Alt-F8), выберите сценарий и нажмите «Параметры». Затем вы можете привязать / отменить привязку скрипта к комбинации клавиш Ctrl. Однако к одному и тому же ключу можно привязать несколько сценариев, и Excel выберет один (вероятно, первый найденный каким-либо образом) и проигнорирует другие привязки.

Итак, я хочу назначить Ctrl-e для сценария, но сначала я должен найти, из каких других сценариев в настоящее время он связан, из списка из сотен сценариев.

Есть ли способ заставить Excel перечислить текущие привязки клавиш (я полагаю, с макросом VBA)? Я видел решение для Word, которое рассматривает "»Комбинация клавиш коллекция. Это не работает в Excel, хотя. Есть ли в Excel другой объект?

(1) Приоритет - это сначала любая настройка из VBA с использованием метода OnKey, а затем любые привязки, установленные в параметрах макросов (Alt-F8) (они, кажется, выбираются в непредсказуемом порядке, если один ключ был привязан к нескольким макросам. ) и, наконец, ключ найдет егодефолт" обязательный, если есть. Mark Goldfain
Я определил два полезных факта: Mark Goldfain
(2) Если кто-то использует VBA и метод OnKey для привязки ключа, это, по крайней мере, не может сказаться на непредсказуемом поведении при множественных назначениях, которое преследует подход Alt-F8. Каждый раз, когда выполняется привязка OnKey, он очищает любые другие привязки для того же ключа. Mark Goldfain

Ваш Ответ

2   ответа
4

назначенные макросу, с помощью макроса VBA. Оказывается, хотя сочетание клавиш не может быть доступно "непосредственно»Если вы экспортируете модуль, любая комбинация клавиш указывается в экспортированном файле. Затем этот файл можно проанализировать, чтобы получить имя процедуры и соответствующую клавишу быстрого доступа.

Строка в экспортированном файле, содержащая эту информацию, выглядит следующим образом:

атрибутMacroShortCutKeys.VB_ProcData.VB_Invoke_Func = "a14"

Информация, выделенная жирным шрифтом выше, является именем макроса и соответствующей сочетания клавиш. Я неЯ не знаю значения 14 в конце (и я не уверен, что он будет последовательным, поскольку я не проверял это всесторонне).

Для запуска приведенного ниже макроса необходимо установить параметр Доверительный доступ к объектной модели проекта VBA в настройках Центра управления безопасностью; а также что вы устанавливаете ссылки в VBA, как указано в коде.

Я только что вывел результаты в окно Immediate, но вы также можете легко поместить его на рабочий лист.

Экспортированный файл хранится в папке C: \ Temp, и файл будет удален, когда мы закончим с этим. Если C: \ Temp не существует, вам придется его создать. (Это можно было сделать в макросе, но я ленился).

Если у макроса нет сочетания клавиш, он не будет указан в списке.

РЕДАКТИРОВАТЬ В этой подпрограмме перечислены только те ярлыки, которые были назначены с помощью диалогового окна «Макрос» на листе Excel. Он НЕ будет перечислять сочетания клавиш, которые были назначены с помощью метода Application.OnKey. Пока не уверен, как их получить.

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
Такой хакерский; Я люблю это! as9876
4

сех привязок клавиш.

Однако, если вы хотите выяснить, какая процедура выполняется по ярлыку, но выне уверен и неЕсли вы не хотите просматривать вашу личную рабочую книгу, надстройки и т. д., вы можете создать динамическую точку останова, которая всегда будет останавливаться на первой строке исполняемого кода VBA. Для этого просто используйтеAdd Watch В диалоговом окне (щелкните правой кнопкой мыши где-нибудь в окне кода) введите следующие параметры:

Затем просто выполните ярлык, который выВы заинтересованы - и VBE покажет вам рутину, которая связана с этим ...

Brilliant. Я задавался вопросом, было ли в Excel какое-либоотлаживать все Режим. Не то, что я знаю из. Но это довольно ловко, и может быть де-фактоотлаживать все ". Mark Goldfain

Похожие вопросы