1

Тема: Как скрыть group по checkBox в своей вкладке

Скрыть group по checkBox в своей вкладке

Помогите с VBA, значение checkBox-а получаю, а скрыть/показать группу не могу.

2

Re: Как скрыть group по checkBox в своей вкладке

Никак. У группы нет динамического атрибута getVisible.

Лучше день потерять — потом за пять минут долететь!

3

Re: Как скрыть group по checkBox в своей вкладке

viter.alex пишет:

Никак. У группы нет динамического атрибута getVisible.

Куда же он делся?
Был вчера, проверил, и сегодня есть

4

Re: Как скрыть group по checkBox в своей вкладке

Разобрался сам

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 

Всем всем ответившим большое спасибо

5

Re: Как скрыть group по checkBox в своей вкладке

Прошу прощения, что ввёл в заблуждение: давненько не брал шашек в руки. Вот решение:

<?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

Пример во вложении. Вот так это работает:
Как скрыть group по checkBox в своей вкладке

P.S. Не заметил, что уже решение найдено. Но пусть и моё будет.

Post's attachments

maindoc.docm 20.29 Кб, 12 скачиваний с 2011-11-25 

You don't have the permssions to download the attachments of this post.
Лучше день потерять — потом за пять минут долететь!

6

Re: Как скрыть group по checkBox в своей вкладке

Есть: 10 checkBox открывающих\скрывающих 10 групп
При открытие нескольких групп лента становиться перегруженной
Вопрос:
А вот как открывая одну группу по checkBox, закрыть все остальные, уже открытые группы?

7

Re: Как скрыть group по checkBox в своей вкладке

AlexRom пишет:

Есть: 10 checkBox открывающих\скрывающих 10 групп
При открытие нескольких групп лента становиться перегруженной
Вопрос:
А вот как открывая одну группу по checkBox, закрыть все остальные, уже открытые группы?

Может быть у кого-нибудь появилась идея?

8

Re: Как скрыть group по checkBox в своей вкладке

Прикрепляю пример с тремя флагами и группами.

Post's attachments

Doc1.docm 21.21 Кб, 19 скачиваний с 2012-08-13 

You don't have the permssions to download the attachments of this post.
Макросы под заказ и готовый пакет - mtdmacro.ru

9

Re: Как скрыть group по checkBox в своей вкладке

Спасибо, то, что надо.

10

Re: Как скрыть group по 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 без каких-либо изменений.

11

Re: Как скрыть group по checkBox в своей вкладке

Distant, видимо код скопирован не без ошибок. По какой-то причине не срабатывает событие onLoad. Во-первых, нужно включить отображение ошибок пользовательского интерфейса (в англ. версии это Options→Advanced→Show add-in user interface errors).
Во-вторых, обратите особое внимание на строку

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="onLoad">

Удачи

Лучше день потерять — потом за пять минут долететь!

12

Re: Как скрыть group по checkBox в своей вкладке

Вождь пишет:

Прикрепляю пример с тремя флагами и группами.

Эта штука мне очень помогла, но есть проблемы с обновлением состояния:

MyRibbon.InvalidateControl id_control

Если в каком-то макросе произошла ошибка, то потом вышеуказанный код начинает порождать ошибку Object variable or With block variable not set, пока не перезагрузишь Word. Может есть какое-то решение?

Мой шаблон/макросы для автоматической нумерации Word 2003, 2007, 2010 и т.д. (стили, названия, перекрестные ссылки, LISTNUM). Делюсь: http://vk.com/club_alex_bir

13

Re: Как скрыть group по checkBox в своей вкладке

Александр Б. пишет:

...произошла ошибка...код начинает порождать ошибку Object variable or With block variable not set, пока не перезагрузишь Word...

При ошибке, Word сбрасывает переменные, потому и ошибка smile

Либо, используйте On Error, что бы код не прерывался. В готовом проекте так и должно быть.

Либо, сохраняйте где-то переменную, а потом восстанавливайте. В случае с объектами, переменная - это указатель. Надо использовать CopyMemory.

Макросы под заказ и готовый пакет - mtdmacro.ru

14

Re: Как скрыть group по checkBox в своей вкладке

Вождь пишет:
Александр Б. пишет:

...произошла ошибка...код начинает порождать ошибку Object variable or With block variable not set, пока не перезагрузишь Word...

При ошибке, Word сбрасывает переменные, потому и ошибка smile

Либо, используйте On Error, что бы код не прерывался. В готовом проекте так и должно быть.

Либо, сохраняйте где-то переменную, а потом восстанавливайте. В случае с объектами, переменная - это указатель. Надо использовать CopyMemory.

На тему сохранения состояния Ribbon'а после загрузки с возможностью восстановления Ron de Bruin изложил на странице внешняя ссылка. Правда, примеры на странице приведены для Excel, но для Word также можно что-нибудь придумать, напр., сохранять указатель в переменной Word в документе (DocVariable), либо во внешнем файле. Методика основана на CopyMemory и при этом учтено, что возможна работа под VBA7.

15

Re: Как скрыть group по checkBox в своей вкладке

yshindin пишет:

...возможна работа под VBA7...

Кстати, для проверки совместимости 32 и 64, есть специальная мелкософтовская утилита OCCI (Office Code Compatibility Inspector)

Макросы под заказ и готовый пакет - mtdmacro.ru

16

Re: Как скрыть group по checkBox в своей вкладке

Решил пока не возиться с WinAPI, а понапихать везде On Error Resume Next с последующей проверкой:

If Err.Number <> 0 Then
Мой шаблон/макросы для автоматической нумерации Word 2003, 2007, 2010 и т.д. (стили, названия, перекрестные ссылки, LISTNUM). Делюсь: http://vk.com/club_alex_bir