У меня есть схема, в которой текст Visio (состоящий из линейной формы) расположен неправильно. Вместо середины он падает далеко вправо.
Вместо этого я хотел бы, чтобы все они были сосредоточены.
Поскольку я совершенно не знаком с VBA Visio, я записал макрос, чтобы обойти основные свойства кода в этих обстоятельствах.
В моем коде VBA указано, что каждая фигура имеет свой идентификатор, который трудно отличить от других точечных фигур. Поскольку мне удалось в значительной степени определить диапазон идентификаторов фигур, необходимых для моей цели, с помощью этого потока:
Я решил использовать код только для тех фигур, у которых ID выше конкретного значения. К сожалению, следующий код:
Sub SLDalter()
Dim DiagramServices As Integer
DiagramServices = ActiveDocument.DiagramServicesEnabled
ActiveDocument.DiagramServicesEnabled = visServiceVersion140 + visServiceVersion150
Dim UndoScope As Long
UndoScope = Application.BeginUndoScope("Modify Control")
With Application.ActiveWindow.Page.Shapes.ItemFromID(>1104)
.CellsSRC(visSectionControls, 0, visCtlX).FormulaU = "Width*0.6"
.CellsSRC(visSectionControls, 0, visCtlY).FormulaU = "Height*1"
End With
Конец сабвуфера
Не работает.
Я пробовал и другие решения, такие как:
http://visguy.com/vgforum/index.php?topic=887.0
https://bvisual.net/2021/01/02/reference-visio-shapes/
но они тоже не работали.
Как выполнить пакетное перемещение текста с помощью простого кода VBA в Visio?
ОБНОВЛЯТЬ:
Благодаря этому запросу мне удалось получить идентификатор формы и тип.
Как получить тип фигуры в Visio с помощью VBA?
а ситуация выглядит так:
Теперь я хотел выбрать их все в соответствии с этим запросом: http://visguy.com/vgforum/index.php?topic=6685.0
с кодом следующим образом:
Sub Eselde()
Dim Vshp As Visio.Shape
Dim IP As Long
For Each Vshp In ActivePage.Shapes
If Vshp.Name Like "*Fibre Cable" Then
.CellsSRC(visSectionControls, 0, visCtlX).FormulaU = "Width*0.6"
.CellsSRC(visSectionControls, 0, visCtlY).FormulaU = "Height*1"
End If
Next
End Sub
но в строке:
.CellsSRC(visSectionControls, 0, visCtlX).FormulaU = "Width*0.6"
Я получаю сообщение об ошибке:
Недействительная или неполная ссылка
Интересно, почему этот код не может работать в этих обстоятельствах, тогда как он работал для одного идентификатора.
ОБНОВЛЕНИЕ II:
Я заметил, что после такого подхода:
Dim Vshp As Visio.Shape
For Each Vshp In VPage.Shapes
If Vshp.Name = "Fibre Cable" Then
Debug.Print Vshp.ID & " - " & Vshp.Master.Name
End If
Next
End Sub
учитывается только первая фигура, тогда как у меня не менее 30.
Вы снова придумываете код. В двух строках, начинающихся с «.CellsSRC», используйте «Vshp.CellsSRC».
Откуда вы взяли строчку кода «Если Vshp.Name Like «*Fibre Cable» Then»? В VBA нет If... Like... Then!
Загрузите и просмотрите Visio SDK. Полный пример кода VBA.
@PaulHerber, почему? Я использовал его несколько раз в VBA Excel





Пожалуйста, попробуйте этот код
Sub bbb()
Dim sl As Selection, ShpObj As Shape, vl As Single
Set sl = ActivePage.CreateSelection(visSelTypeByLayer, , "Connector") ' create selection from 'Connector' layer
For Each ShpObj In sl ' iterate items in selection
vl = ShpObj.CellsSRC(visSectionControls, 0, visCtlX) - 1 ' get X text position coordinate to left per inch
ShpObj.CellsSRC(visSectionControls, 0, visCtlX).FormulaU = Chr(34) & vl & Chr(34) ' move text position
Next
End Sub
Как этот код работает на моей стороне.

Обновлено
Интересно, почему этот код не может работать в этих обстоятельствах, тогда как он работал для одного идентификатора.
Пожалуйста, добавьте префикс к переменной формы, например Vshp.CellsSRC(visSectionControls, 0, visCtlX).FormulaU = "Width*0.6"
К сожалению, это не работает, я думаю, что хотел бы иметь что-то с опцией ItemFromID
Я попробовал ваш код, но похоже, что он не соответствует моим идентификаторам фигур.
Да, это разъемы. Я знаю, что это должно быть целое число, но я хотел бы иметь условие, которое определяло бы их использование, когда идентификатор выше, чем, например, 1104.
Не могу ли я установить такие условия, как если ID выше, чем что-то?
@Geographos - вы не можете составить грамматику кода по мере продвижения. Посмотрите примеры кода из Visio SDK.
Обновил мой запрос, сможете ли вы помочь на этот раз?
Да, я хочу переместить их всех на фиксированное расстояние