> For the complete documentation index, see [llms.txt](https://visio-tricks.gitbook.io/workspace/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://visio-tricks.gitbook.io/workspace/primenenie-commandbars-v-visio-2010+.md).

# Применение CommandBars в Visio 2010+

В предыдущей статье перечислялись все способы запуска различных команд: программно и с помощью среды ShapeSheet. В этой статье подробно остановимся на применении коллекции **CommandBars**, так как применение объектов **UIObject** в настоящее время (2022 год) является очень архаичным т.к. в версиях с ленточным интерфейсом (2010+) это уже не работает.&#x20;

Коллекция **CommandBars** появилась в Visio в версии 2002. Несмотря на то что коллекция создавалась для версии с классическим интерфейсом она работает и в наши дни.

<figure><img src="/files/MowjOHIVs6a5WmQJvbP5" alt=""><figcaption><p>Рисунок 1 - Интерфейс MS Visio 2003 (классический)</p></figcaption></figure>

### Синтаксис вызова команд CommandBars <a href="#sintaksis-vyzova-komand-commandbars" id="sintaksis-vyzova-komand-commandbars"></a>

В предыдущей статье был приведен код и список команд коллекции **CommandBars**. На примере основной панели инструментов (**Standard Toolbar**) рассмотрим синтаксис программной эмуляции запуска команд с этой панели.

<figure><img src="/files/gMs2Y6yrdu8hU2lqq8EB" alt=""><figcaption><p>Рисунок 2 - Команды на панели инструментов Standard Toolbar</p></figcaption></figure>

Данная панель инструментов имеет порядковый номер 39 (содержит 22 кнопки), команда **Save** на этой панели имеет порядковый номер 3.

<figure><img src="/files/NYz8TNiqQoOrPkuCOYm1" alt=""><figcaption><p>Рисунок 3 - Фрагмент вывода команд коллекции CommandBars</p></figcaption></figure>

Таким образом вызов программно команды сохранения документа будет выглядеть так:

```vba
Set cm = Application.CommandBars(39) ' Standard : (39) : "Стандартная панель"
cm.Controls(3).Execute               ' Save     : (3)  : "Сохранить"
```

*В некоторых случаях может не совпадать порядок следования команд в выводе полученном из MS Visio с ленточным интерфейсом с порядком следования кнопок на панели инструментов в классических версиях Visio.*

В случае если кнопка на панели инструментов содержит выпадающий список команд, например выбрать из списка вариант форматирования линии *<mark style="color:purple;">Нет линии</mark>.* То к порядковому номеру контролла на панели, добавляется еще порядковый номер контролла на выпадающем списке.

```vba
Set cm = Application.CommandBars(40) ' Format : (40) : "Форматирование"
cm.Controls(18).Controls(1).Execute  ' NoLine : (18) : "Шаблон линии"  : (1) : "&Нет линий"
```

Более сложный случай описан в примере [Запуск надстройки «Нумерация фигур»](#zapusk-nadstroiki-numeraciya-figur).

### Используемые ссылки

{% embed url="<https://learn.microsoft.com/en-us/office/vba/api/visio.uiobject>" %}

{% embed url="<https://learn.microsoft.com/en-us/office/vba/api/visio.visuiobjsets>" %}

{% embed url="<https://learn.microsoft.com/en-us/office/vba/api/visio.application.builtintoolbars>" %}

{% embed url="<https://learn.microsoft.com/en-us/office/vba/api/visio.application.builtinmenus>" %}

### Примеры кода

<details>

<summary>Скрыть вкладку ленты</summary>

#### Код <a href="#hideribbon" id="hideribbon"></a>

```vba
Sub HideRibbon()
Dim tbs As ToolbarSet, app As Application
Set app = Application
app.ShowToolbar = False ' Hide Toolbar
app.ToolbarStyle = -1   ' Change Toolbar style
End Sub
```

</details>

<details>

<summary>Сделать фигуру без линий и заливки</summary>

#### Код <a href="#makenolinenofill" id="makenolinenofill"></a>

```vba
Sub MakeNoLineNoFill()
Dim cm As CommandBar
Set cm = Application.CommandBars(40)    '           : (40) : "Форматирование"
cm.Controls(18).Controls(1).Execute     ' NoLine    : (18) : "Шаблон линии" : (1) : "&Нет линий"
cm.Controls(17).Controls(2).Execute     ' NoFill    : (17) : "Цвет заливки" : (2) : "&Нет заливки"
End Sub
```

</details>

<details>

<summary>Управление настройкой внешнего вида окна Visio</summary>

#### Код <a href="#viewoptions" id="viewoptions"></a>

```vba
Sub ViewOptions()
Dim cm As CommandBar
Set cm = Application.CommandBars(45)    '           : (45)  : "Вид"
cm.Controls(1).Execute                  ' Ruler     : (1)   : "Линейки"
cm.Controls(2).Execute                  ' Grid      : (2)   : "Сетка"
End Sub
```

</details>

<details>

<summary>Вызов дополнительных окон</summary>

#### Код <a href="#showwin" id="showwin"></a>

```vba
Sub ShowWin()
Dim cm As CommandBar
Set cm = Application.CommandBars(45)    '           : (45) : "Вид"
cm.Controls(11).Execute                 ' DEW       : (11) : "Окно проводника по документам"
cm.Controls(13).Execute                 ' Layers    : (13) : "Свойства слоя"
End Subvb
```

</details>

<details>

<summary>Изменение активного инструмента рисования</summary>

#### Код <a href="#changedrawingtools" id="changedrawingtools"></a>

```vba
Sub ChangeDrawingTools()
Dim cm As CommandBar
Set cm = Application.CommandBars(58)    '           : (58)  : "Рисование"
cm.Controls(1).Execute                  ' Rectangle : (1)   : "Прямоугольник"
cm.Controls(3).Execute                  ' Line      : (3)   : "Линия"
End Sub
```

</details>

<details>

<summary>Запуск надстройки «Нумерация фигур»</summary>

#### Код <a href="#startaddon" id="startaddon"></a>

```vba
Sub StartAddon()
Dim cm As CommandBar, cmc As CommandBarControl, cc As CommandBarControl, cb As CommandBarControl
Set cm = Application.CommandBars(116)   '           : (116) : "Встроенные меню"
Set cmc = cm.Controls(20)               '           : (20)  : "&Надстройки"
Set cc = cmc.Controls(6)                '           : (6)   : "Дополнительные ре&шения Visio"
Set cb = cc.Controls(2)                 '           : (2)   : "&Нумерация фигур..."
cb.Execute
End Sub
```

</details>
