Тема: Как скрыть group по checkBox в своей вкладке
Скрыть group по checkBox в своей вкладке
Помогите с VBA, значение checkBox-а получаю, а скрыть/показать группу не могу.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Скрыть group по checkBox в своей вкладке
Помогите с VBA, значение checkBox-а получаю, а скрыть/показать группу не могу.
Никак. У группы нет динамического атрибута getVisible.
Никак. У группы нет динамического атрибута getVisible.
Куда же он делся?
Был вчера, проверил, и сегодня есть
Разобрался сам
XML
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="rxIRibbonUI_onLoad">
<ribbon>
<tabs>
<tab id="rxTrading" label=" Trading" >
<group id="rxDownloadStockData" label="Download Stock Data" >
<toggleButton id="rxEnableDisableDowwnload" onAction="rxToogleDownload" getLabel="rxEnableDisableDowwnload_Label" size="large"/> <button id="rxDownloadData_name" label="Download Names" onAction="rxDataStock_Name" getEnabled="rxDataStock_Enable"/>
<button id="rxDownloadData_xdate" label="Download Ex-Date" onAction="rxDataStock_XDate" getEnabled="rxDataStock_Enable"/>
<button id="rxDownloadData_dividend" label="Download Dividend" onAction="rxDataStock_Dividend" getEnabled="rxDataStock_Enable"/>
<button id="rxDownloadData_earning" label="Download Earning Date" onAction="rxDataStock_Earning" getEnabled="rxDataStock_Enable"/>
<button id="rxDownloadData_EOD" label="Download EOD Quote" onAction="rxDataStock_EOD" getEnabled="rxDataStock_Enable"/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
VB
Public g_blnStockDownLoad As Boolean
Public g_rxIRibbonUI As IRibbonUI
'Callback for rxEnableDisableDowwnload getLabel
Sub rxEnableDisableDowwnload_Label(control As IRibbonControl, ByRef returnedVal)
If g_blnStockDownLoad Then
returnedVal = "Disable Download"
Else
returnedVal = "Enable Download"
End If
End Sub
Public Sub rxDataStock_Name(control As IRibbonControl)
MsgBox "Do Download"
End Sub
Private Sub rxIRibbonUI_onLoad(ribbon As IRibbonUI)
Set g_rxIRibbonUI = ribbon
End Sub
'Callback for rxEnableDisableDowwnload onAction
Sub rxToogleDownload(control As IRibbonControl, pressed As Boolean)
g_blnStockDownLoad = pressed
g_rxIRibbonUI.Invalidate
End Sub
Sub rxDataStock_Enable(control As IRibbonControl, ByRef returnedVal)
If g_blnStockDownLoad Then
returnedVal = True
Else
returnedVal = False
End If
End Sub
Всем всем ответившим большое спасибо
Прошу прощения, что ввёл в заблуждение: давненько не брал шашек в руки. Вот решение:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="onLoad">
<ribbon startFromScratch="false">
<tabs>
<tab id="TabTest" label="Управление видимостью группы">
<group id="gr1" label="Управление">
<checkBox id="chbShowHide"
onAction="onAction"
getLabel="getLabel"
getPressed="getPressed"/>
</group>
<group id="gr2" label="Группа" getVisible="getVisible" >
<checkBox id="cb1" />
<checkBox id="cb2" />
<checkBox id="cb3" />
<checkBox id="cb4" />
<checkBox id="cb5" />
<checkBox id="cb6" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>
Option Explicit
Dim myribbon As IRibbonUI
Dim bShowHide As Boolean
' (компонент: customUI, атрибут: onLoad), 2007
Sub onLoad(ribbon As IRibbonUI)
Set myribbon = ribbon
End Sub
'chbShowHide (компонент: checkBox, атрибут: onAction), 2007
'chbShowHide (компонент: checkBox, атрибут: onAction), 2010
Sub onAction(control As IRibbonControl, pressed As Boolean)
bShowHide = pressed
myribbon.InvalidateControl "gr2"
myribbon.InvalidateControl control.ID
End Sub
'chbShowHide (компонент: checkBox, атрибут: getLabel), 2007
'chbShowHide (компонент: checkBox, атрибут: getLabel), 2010
Sub getLabel(control As IRibbonControl, ByRef label)
label = IIf(bShowHide, "Скрыть", "Показать")
End Sub
'chbShowHide (компонент: checkBox, атрибут: getPressed), 2007
'chbShowHide (компонент: checkBox, атрибут: getPressed), 2010
Sub getPressed(control As IRibbonControl, ByRef pressed)
pressed = bShowHide
End Sub
'gr2 (компонент: group, атрибут: getVisible), 2007
'gr2 (компонент: group, атрибут: getVisible), 2010
Sub getVisible(control As IRibbonControl, ByRef visible)
visible = bShowHide
End Sub
Пример во вложении. Вот так это работает:
P.S. Не заметил, что уже решение найдено. Но пусть и моё будет.
Есть: 10 checkBox открывающих\скрывающих 10 групп
При открытие нескольких групп лента становиться перегруженной
Вопрос:
А вот как открывая одну группу по checkBox, закрыть все остальные, уже открытые группы?
Есть: 10 checkBox открывающих\скрывающих 10 групп
При открытие нескольких групп лента становиться перегруженной
Вопрос:
А вот как открывая одну группу по checkBox, закрыть все остальные, уже открытые группы?
Может быть у кого-нибудь появилась идея?
Прикрепляю пример с тремя флагами и группами.
Спасибо, то, что надо.
Коллеги, доброго дня!
viter.alex,
подскажите, почему эти функции в любом файле *.docm работают отлично, а в Normal.dotm - нет?
Ругается словами
"Object variable or With block variable not set"
на вторую строку (myribbon.InvalidateControl "gr2") функции onAction:
Sub onAction(control As IRibbonControl, pressed As Boolean)
bShowHide = pressed
myribbon.InvalidateControl "gr2"
myribbon.InvalidateControl control.ID
End Sub
Коды XML и VBA из Вашего примера полностью перенесены в Normal.dotm без каких-либо изменений.
Distant, видимо код скопирован не без ошибок. По какой-то причине не срабатывает событие onLoad. Во-первых, нужно включить отображение ошибок пользовательского интерфейса (в англ. версии это Options→Advanced→Show add-in user interface errors).
Во-вторых, обратите особое внимание на строку
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="onLoad">
Удачи
Прикрепляю пример с тремя флагами и группами.
Эта штука мне очень помогла, но есть проблемы с обновлением состояния:
MyRibbon.InvalidateControl id_control
Если в каком-то макросе произошла ошибка, то потом вышеуказанный код начинает порождать ошибку Object variable or With block variable not set, пока не перезагрузишь Word. Может есть какое-то решение?
...произошла ошибка...код начинает порождать ошибку Object variable or With block variable not set, пока не перезагрузишь Word...
При ошибке, Word сбрасывает переменные, потому и ошибка
Либо, используйте On Error, что бы код не прерывался. В готовом проекте так и должно быть.
Либо, сохраняйте где-то переменную, а потом восстанавливайте. В случае с объектами, переменная - это указатель. Надо использовать CopyMemory.
Александр Б. пишет:...произошла ошибка...код начинает порождать ошибку Object variable or With block variable not set, пока не перезагрузишь Word...
При ошибке, Word сбрасывает переменные, потому и ошибка
Либо, используйте On Error, что бы код не прерывался. В готовом проекте так и должно быть.
Либо, сохраняйте где-то переменную, а потом восстанавливайте. В случае с объектами, переменная - это указатель. Надо использовать CopyMemory.
На тему сохранения состояния Ribbon'а после загрузки с возможностью восстановления Ron de Bruin изложил на странице внешняя ссылка. Правда, примеры на странице приведены для Excel, но для Word также можно что-нибудь придумать, напр., сохранять указатель в переменной Word в документе (DocVariable), либо во внешнем файле. Методика основана на CopyMemory и при этом учтено, что возможна работа под VBA7.
...возможна работа под VBA7...
Кстати, для проверки совместимости 32 и 64, есть специальная мелкософтовская утилита OCCI (Office Code Compatibility Inspector)
Решил пока не возиться с WinAPI, а понапихать везде On Error Resume Next с последующей проверкой:
If Err.Number <> 0 Then
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться