Консультация № 185234
20.01.2012, 22:10
204.10 руб.
0 5 1
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
Существует некий документ Word, в который вставлен рисунок Visio? В документе Word есть таблица , и на рисунке Visio есть данные из этой таблицы, но не в табличном формате. Задача: посоветуйте- пгомогите как сделать так, чтобы при заполнении таблицы, менялись данные в рисунке Visio? это надо на работе срочно, я понимаю что контрл С - контр В не отменял никто, но работы очень много и она такая муторная и хотелось бы её сделать быстрее и забыть. Адрес эл почты: hmyr_@mail.ru не знаю как здесь прикрепить файл для наглядного примера если чего - почту указал спасибо експертам заранее

Обсуждение

давно
Профессор
230118
3054
21.01.2012, 00:38
общий
21.01.2012, 04:14
Set Visio to automatically refresh the data in a drawing

Open the drawing that contains the data that you want to refresh.
On the Data menu, click Refresh Data.
In the Refresh Data dialog box, select one or more data sources.
Select the Show this dialog box on file open check box.
Click Configure.
In the Configure Refresh dialog box, under Automatic Refresh, select the Refresh every check box, and then click the arrows to choose an interval.
То есть в свойствах рисунка есть опция автоматического обновления данных. Попробуйте, надеюсь, что получится.
Неизвестный
23.01.2012, 11:56
общий
Адресаты:
на сколько понял я, то требуется не просто "перерисовать" объект Visio, вставленный в Word, а необходимо, чтобы при изменении таблицы в Word менялись надписи на рисунке Visio. Т.е. получается нужно программно открыть документ visio, изменить текст в нужном элементе, а потом "перерисовать" рисунок в файле Word.
Неизвестный
23.01.2012, 11:58
общий
выложите файл на любой файлообменник, а я его добавлю в вопрос
Неизвестный
23.01.2012, 13:51
общий
файлик высланный пользователем mazdacx7
Прикрепленные файлы:
6d0ccb77dea15068240c309ed5158573.doc
Неизвестный
25.01.2012, 23:26
общий
это ответ
Здравствуйте, mazdacx7!
Во вложении файл Word с макросом, который берет текст из таблицы (выделен красным) и вставляет его в текст одного из шейпов во встроенном объекте Visio (также выделен красным).
Основная проблема в определении номера таблицы и номера шейпа в Visio. Если таблиц не много, то можно и посчитать, иначе потребуется какое-то другое решение (например, ТАКОЕ). С шейпом все несколько сложнее, т.к. в обычном режиме Visio можно через меню вызвать окно свойств, в заголовке которого есть имя шейпа (имя можно использовать вместо ID, только вводится оно в двойных кавычках), но тут это меню недоступно. В коде есть закомментированый цикл, который позволяет посмотреть все непустые подписи к шейпам и при этом содержит ID шейпа - можно использовать что-то похожее.

По аналогии с представленным кодом можно сделать связь других полей и подписей в объектах.
Остается выбрать способ, которым будут обновляться данные на объектах (например, при сохранении документа или его открытии), но тут выбор за Вами.

Код с комментариями продублирован в приложении.

Приложение:
Sub Main()
'объявляем переменные
' таблица, строка из таблицы, встроенный объект
Dim myTable As Table, myString As String, myObject As Object, i As Long
'присваиваем значение (13 - порядковый номер таблицы в документе)
Set myTable = ActiveDocument.Tables(13)
'считываем в переменну значение из ячейки (5 - строка, 6 - столбец)
'считываем всю строку кроме последнего символа - символа конца ячейки
myString = Left(myTable.Cell(5, 6).Range, Len(myTable.Cell(5, 6).Range) - 1)

'активируем OLE-объект с номером 1 (первый вставленный объект)
ThisDocument.InlineShapes(1).OLEFormat.Activate
'присваиваем значение переменной объекта
Set myObject = ThisDocument.InlineShapes(1).OLEFormat.Object
'изменяем текстовую подпись объекта с номером 52 на строку из таблицы
myObject.Application.ActivePage.Shapes(52).Text = myString

'цикл для получения всех номеров объектов с непустой подписью
'For i = 1 To myObject.Application.ActivePage.Shapes.Count
'If myObject.Application.ActivePage.Shapes(i).Text <> "" Then
'MsgBox "Object ID: " & i & vbCrLf & myObject.Application.ActivePage.Shapes(i).Text
'End If
'Next i
End Sub
Прикрепленные файлы:
Форма ответа