есть у меня некий
мастер-шейп для работы со спецификацией.
Он состоит:
собственно из шапки спецификации и надписей в ней:
Headряда групп строк:
row1,
row2, …
row30каждая N-ная группа строк состоит из 9 шейпов имеющих имена:
N.1,
N.2, …
N.9был у меня некий код (см. столбец слева), для обращения к шейпам внутри данного мастер-шейпа.
Я знал о возможности обращения к шейпу, находящемуся внутри группы
Код:
set sh = ActivePage.Shapes.Item("Спецификация").Shapes.Item("row1")
Но была проблема с формированием имени вложенного шейпа, благодаря моему другу
Евгени мне удалось отвязаться от строковых переменных переменных с именами. Для сравнения код справа
Код: Sub var1() Dim r As Integer Dim target As Shape Dim c As Integer Dim main As Shape ' шейп - основная группа Dim rw As Shape ' шейп - группа «Строка.N» Dim rn As String ' имя шейп - группа «Строка.N» Set main = ActivePage.Shapes.Item("Спецификация") Dim SSS As Shapes ' подмножество шейпов основной группы Dim tn As String ' имя целевого шейпа Set SSS = main.Shapes For r = 1 To 30 rn = "row" & r Set rw = SSS.Item(rn) For c = 1 To 9 tn = r & "." & c Set target = rw.Shapes.Item(tn) Next c Next r End Sub | Код: Sub var2() Dim r As Integer Dim target As Shape Dim c As Integer For r = 1 To 30 For c = 1 To 9 tn = r & "." & c Set target = ActivePage.Shapes.Item("Спецификация").Shapes.Item("row" & r).Shapes.Item("" & r & "." & c) Next c Next r End Sub
|
суть в том, что в скобках в имени шейпа слева должна быть часть заключенная в кавычки (как в приведенном справа примере "row" и "") и далее используя символ объединения строк
& можно сформировать нужное имя шейпа
Благодаря все тому же
Евгени я отказался от такой формы определения шейпа используя
Selection(1)Код:
Dim Mast As Master
Dim pg As Page
dim sh as Shape
Set pg = ActivePage
Set Mast = ActiveDocument.Masters.Item("Спецификация")
pg.Drop Mast, 0, 0
set sh = ActiveWindow.Selection(1)
Код:
Dim Mast As Master
Dim pg As Page
Dim sh as Shape
Set pg = ActivePage
Set Mast = ActiveDocument.Masters.Item("Спецификация")
set sh = pg.Drop Mast, 0, 0
немного поэкспериментировав, я обнаружил что можно без промежуточных переменных - шейпов, назначать переменной шейп находящийся внутри вытаскиваемого на лист шейпа
Код:
Dim pg As Page, sh As Shape
Dim shpd As Master
Set shpd = ActiveDocument.Masters.Item(1)
Set pg = ActivePage
Set sh = pg.Drop(shpd, 0, 0).Shapes.Item(3)
sh.Shapes.Item(3).Text = "1456" ' заменяем текст третьего шейпа находящегося внутри шейпа sh
sh.Shapes.Item(4).Text = "123" ' заменяем текст четвертого шейпа находящегося внутри шейпа sh
Если нужно изменить
одно значение в ячейках шейпшита
Код:
Dim pg As Page
Set pg = ActivePage
Dim shpd As Master, sh As Shape
Set shpd = ActiveDocument.Masters.Item(1)
pg.Drop(shpd, 2, 5).Cells("height").FormulaU = 1
' сразу после вытаскивания на лист изменяем высоту вытащенного шейпа
Set shpd = ActiveDocument.Masters.Item(13)
pg.Drop(shpd, 1, 1).Shapes.Item("razr").Cells("prop.row_2").Formula = """Pushkin"""
' сразу после вытаскивания на лист изменяем свойство prop.row_2 в шейпе с именем razr внутри вытащенного шейпа
PS спустя почти 2 года наткнулся в сети на ссылку со стареньким SDK
Using Compound Object ReferencesYou can concatenate Visio object references, properties, and methods in single statements, as you can with Microsoft® Visual Basic® for Applications (VBA) objects. However, simple references are sometimes more efficient, even if they require more lines of code.
For example, the following statement refers to the first shape on the third page of the first open document in a Visio instance:
Код:
Set shpObj = Documents(1).Pages(3).Shapes(1)
Executing this statement retrieves one objectthe
Shape object assigned to shpObj. Compare the following series of statements that use simple object references:
Код:
Set docObj = Documents.Item(1)
Set pagsObj = docObj.Pages
Set pagObj = pagsObj.Item(3)
Set shpsObj = pagObj.Shapes
Set shpObj = shpsObj.Item(1)
Running these statements retrieves five objects: a
Document object, a
Pages collection, a
Page object, a
Shapes collection, and a
Shape object. References to these objects are assigned to variables and are available for other uses, unlike the previous example. If your program will eventually need access to these intermediate objects, your code will be easier to read and maintain if you retrieve them all in this way.