Эта статья не содержит открытий, а больше похожа на запись "для памяти". Чтобы, когда понадобится, можно было быстренько вспомнить и подключить к документу Visio риббон с пользовательской вкладкой.

Постановка задачи. Имеется документ с макросами; задача - добавить вызов макросов из риббона.

В районе 2007-2010 с появлением риббона было несколько публикаций на тему, как добавить к нему свою вкладку. Практически все они основывались на интерфейсе IRibbonExtensibility и подключении пользовательского риббона в момент открытия документа.

Однако с появлением в Visio 2013 нового (пакетного) формата файлов появилась возможность намертво связать пользовательский риббон с документом, просто навсегда включить его в состав документа. Получается простая и компактная конструкция, которой вполне достаточно, чтобы управлять несколькими макросами.

Недавно в форуме возник вопрос - почему не отображается изменение данных в окне Shape Data Window. Рассматривалась вот такая конструкция.

Страница имеет 4 поля данных. По замыслу переключение значения в поле Show/Hide All должно переключать видимость остальных трех полей.Цепочка событий:

  • изменяем Show на Hide в окне Shape Data;
  • значение ячейки User.HideAll изменяется с FALSE на TRUE;
  • значение ячеек Invisible трех остальных полей переключается в TRUE;
  • поля A, B, C в окне Shape Data становятся скрытыми.

Так вот, пользователь заметил, что такая конструкция на уровне шейпа работает, как и задумано, а вот на уровне страницы поведение сильно отличается.

 

Недавно потребовалось сделать смарт-шейп... Такой весь из-себя управляемый данными. И формулы получались довольно сложными. Вот например, есть список типов

принтер;МФУ;копир;сканер;терминал;инж.сист.;факс;дупликатор

и задание к нему - в зависимости от типа отображать одну из 5 картинок. В итоге требование вылилось вот в такую формулу с вложенными IF, OR и STRSAME.

IF(STRSAME(Prop._VisDM_Тип_устр,"Принтер",1),4,IF(STRSAME(Prop._VisDM_Тип_устр,"Инж.сист.",1),3,IF(OR(STRSAME(Prop._VisDM_Тип_устр,"Сканер",1),STRSAME(Prop._VisDM_Тип_устр,"Факс",1)),2,IF(OR(STRSAME(Prop._VisDM_Тип_устр,"МФУ",1),STRSAME(Prop._VisDM_Тип_устр,"Копир",1),STRSAME(Prop._VisDM_Тип_устр,"Дупликатор",1)),1,0))))

Написал, проверил - получил ошибку. Исправил - опять ошибка. Ну невозможно сходу и без ошибок создать такое.

 

В предыдущей статье Функция FILENAME() и все такое я рассказывал о конструкции из формул шейп-листа, в которой формулы выстраивались в своего рода логическую цепочку и должны были срабатывать одна за другой. Кстати, цепочка была замкнутой, что еще интереснее. Но так как наши представления о последовательности выполнения формул не всегда соответствуют действительности, возникло желание каким-то образом посмотреть реальную последовательность.

Итак, имеем исходный документ (VSDX), в котором прописаны несколько связанных формул в шейп-листе документа и ссылающаяся на него формула в единственном шейпе на странице. Повторю картинку-схему.