Author |
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", ну и вторая строчка должна выглядеть по-другомк |
|
|
bdfy
Belarus
267 Posts |
Posted - 02/12/2009 : 11:13:53
|
обратную задачу я тоже не раз успешно решал :) только createObject сильно не советую - ибо создает новую копию программы при каждом запуске. а вот с визио... (( |
|
|
Tumanov
Russia
1198 Posts |
Posted - 02/12/2009 : 15:36:57
|
Не нравится CreateObject, используйте GetObject Set appVisio = GetObject(, "Visio.Application") |
|
|
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 - по идее верная запись. но не работает. в чем ошибка ? |
|
|
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. |
|
|
bdfy
Belarus
267 Posts |
Posted - 02/12/2009 : 19:26:17
|
получилось наконец таки ! :)) Set appVisio = GetObject(, "Visio.Application") appVisio.ActiveDocument.DataRecordsets.ItemFromID(1).Refresh
|
|
|
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 т.е таблиц три. и номера не по порядку... обращение к несуществующему номеру вызывает ошибку. как эти номера перебрать поизящней ? |
|
|
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() не работает. просит функцию обозначить. |
|
|
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 уже открыты. Если закрыты, то придется сначала открыть. |
|
|
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) уже отлажен в визио. имхо просто запустить этот скрипт было бы куда проще...
|
|
|
Tumanov
Russia
1198 Posts |
Posted - 02/13/2009 : 16:45:37
|
А если еще и visSpatialContain заменить на 2?
|
|
|
bdfy
Belarus
267 Posts |
Posted - 02/13/2009 : 16:57:47
|
аналогично. так можно долго отлаживать - это не выход (( |
|
|
Tumanov
Russia
1198 Posts |
Posted - 02/13/2009 : 17:24:43
|
Ну, это путь, предлагаемый Microsoft... И в общем-то, если действовать внимательно, то код переписывается довольно быстро. Отладки, как таковой, не требуется. Всего-то две вещи - корневые объекты и константы. Если, конечно, с событиями не связываться. |
|
|
bdfy
Belarus
267 Posts |
Posted - 02/13/2009 : 21:05:48
|
факт что не работает (( неужели нет способа просто запустить макрос из другого макроса ? |
|
|
bdfy
Belarus
267 Posts |
Posted - 02/14/2009 : 12:35:31
|
по идее должно через Run работать. appVisio.Run "Write_sxemas" object doesn't support this method (( несколько возможных вариантов синтаксиса я тоже перепробовал. |
|
|
Topic |
|