Кнопка включения ленты VBA по выбору - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь выяснить, как я могу включить кнопку ленты на основе Selection, я знаю, что мне нужно использовать событие Worksheet_SelectionChange, но я не знаю, как действовать дальше. Я исчерпал все варианты, глядя на то, как это сделать, может кто-нибудь помочь с этим, пожалуйста, я спросил на г-н Excel, но нет ответов на то, что мне нужно. Пример того, что я ищу:

Если выбран столбец, активируйте кнопку ленты a или. Если выбран ряд, то нажмите кнопку ленты b

.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Это то, что у меня есть, но я все еще новичок.

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="OnRibbonLoad">

<ribbon>

<tabs>

<tab id="MyTools" label="Tools">

<group id="MoveGroup" label="Move" tag="GroupMove" >

<button id="MoveColumnLeft" tag="EnableLeft" imageMso="GoRtl" screentip="Move Column Left" supertip="Move the selected column to the left" label="Left" size="large" onAction="OnActionButton" getEnabled="GetEnabled" />

<button id="MoveColumnRight" tag="EnableRight" imageMso="GoLeftToRight" screentip="Move Column Right" supertip="Move the selected column to the right" label="Right" size="large" onAction="OnActionButton" getEnabled="GetEnabled" />

        `<separator id="MoveSep" />`

<button id="MoveRowUp" tag="EnableUp" imageMso="MessagePrevious" screentip="Move Row Up" supertip="Move the selected row up" label="Up" size="large" onAction="OnActionButton" getEnabled="GetEnabled" />

<button id="MoveRowDown" tag="EnableDown" imageMso="MessageNext" screentip="Move Row Down" supertip="Move the selected row down" label="Down" size="large" onAction="OnActionButton" getEnabled="GetEnabled" />

</group>

</tab>

</tabs>

</ribbon>

</customUI>

Option Explicit

Public oRibbon As IRibbonUI, bEnabled As Boolean

Sub OnRibbonLoad(ribbon As IRibbonUI)

Set oRibbon = ribbon
bEnabled = True

End Sub

Sub OnActionButton(control As IRibbonControl)

Select Case control.ID
    Case "MoveColumnLeft"
        bEnabled = enabled
        oRibbon.Invalidate
    Case "MoveColumnRight"
        bEnabled = enabled
        oRibbon.Invalidate
    End Select

End Sub

Sub GetEnabled(control As IRibbonControl, ByRef enabled)

`Select Case control.ID
    Case "MoveColumnLeft"
        enabled = enabled
    Case "MoveColumnRight"
        enabled = enabled
End Select

End Sub

0 голосов
/ 26 апреля 2018

Используйте обратные вызовы ленты и вызывайте IRibbonUI.Invalidate или IRibbonUI.InvalidateControl , где это необходимо. См. Как получить ссылку на IRibbonUI в VBA? для получения дополнительной информации.

Пользовательский интерфейс ленты можно настроить с помощью процедур обратного вызова в макросах VBA или надстройках COM. Для каждого из обратных вызовов, которые реализует надстройка, ответы кэшируются. Например, если средство записи надстроек реализует процедуру обратного вызова getImage для кнопки, функция вызывается один раз, изображение загружается, а затем, если требуется обновить изображение, вместо вызова процедуры используется кэшированное изображение. , Этот процесс остается на месте до тех пор, пока код не сообщит, что кэшированные значения недопустимы с помощью метода Invalidate, после чего процедура обратного вызова снова вызывается и ответ возвращается в кэш. Макросы надстройки или VBA могут затем принудительно обновить пользовательский интерфейс, вызвав метод Refresh.

В вашем XML-файле пользовательского интерфейса вам нужно объявить обратный вызов onLoad:

<customUI … onLoad=”MyAddInInitialize” …>

А затем в VBA вы можете использовать:

Dim MyRibbon As IRibbonUI
Sub MyAddInInitialize(Ribbon As IRibbonUI)
   Set MyRibbon = Ribbon
End Sub

Sub myFunction()
   ‘ Invalidates the caches of all of this add-in’s controls 
   MyRibbon.Invalidate()            
End Sub

Подробнее о пользовательском интерфейсе Fluent (также известном как Ribbon UI) читайте в следующих статьях:

...