Иногда возникает необходимость выбрать некоторое подмножество шейпов на странице Visio. Сам поиск проблемой не является, но нужно ведь еще отобразить его результат, причем так, чтобы и пользователю было удобно, и рисунок не испортить. Особенно в том случае, когда найденных шейпов много и они разбросаны по всей странице.

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

  • текстовое сообщение;
  • селектирование;
  • добавление маркера;
  • подкраска.

Постановка задачи

Речь идет о методах Drop и DropMany в Visio.

expression.Drop(ObjectToDrop, xPos, yPos)

Мы знаем, что в качестве ObjectToDrop может выступать как мастер, так и шейп, размещенный на странице. А в справке можно прочесть такую фразу: "If ObjectToDrop is a Master, the pin of the master is dropped at the specified coordinates". По логике - если объект является не мастером, а шейпом, то его может забросить совсем в другое место. Вот этой особенности и посвящена данная статья.

Общие сведения

(По мотивам сообщения пользователя Machestro в http://visio.getbb.ru/viewtopic.php?f=29&t=1429).

Обычно Excel по отношению к Visio рассматривается в качестве источника данных. Тем не менее, обратный канал тоже существует. Он используется либо для формирования отчетов по документам Visio, либо при двусторонней синхронизации данных с источником. Для формирования отчетов как правило используется либо штатный формирователь отчетов, либо специализированные программные решения, создаваемые под конкретную задачу. Причем возможности формирователя отчетов достаточно ограничены.

Однако с появлением в Power Query функции доступа к архивированным файлам (см. http://sql10.blogspot.com/2016/06/reading-zip-files-in-powerquery-m.html) Visio получает еще один и очень неплохой способ формирования отчетов. Ведь если документ Visio представляет собой пакет из нескольких заархивированных XML файлов, а Power Query способен выбирать данные из XML, в том числе и из нескольких файлов, то нет препятствий к тому, чтобы пользователь Excel получил доступ к данным из файла Visio. Причем для этого даже не требуется установленный Visio. Только файл документа и Power Query.

Если макрос делается не для одного документа, то рано или поздно придется столкнуться с задачей его обновления. Пришла в голову умная мысль, улучшили макрос в одном из документов и возникает вопрос - а что делать с остальными? В них-то тоже хорошо бы провести изменение. Иногда задача еще усложняется - документы могут быть разбросаны по разным машинам и даже по разным организациям.

Конечно все можно сделать вручную. Разослать всем сообщения с указанием, что нужно изменить, и пусть меняют сами. Если не умеют, то придется сопроводить более или менее подробной инструкцией. Пользователям это обычно не нравится.