Author |
Topic |
|
evgenia_e
Germany
22 Posts |
Posted - 03/05/2004 : 13:32:08
|
У меня проблемы с группой. Я вызываю макрос из шейпа в группе, хочется, чтобы текст появлялся именно в том шейпе, из которго я вызываю этот макрос. Как мне в VBA обозначить активный шейп в группе? |
|
Tumanov
Russia
1198 Posts |
Posted - 03/05/2004 : 16:30:45
|
Что-то у меня тоже проблемы возникли :( Вот если бы группы не было, то шейп находится довольно легко. Если Вы "вызываете макрос из шейпа", то надо думать, что он у Вас в момент вызова селектирован. В этом случае шейп определяется через Window.Selection. Если он селектирован один, то получается Window.Selection(1). Но из группы такая операция не проходит. Коллекция Window.Selection пустая. При работе не с макросом, а с Add-on'ом шейп тоже легко определяется по параметрам командной строки. Например, если сделать простенький Add-on с пустой формочкой и обработчиком Private Sub Form_Load() MsgBox Command$ End Sub то при его вызове из формы мы увидим, например, /visio=4112323 /doc=1 /page=1 /shape-Sheet.7 То есть NameID шейпа легко берется из параметров. И из группы это тоже работает. Но в макрос командная строка не передается. Получается, нужно либо отказываться от групп, либо привлекать к работе Add-on. :) Или ждать, может кто умнее посоветует. |
|
|
evgenia_e
Germany
22 Posts |
Posted - 03/07/2004 : 17:48:07
|
Возникает встречный вопрос: я никогда не работала с Add-on-ами. Как его написать с помощью VBA и как получить параметры шейпа из которого этот addon вызывается? Как я понимаю, вызывается addon c помощью RUNADDONWARGS.
Спасибо! |
|
|
Tumanov
Russia
1198 Posts |
Posted - 03/07/2004 : 19:31:28
|
Add-on - это внешняя программа. Пишется, например, на VB. Можно на C, но VB больше похож на VBA, поэтому на нем будет проще. Можно взять Visual Studio, запустить VB и создать программку типа Standard EXE. Это и будет Add-on. EXE нужно будет положить в Solutions, чтобы не приходилось пути указывать. Вызывается он с помощью RUNADDON. Если использовать RUNADDONWARGS, то можно и еще дополнительные параметры передавать, но Вам и RUNADDON достаточно. Командная строка принимается из переменной Command$. Формат этой строки показан выше. Значения параметров doc и page - это индексы документа и страницы в коллекциях документов и страниц соответственно. Значение параметра shape - NameID. Чтобы работать с Visio в References проекта должно быть включено Microsoft Visio 2002 Type Library. Тогда в программе можно будет получить ссылку на Visio Set aV = GetObject(, "Visio.Application") и добраться до шейпа Set Shp = aV.Documents(docInd).Pages(pagInd).Shapes(shInd) А индексы получаются разбором командной строки с помощью Mid и InStr. Если скачать Microsoft Visio 2002 SDK, то там в качестве примера есть заготовка, демонстрирующая разбор командной строки и печать параметров. |
|
|
winnie
Russia
1 Posts |
Posted - 03/16/2004 : 19:56:47
|
Можно и без ADD-ON Надо сначала поиграться с .IterationMode объекта Selection
Set objSel = ActiveWindow.Selection objSel.IterationMode = visSelModeOnlySub shpName = objSel.Item(1).Name objSel.IterationMode = visSelModeOnlySuper grpName = objSel.Item(1).Name MsgBox "Выделен шейп " & shpName & vbCrLf & "в группе " & grpName
а по умолчанию .IterationMode равно visSelModeSkipSub + visSelModeSkipSuper
winnie |
|
|
MAVr
1 Posts |
Posted - 05/18/2004 : 11:43:29
|
Этот вариант работает, но у меня ситуация когда выделенный блок является членом группы, а группа сама является блоком для группы. Так вот используя последний пример на самом элементарном блоке я получаю только имя всего шейпа и имя его блока в группе, а получить имя выделенного блока не получается. Просветите чайника.
|
|
|
Tumanov
Russia
1198 Posts |
Posted - 05/18/2004 : 18:09:29
|
А что Вы называете блоком и как он соотносится с шейпом и группой? |
|
|
|
Topic |
|