![]() |
Форум visio.getbb.ru |
О форумах
Библиотека | Частые вопросы | Литература | Склад материалов Visio Navigator | Blog | Полезные ссылки | О сайте История Visio | Продукты Visio |
Для русскоязычных пользователей Visio. Начинающих и профессионалов. Где взять, как сделать, что купить и т.д. |
Отчеты - важный инструмент Visio, позволяющий быстро выбрать и оформить данные, находящиеся в документе Visio, в виде таблицы на поле документа или отдельного файла.
Ручные операции с отчетами довольно хорошо раскрыты в справке Visio и множестве обучающих статей. Но помимо этого существует и возможность программного запуска отчетов. А вот эта возможность описана гораздо хуже. Я бы сказал, что она вообще толком не документирована. Частично эта тема раскрывается в статье Отчеты Visio Геннадия Туманова
.20.03.2019
28.12.2018
03.08.2009
15.10.2006
Подсчет количества элементов
Имеется рисунок с большим количеством элементов порожденных 10-20 мастерами. Требуется посчитать количество элементов порожденных конкретным мастером. При добавлении поля в произвольный sheet функция ID считает общее количество всех sheet на странице включая саму себя. Может есть способ указать в ID имя конкретного мастера.
Буду рад, если кто-то меня опровергнет, но кажется на уровне ShapeSheet эта задача не имеет решения, так как в ячейке можно дать любую ссылку, но нельзя последовательно опросить множество Shape. И функция ID дает не количество, а номер последнего Shape, который только иногда совпадает с количеством. Зато на программном уровне задача решается очень легко. Например: - рисуем на листе единственный квадрат (для вывода результатов); - вводим в документ макрос вот такого вида:
Sub ttt() s1 = "" For i = 1 To ActivePage.Shapes.Count s1 = s1 + "Name= " + ActivePage.Shapes(i).Name s1 = s1 + " Id= " + Str(ActivePage.Shapes(i).ID) + vbCrLf Next ActivePage.Shapes(1).Text = s1 End Sub
- и подцепляем его к нашему квадрату через Format/Behavior/Double-Click/RunMacro/TchisDocument.ttt Теперь при двойном щелчке по этому квадрату наша функция будет последовательно опрашивать все имеющиеся на листе Shapes и писать в качестве текста их имена и ID. На этот лист можно набросать много мастеров или нарисовать Shape и двойным щелчком по первому квадрату обновить их список. Ну, а если мы можем собрать список имеющихся шейпов, то после небольшой модификации можем его рассортировать или подсчитать экземпляры нужных мастеров. Одна беда - как только появляются макросы, Visio будет приставать со своими предупреждениями (хотя это можно и отключить).
Выполнение предопределенного отчета в Visio
Как это сделать вручную, есть информация. А можно ли его вызвать из VBA?
Можно. На эту тему есть статья "Отчеты Visio" - https://visioport.ru/blog/index.php/2-otchety-visio
Запуск отчета из VBA
Столкнулся с такой проблемой - не получается запустить отчет о фигурах, если файл с отчетом лежит в папке, где в названии есть пробел. Если в названиях папок нет пробелов, то все запускается. Это какой то баг или фича? А можно сначала сохранить файл отчета в документ и потом уже оттуда запускать? Макрекордером не получилось записать сохранение отчета в документ.
1. Описание отчета сохраняется в файле документа в ячейке User.visPropRpt1 шейп-листа документа. В принципе, через эту ячейку его можно как читать, так и писать макросом. Если отчетов несколько, то имя будет немного изменяться. 2. Если в имени папки или файла с определением отчета есть пробел, то путь к файлу должен заключаться в двойные кавычки. Например, так:
Application.Addons("VisRpt").Run ("/rptDefName=""C:\temp\INV INV.VRD"" /rptOutput=Excel_Shape")
3. Но это еще не все. Если запускать отчет из Program Files, то и кавычки не помогут. C:\Program Files\Microsoft Office\root\Office16\1049\INVENTRY.VRD Помимо пробела здесь сказывается система защиты Windows, не разрешающая простому пользователю такое действие. Но если запустить Visio от имени администратора, а потом открыть нужный документ и выполнить макрос запуска отчета, то все будет нормально. Администратору можно.