Для русскоязычных пользователей Visio. Начинающих и профессионалов. Где взять, как сделать, что купить и т.д.

Обработка текста

Программная работа с текстом в Visio отличается от работы с другими элементами тем, что текст не виден в шейп-листе. Начинающих это обескураживает. Все видно, а текста нет.

Программист может использовать для доступа к тексту шейпа либо свойство Text шейпа (Shape.Text), либо свойство Text объекта Characters (Shape.Characters.Text).

Первый способ попроще, но и возможностей у него меньше. Он работает с текстом в целом.

Второй способ позволяет работать с отдельными фрагментами текста, в том числе задавать им разное форматирование.

В общем-то, это основное, что нужно помнить, остальное можно посмотреть в справке.

Перечень литературы

28.03.2021  Visio has some interesting Characters   johnvisiomvp    

06.11.2015  Simple Macros in Microsoft Visio with the Macro Recorder   David Parker    

20.10.2004  Processing Text in Visio   Mai-lan   (англ.) Работа с текстом в Visio 

Ответы на вопросы

Переключение скрытого текста

Переключение скрытого текста  

Sub hidden() If ActiveDocument.Styles("Скрытый").Font.hidden = False Then ActiveDocument.Styles("Скрытый").Font.hidden = True Else ActiveDocument.Styles("Скрытый").Font.hidden = False End If End Sub  

Если в документе существует текст, выполненный стилем "Скрытый", то данный макрос переключает его отображение. Большой документ при этом, естественно, дергается, что не очень удобно.  

Как программно отформатировать текст в шейпе?

Как программно отформатировать текст в шейпе используя несколько шрифтов?  

Все параметры шейпов в Visio отображаются и меняются в шейп-листе (ShapeSheet). Если не знаете, как сделать что-то программно, делайте это вручную и смотрите, как это отражается в шейп-листе. Потом пытайтесь внести такое же изменение в ячейку шейп-листа программно. Например. Рисуем на листе только один квадрат, пишем в нем 1234567890. Открываем шейп лист. Находим секцию Character (на будущее). Теперь на листе рисунка красим текст в красный цвет. В шейп листе тут же в ячейке Color секции Character появляется 2 (номер красного цвета). Делаем вывод - если записать в ячейку Color значение 2, текст станет красным. Проверяем. Отменяем ручные изменения и выполняем макрос  

Sub ttt() ActivePage.Shapes(1).Cells("Char.Color").Result("") = "2" End Sub  

Убеждаемся, что текст после этого макроса опять становится красным. Точно также можно работать и с другими атрибутами секции Character: Font, Size, Scale и т.д. Примечание. Если в одном шейпе текст имеет разное форматирование (например 3 буквы красные, потом 5 синих), то в секции Character это будет отражено двумя строчками и можно менять параметры каждой группы текста отдельно. Больше групп - больше строчек. Однако, если первоначально текст был отформатирован одинаково (в секции была только одна строка), то возникнет проблема. В документации прямо указывается, что добавление и удаление строк из четырех секций запрещено (visSectionCharacter, visSectionParagraph, visSectionTextField, or visSectionTab). Так что хорошо бы заранее готовить шейпы с нужным числом строк. Если известно, что в каком-то типе шейпа может понадобиться менять форматирование фрагмента текста - взять и подправить мастер-шейп, то-есть внести несколько строк в секцию еще на уровне мастер-шейпа. Будет специальный мастер. А на рисунке уже работать с подготовленными секциями. Вот только разметка позиций будет фиксированной. Еще один кривой вариант - работать с группой. В принципе наверно можно иметь несколько шейпов-текстовых блоков, менять их размер в зависимости от введенного текста (типа Width = GUARD(EVALTEXT(TheText)) и позиционировать один за другим. Тогда каждый будет управляться сам по себе, а выглядеть это будет как одна текстовая строка (сам не пробовал, но почему бы не работать). Некоторые эффекты получаются с использованием ячеек Scale и Transparency. То есть фрагмент текста можно сделать невидимым и сжать, а когда нужно развернуть.  

Пример работы с текстом и файлами.

Я никогда не программировала для Visio и, чтобы разобраться как это делается, не поможете ли с программой для примера. В открытом документе по указанию на какой-либо допустим квадратик (double-click?), берется его подпись (может activePage.Shapes.Text ?), открывается другой более общий файл visio, находится там квадратик с тем же текстом, увеличивается просмотр с центром экрана на этом квадратике. Заранее спасибо.  

Sub ttt() s0 = ActiveWindow.Selection.Item(1).Text Dim docObj As Visio.Document Dim selObj As Visio.Selection Dim winObj As Window Set docObj = Documents.Open("C:\FileБолееОбщий.vsd") Set pagObj = docObj.Pages(1) For i = 1 To pagObj.Shapes.Count s = pagObj.Shapes(i).Text If (InStr(s, s0) > 0) Then Set winObj = ActiveWindow winObj.Select pagObj.Shapes(i), visSelect + visDeselectAll px = winObj.Selection.Item(1).Cells("PinX") py = winObj.Selection.Item(1).Cells("PinY") winObj.SetViewRect px - 1, py + 1, 5, 5 MsgBox ("pX= " & px & " pY= " & py) End If Next End Sub  

Двойной щелчок по любому из квадратиков загружает более общий файл, находит в нем шейпы с похожим текстом и позиционирует на них окно. MsgBox пишет координаты шейпа (и тормозит программу на время просмотра). После выполнения макроса "Более общий" файл закрыть вручную (забыл Close написать)  

Помогите подсчитать программно сколько в тексте на шейпе wrapped строк.

Помогите подсчитать программно сколько в тексте на шейпе wrapped строк.  

Вот такая штуковина  

Sub ttt() s = ActivePage.Shapes(1).Text i = 1 While i > 0 i = InStr(i, s, vbLf) + 1 MsgBox i - 1 Wend End Sub  

Вот по такому тексту шейпа Раз строка Два строка Три строка Говорит последовательно: 11, 22, 0. То есть переводы строк на 11, 22 позиции, а больше нету.  

Как подсчитать получившееся количество строк при заполнении шейпа текстом?

При добавлении текста на прямоугольник получается автоматический перенос строк(wrap) по ширине шейпа. Вопрос состоит в подсчете получившегося количества строк, независимо от нажатий при вводе этого текста.  

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

TEXTHEIGHT(shapename!TheText,maximumwidth)  

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

Как программно изменить размер и выравнивание шрифта в шейпе?

Подскажите pls как программно изменить размер и выравнивание шрифта в шейпе и как пользоваться стилями? Пишу Set shpObj = pagObj.DrawRectangle(2, 8, 6, 9) shpObj.Text = "Hello World!" shpObj.TextStyle = "Arial 24pt centered" Ошибка: стиль задан неверно!  

А Вы создали предварительно стиль с таким названием? Этот способ работает с уже имеющимися стилями. Создать новый стиль и изменить шрифт - это совершенно разные вещи. Изменить шрифт легко. Вот эти две строчки сделают размер шрифта 6 pt и выравняют параграф по центру. Для этого стилей создавать не нужно.  

Sub tty() ActivePage.Shapes(1).Cells("Char.Size").Formula = "=6 pt." ActivePage.Shapes(1).Cells("Para.HorzAlign") = 1 End Sub  

А создавать новый стиль лучше все-таки вручную, а программно его только применять. То, что Вы пытались показать в примере, это только применение стиля.  

Как менять несколько надписей сразу?

Требуется, чтобы при изменении одного текста на листе менялось также несколько надписей. Нашел почти подходящий шейп в Organization Chart (Position и др.), но он, при помощи метода create synchronized copy создает связанные предметы только для разных листов. Можно ли этот метод как-то использовать для простых объектов? Заранее спасибо.  

А может попроще? Вставить в зависимые шейпы поле вот с такой формулой (в данном случае ссылка на шейп Sheet.1). И то, что появится в Sheet.1, будет транслироваться в эти шейпы.  

=ShapeText(Sheet.1!TheText)  

Как менять несколько надписей сразу 2?

1.Создаю прямоугольник с текстом внутри. (тут вопросы: Нужно ли его помещать в shapes и если да то для мастера менять свойства? Дальше куда - в custom properties в format или открыть shape list? куда эту формулу =ShapeText(Sheet.1!TheText) вставлять) 2.Копирую его по всему листу(документу) и хочу, что бы при изменении текста внутри любого (можно одного главного) везде текст также менялся.  

1) Создаете прямоугольник. 2) Когда он выделен либо нажимаете F2, либо 2-м нажатием левой кн. мыши. 3) Далее нажимаете правой кнопкой мыши и выбираете Insert Field...(Вставка поля...) 4) В появившемся окне в Category(Категория) выберите Custom Formula(Другая формула). 5) И в строке снизу введите необходимую формулу. Вот и все.  

Как программно прижать текстовый блок коннектора к одному из концов?

Как программно прижать текстовый блок коннектора к одному из концов. Пожалуйста, помогите.  

Например, так.  

Sub Text_position() Dim shpObj As Visio.Shape Set pagsObj = ThisDocument.Pages Set pagObj = pagsObj.Item(1) Set selectObj = ActiveWindow.Selection Set shpObj = ActiveWindow.Selection.Item(1) Set celObj1 = shpObj.Cells("TxtPinX") 'назначаем ячейку Set celObj2 = shpObj.Cells("TxtPinY") 'назначаем ячейку celObj1.Formula = "Width*1" 'прижимаем к низу celObj2.Formula = "Height*1" 'прижимаем к низу celObj1.Formula = "Width*0" 'прижимаем к верху celObj2.Formula = "Height*0" 'прижимаем к верху End Sub  

Отображается прямоугольник OBJ вместо текста шейпа

Имеется два шейпа. В одном в виде текста отображается значение свойства Prop.Row_1. Если для второго шейпа использовать Shape2.Text=Shape1.Text, то вместо текста появляется прямоугольник OBJ. Как добиться того, чтобы Shape2.Text был точно такой же как и Shape1.Text?  

Дело в том, что в первом шейпе вместо чистого текста использовано поле, ссылающееся на ячейку данных. В таком случае ссылка .Text работает некорректно. Нужно использовать Shape.Characters.Text. Например так  

ActivePage.Shapes(2).Text = ActivePage.Shapes(1).Characters.Text  

 

Подскажите пожалуйста как записать текст из shp.text в ячейку свойств?

Строка  

.Cells("Prop.ShapeNumberText").FormulaForceU = shp.Text  

пишет только если shp.text - число. Она кстати ещё убирает "0" если он есть перед числом. Можно ли как-то их сохранить (01, 001)?  

shp.Cells("Prop.Prop1").FormulaForceU = shp.Text  

вызывает ошибку #NAME?  

При записи строки в формулу нужно добавлять дополнительные кавычки, то есть  

.FormulaForceU = Chr(34) & shp.Text & Chr(34)  

При этом и нули появятся.