All Forums
 Категория Visio
 Форум Вопросы и ответы
 Работа с Visio из внешнего макроса (в Excel)
Next Page
Author Previous Topic Topic Next Topic

bdfy

Belarus
267 Posts

Posted - 02/11/2009 :  18:10:20
есть некоторый код в екселе. по его завершении я хочу обновить данные на схеме в визио и результат сбросить в картинку. вот только как сослаться на файл визио грамотно под VBA ?
Application.ActiveDocument.DataRecordsets.ItemFromID(1).Refresh
"Application.ActiveDocument" надо видимо обьявить както.
пробовал вот так. не работает ((
Set Visio = GetObject("G:\file.vsd")

For i = 0 To 2
Visio.DataRecordsets.ItemFromID(i).Refresh
Next

zhuravsky

Russia
115 Posts

Posted - 02/12/2009 :  05:07:35
Решал обратную задачу (из Визио в Эксель) примерно таким образом:

Dim ExcelApp as Object
...
Set ExcelApp = CreateObject("Excel.Application")
ExcelApp.Workbooks.Open FileName
ExcelApp.Visible = True
...
полагаю вам нужно нечто подобное написать в Экселе. Попробуйте заменить "Excel.Application" на "Visio.Application", ну и вторая строчка должна выглядеть по-другомк
Go to Top of Page

bdfy

Belarus
267 Posts

Posted - 02/12/2009 :  11:13:53
обратную задачу я тоже не раз успешно решал :) только createObject сильно не советую - ибо создает новую копию программы при каждом запуске. а вот с визио... ((
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 02/12/2009 :  15:36:57
Не нравится CreateObject, используйте GetObject
Set appVisio = GetObject(, "Visio.Application")
Go to Top of Page

bdfy

Belarus
267 Posts

Posted - 02/12/2009 :  16:23:52
бр. не решает это задачу. есть открытый ексель файл. есть открытый файл в визио. работать из визио с екселем просто
Set Excel = GetObject("G:\!file.xls")
Set ExWs = Excel.Worksheets("list")
A = ExWs.Cells(1, 1)

а наоборот ?
Set Visio = GetObject("G:\file.vsd") работает. возращает имя файла. а дальше ?
Visio.DataRecordsets.ItemFromID(0).Refresh - по идее верная запись. но не работает. в чем ошибка ?
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 02/12/2009 :  17:54:03
Сравните, что я написал
GetObject(, "Visio.Application")
И что написали Вы
GetObject("G:\file.vsd")
В Visio первый аргумент никогда не использовался.
Set appVisio = GetObject(, "Visio.Application")
Notice the comma, which indicates that the first argument to GetObject—a path to a disk file—has been omitted. The comma is required, because under some circum-stances, GetObject takes a file name as its first argument. To retrieve a Visio instance;
however, you must omit the file name argument, or an error will occur. For details, see GetObject in your Microsoft Visual Basic documentation.
Go to Top of Page

bdfy

Belarus
267 Posts

Posted - 02/12/2009 :  19:26:17
получилось наконец таки ! :))
Set appVisio = GetObject(, "Visio.Application")
appVisio.ActiveDocument.DataRecordsets.ItemFromID(1).Refresh
Go to Top of Page

bdfy

Belarus
267 Posts

Posted - 02/12/2009 :  19:31:53
вопрос правда остался... как обновить сразу все связи.
Пробовал записать. получил.
appVisio.ActiveDocument.DataRecordsets.ItemFromID(1).Refresh
appVisio.ActiveDocument.DataRecordsets.ItemFromID(3).Refresh
appVisio.ActiveDocument.DataRecordsets.ItemFromID(6).Refresh
т.е таблиц три. и номера не по порядку... обращение к несуществующему номеру вызывает ошибку. как эти номера перебрать поизящней ?
Go to Top of Page

bdfy

Belarus
267 Posts

Posted - 02/13/2009 :  11:11:13
попытался еще один скрипт переписать чтобы работал из внешнего макроса (так удобней)
quote:
Sub Write_sxemas()


sxema = 2

name_box = "sx_" & sxema
Set vs = ActivePage.Shapes(name_box).SpatialNeighbors(visSpatialContain, 0.2, 0)
N = vs.Count
If N > 0 Then
ActiveWindow.DeselectAll
For Each sh In vs
ActiveWindow.Select sh, visSelect
Next
ActiveWindow.Selection.Export "G:\pic" & ".gif"

End If


End Sub

В визио работает отлично. как это запустить в екселе большой вопрос... может есть способ запускать макрос из другого макроса ?
appVisio.ActiveDocument.Call Write_sxemas()
appVisio.Call Write_sxemas()
не работает. просит функцию обозначить.
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 02/13/2009 :  16:20:28
quote:
т.е таблиц три. и номера не по порядку... обращение к несуществующему номеру вызывает ошибку. как эти номера перебрать поизящней ?

Visio 2007 сейчас под рукой нет, поэтому проверить не могу... Но скорее всего, как и у всякой коллекции, у DataRecordsets есть свойство Count. Вот по этому счетчику и перебирать. И добираться не через ItemFromID, а непосредственно по индексу DataRecordsets(i).
--------
quote:
попытался еще один скрипт переписать чтобы работал из внешнего макроса (так удобней)

В VBA ссылках на объекты часто опускается корневой объект Application. Это немного запутывает.
На самом деле ссылка ActiveWindow выглядит как Application.ActiveWindow.
Ваша задача вместо этого Application подставить appVisio, которое Вы получали выше в этом топике. Вот и почти все переделки.
Второе место - это ActivePage примерно так же надо дотянуть до корневого объекта. Будет appVisio.ActivePage.Shapes... и т.д.
Естественно, если нужный документ и страница в Visio уже открыты. Если закрыты, то придется сначала открыть.
Go to Top of Page

bdfy

Belarus
267 Posts

Posted - 02/13/2009 :  16:31:23
Set vs = appVisio.ActivePage.Shapes(name_box).SpatialNeighbors(visSpatialContain, 0.2, 0)

Automation error получаю... хотя аналогичный код (без appVisio) уже отлажен в визио. имхо просто запустить этот скрипт было бы куда проще...
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 02/13/2009 :  16:45:37
А если еще и visSpatialContain заменить на 2?
Go to Top of Page

bdfy

Belarus
267 Posts

Posted - 02/13/2009 :  16:57:47
аналогично. так можно долго отлаживать - это не выход ((
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 02/13/2009 :  17:24:43
Ну, это путь, предлагаемый Microsoft...
И в общем-то, если действовать внимательно, то код переписывается довольно быстро. Отладки, как таковой, не требуется.
Всего-то две вещи - корневые объекты и константы. Если, конечно, с событиями не связываться.
Go to Top of Page

bdfy

Belarus
267 Posts

Posted - 02/13/2009 :  21:05:48
факт что не работает (( неужели нет способа просто запустить макрос из другого макроса ?
Go to Top of Page

bdfy

Belarus
267 Posts

Posted - 02/14/2009 :  12:35:31
по идее должно через Run работать.
appVisio.Run "Write_sxemas"
object doesn't support this method (( несколько возможных вариантов синтаксиса я тоже перепробовал.
Go to Top of Page
Previous Topic Topic Next Topic  
Next Page
Данный сайт является архивом форума visio.artberg.ru, который был закрыт в связи с переходом на новую платформу visio.getbb.ru
Все материалы доступны только для чтения! Если у вас появились вопросы, или вы хотите что-то обсудить, связанное с Visio, обращайтесь на новый форум!
Архив был создан благодаря совместным усилиям Генадия Туманова @Tumanov (visio.artberg.ru), Александра ака @Surrogate (visio.getbb.ru), и Николая Белых @nbelyh (unmanagedvisio.com)