# Применение 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>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://visio-tricks.gitbook.io/workspace/primenenie-commandbars-v-visio-2010+.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
