Форум пользователей Visio

Форум по вопросам применения и программирования в Visio
Текущее время: 24 ноя 2017, 00:39

Часовой пояс: UTC + 3 часа [ Летнее время ]


Правила форума


При размещении файлов предпочтительным является формат vsd (а не vsdx/vsdm)



Начать новую тему Ответить на тему  [ Сообщений: 48 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: 2 банальных вопроса
СообщениеДобавлено: 14 апр 2017, 13:16 
Не в сети
Новичок

Зарегистрирован: 07 апр 2017, 10:18
Сообщений: 32
Использую Visio c: 2013
Отрасль: АСУТП
Уровнь квалификации: Чуть выше среднего
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
Добрый день, уважаемые специалисты!

Взахлеб изучаю форум, однако ввиду моих довольно скудных знаний о vba и shape sheet, многие очень банальные вопросы продолжают оставаться для меня вопросами. Поэтому прошу сильно не пинать.

Вопросы следующие:
1. Предположим в shape sheet документа создана user-define переменная User.DocFormat. Как из VBA произвести в нее запись текстового значения?
При выполнении кода:
Код:
Application.ActiveDocument.DocumentSheet.Cells("User.DocFormat") = 2
в ячейку благополучно записывается 2.
Однако если выполнить:
Код:
Application.ActiveDocument.DocumentSheet.Cells("User.DocFormat") = "aaa"
получаю type mismatch
2. Предположим имеется файл visio с подключенным листом excel, через стандартный мастер "Данные - Настраиваемый импорт", соответственно появляется окно "Внешние данные". Так вот если в этом окне на закладке базы кликнуть правой кнопкой мыши и выбрать "Свойства", то открывается следующее окно:
Изображение
Вопрос следующий: как то возможно из VBA считать значения "Общее число строк" и "Связанные строки"?
Первое значение пока получаю так:
Код:
Dim vsoDataRecordset As Visio.DataRecordset
Dim intCount As Integer
Dim lngRowIDs() As Long
Dim AllRowCount As Integer
intCount = ThisDocument.DataRecordsets.Count
Set vsoDataRecordset = ThisDocument.DataRecordsets(intCount)
lngRowIDs = vsoDataRecordset.GetDataRowIDs("")
AllRowCount = UBound(lngRowIDs) + 1
но это не очень удобно, возможно есть способ попроще. А второе значение вообще не знаю как получить.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: 2 банальных вопроса
СообщениеДобавлено: 14 апр 2017, 13:23 
Не в сети
Administrator

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 3362
Откуда: оттуда
Использую Visio c: 1998
Отрасль: Связь
Должность: Бывший проектировщик
Уровнь квалификации: ShapeSheet, VBA
lite.fun писал(а):
получаю type mismatch
для передачи строковых значений в визио их нужно в тройные кавычки запихивать. и использовать свойство Formula
Код:
Application.ActiveDocument.DocumentSheet.Cells("User.DocFormat").Formula = """aaa"""


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: 2 банальных вопроса
СообщениеДобавлено: 14 апр 2017, 13:42 
Не в сети
Administrator

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 3362
Откуда: оттуда
Использую Visio c: 1998
Отрасль: Связь
Должность: Бывший проектировщик
Уровнь квалификации: ShapeSheet, VBA
lite.fun писал(а):
как то возможно из VBA считать значения "Общее число строк" и "Связанные строки"?
Первое значение пока получаю так:
да, слишком много лишнего. собственно количество записей вроде так можно получить
Код:
intCount = ThisDocument.DataRecordsets.Count


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: 2 банальных вопроса
СообщениеДобавлено: 14 апр 2017, 14:23 
Не в сети
Ветеран

Зарегистрирован: 30 июл 2014, 14:28
Сообщений: 433
Использую Visio c: 2008
Очков репутации: 97

Добавить очки репутацииУменьшить очки репутации
Цитата:
да, слишком много лишнего. собственно количество записей вроде так можно получить

Ну, скорей вот так:
Код:
Sub CountRows()
Dim lngRowIDs() As Long, AllRowCount As Integer

With ThisDocument
    lngRowIDs = .DataRecordsets(.DataRecordsets.Count).GetDataRowIDs("")
End With

AllRowCount = UBound(lngRowIDs) + 1

End Sub


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: 2 банальных вопроса
СообщениеДобавлено: 14 апр 2017, 15:01 
Не в сети
Ветеран

Зарегистрирован: 30 июл 2014, 14:28
Сообщений: 433
Использую Visio c: 2008
Очков репутации: 97

Добавить очки репутацииУменьшить очки репутации
А насчет связанных строк:

Код:
Sub Test_LinkRows()
Dim LinkRowCount As Integer

    LinkRowCount = AllLinkRowCount(1) ' число в скобках - это порядковый номер подключенного источника данных
    Debug.Print LinkRowCount
End Sub

Private Function AllLinkRowCount(DataRecordsetsItem)
Dim DataRecordsetID As Integer, sh As Visio.Shape

With ThisDocument
    DataRecordsetID = .DataRecordsets(DataRecordsetsItem).ID
End With

For Each sh In ActivePage.Shapes
    If sh.IsCustomPropertyLinked(DataRecordsetID, 1) Then AllLinkRowCount = AllLinkRowCount + 1
Next

End Function


Этот код считает связанные строки только для шейпов на активном листе.

Правильно считает если:
К каждому шейпу на листе подключено не более 1 источника.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: 2 банальных вопроса
СообщениеДобавлено: 17 апр 2017, 13:12 
Не в сети
Новичок

Зарегистрирован: 07 апр 2017, 10:18
Сообщений: 32
Использую Visio c: 2013
Отрасль: АСУТП
Уровнь квалификации: Чуть выше среднего
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
Surrogate, Shishok спасибо за ответы!

1. По передаче строковых значений понял (как же заморочено то Изображение )

2. По получению значений свойств базы:

Цитата:
Ну, скорей вот так:
Код:
Sub CountRows()
Dim lngRowIDs() As Long, AllRowCount As Integer

With ThisDocument
    lngRowIDs = .DataRecordsets(.DataRecordsets.Count).GetDataRowIDs("")
End With

AllRowCount = UBound(lngRowIDs) + 1

End Sub


Ну я собственно практически то же самое и делал )

Цитата:
А насчет связанных строк:
Код:
Sub Test_LinkRows()
Dim LinkRowCount As Integer

    LinkRowCount = AllLinkRowCount(1) ' число в скобках - это порядковый номер подключенного источника данных
    Debug.Print LinkRowCount
End Sub

Private Function AllLinkRowCount(DataRecordsetsItem)
Dim DataRecordsetID As Integer, sh As Visio.Shape

With ThisDocument
    DataRecordsetID = .DataRecordsets(DataRecordsetsItem).ID
End With

For Each sh In ActivePage.Shapes
    If sh.IsCustomPropertyLinked(DataRecordsetID, 1) Then AllLinkRowCount = AllLinkRowCount + 1
Next

End Function

Этот код считает связанные строки только для шейпов на активном листе.
Правильно считает если:
К каждому шейпу на листе подключено не более 1 источника.

Shishok, а возможно ли как-то скорректировать код, чтобы поиск и подсчет велся не на активном листе, а на всех листах документа среди всех шейпов? Или может, например, на всех листах документа, но среди шейпов у которых конкретный мастер?


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: 2 банальных вопроса
СообщениеДобавлено: 17 апр 2017, 14:10 
Не в сети
Ветеран

Зарегистрирован: 30 июл 2014, 14:28
Сообщений: 433
Использую Visio c: 2008
Очков репутации: 97

Добавить очки репутацииУменьшить очки репутации
Да можно, конечно.
А в чем сакральный смысл знания о том сколько связанных строк в источнике?

Код:
Option Explicit

Sub Test_LinkRows()
Dim LinkRowCount As Integer

    LinkRowCount = AllLinkRowCount(1, "Start", 1)
    ' первый аргумент в скобках - это порядковый номер подключенного источника данных
    ' второй аргумент в скобках - это имя мастера фигуры
    ' третий аргумент в скобках - это порядковый номер строки данных(ShapeData) проверяемой фигуры
    Debug.Print LinkRowCount
End Sub

Private Function AllLinkRowCount(DataRecordsetsItem, mastername, numrow)
Dim DataRecordsetID As Integer, pg As Visio.Page, sh As Visio.Shape

With ThisDocument
    DataRecordsetID = .DataRecordsets(DataRecordsetsItem).ID
   
    For Each pg In .Pages
        For Each sh In pg.Shapes
            If Not sh.Master Is Nothing Then
                If sh.Master.Name = mastername Then
                    If sh.IsCustomPropertyLinked(DataRecordsetID, numrow) Then AllLinkRowCount = AllLinkRowCount + 1
                End If
            End If
        Next
    Next

End With
End Function


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: 2 банальных вопроса
СообщениеДобавлено: 17 апр 2017, 14:53 
Не в сети
Новичок

Зарегистрирован: 07 апр 2017, 10:18
Сообщений: 32
Использую Visio c: 2013
Отрасль: АСУТП
Уровнь квалификации: Чуть выше среднего
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
Shishok писал(а):
Да можно, конечно.
А в чем сакральный смысл знания о том сколько связанных строк в источнике?

Спасибо! Все корректно считает. Я не совсем понял для чего введен третий аргумент в скобках (порядковый номер строки данных(ShapeData) проверяемой фигуры)? Если не ошибаюсь, то проверяется привязана ли указанная строчка внешних данных фигуры? Если так, то насколько я понял без разницы какой там будет номер, главное чтобы в пределах количества строк внешних данных фигуры.

Особого сакрального смысла нет. Я делаю файл Visio с привязанным файлом Excel, который по внешним данным будет строить документ C5 из комплекта АСУТП по 34 ГОСТу (ну естественно с некоторыми особенностями). Еще не доделал его до конца. И это значение по моей задумке будет использоваться в скрипте. Как доведу хоть чуть чуть до ума связку, создам отдельную тему, там все выложу. Может людей на форуме заинтересует, кто-то так заберет, а кто-то возможно поможет оптимизировать.

P.S. Если интересно, могу выслать наработки.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: 2 банальных вопроса
СообщениеДобавлено: 17 апр 2017, 15:18 
Не в сети
Ветеран

Зарегистрирован: 30 июл 2014, 14:28
Сообщений: 433
Использую Visio c: 2008
Очков репутации: 97

Добавить очки репутацииУменьшить очки репутации
Цитата:
Я не совсем понял для чего введен третий аргумент в скобках (порядковый номер строки данных(ShapeData) проверяемой фигуры)?

Этот номер должен указывать на строку в Shape Data которая является строкой появившейся в результате связывания с источником данных. А не строка созданная, например пользователем. Иначе подсчет будет не верный.
Изображение


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: 2 банальных вопроса
СообщениеДобавлено: 17 апр 2017, 15:21 
Не в сети
Новичок

Зарегистрирован: 07 апр 2017, 10:18
Сообщений: 32
Использую Visio c: 2013
Отрасль: АСУТП
Уровнь квалификации: Чуть выше среднего
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
Shishok писал(а):
Цитата:
Я не совсем понял для чего введен третий аргумент в скобках (порядковый номер строки данных(ShapeData) проверяемой фигуры)?

Этот номер должен указывать на строку в Shape Data которая является строкой появившейся в результате связывания с источником данных. А не строка созданная, например пользователем. Иначе подсчет будет не верный.
Изображение

Как не удивительно указываю строку 1, это строка созданная мною в шаблоне. Все прекрасно работает )))


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: 2 банальных вопроса
СообщениеДобавлено: 17 апр 2017, 15:26 
Не в сети
Administrator

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 3362
Откуда: оттуда
Использую Visio c: 1998
Отрасль: Связь
Должность: Бывший проектировщик
Уровнь квалификации: ShapeSheet, VBA
lite.fun писал(а):
документ C5 из комплекта АСУТП по 34 ГОСТу
я далек от АСУ ТП. погуглил что такое С5
Изображение
lite.fun писал(а):
Я делаю файл Visio с привязанным файлом Excel
не понимаю необходимости привязывать для этого Эксель ? Для потенциальной возможности обновления данных ?
lite.fun писал(а):
который по внешним данным будет строить

IMHO собственно для построения схемы по внешним данным, нет необходимость эти данные связывать !


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: 2 банальных вопроса
СообщениеДобавлено: 17 апр 2017, 15:30 
Не в сети
Ветеран

Зарегистрирован: 30 июл 2014, 14:28
Сообщений: 433
Использую Visio c: 2008
Очков репутации: 97

Добавить очки репутацииУменьшить очки репутации
Цитата:
Как не удивительно указываю строку 1, это строка созданная мною в шаблоне. Все прекрасно работает )))

Точно проверил?
У меня работает именно как я описал.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: 2 банальных вопроса
СообщениеДобавлено: 17 апр 2017, 15:34 
Не в сети
Administrator

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 3362
Откуда: оттуда
Использую Visio c: 1998
Отрасль: Связь
Должность: Бывший проектировщик
Уровнь квалификации: ShapeSheet, VBA
Shishok писал(а):
Точно проверил?
я бы посоветовал обоим выложить свои тестовые файлы


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: 2 банальных вопроса
СообщениеДобавлено: 17 апр 2017, 15:36 
Не в сети
Ветеран

Зарегистрирован: 30 июл 2014, 14:28
Сообщений: 433
Использую Visio c: 2008
Очков репутации: 97

Добавить очки репутацииУменьшить очки репутации
Эм... Нюанс есть. Вообще-то первый номер строки это - 0. Может поэтому у тебя правильно считает.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: 2 банальных вопроса
СообщениеДобавлено: 17 апр 2017, 15:41 
Не в сети
Новичок

Зарегистрирован: 07 апр 2017, 10:18
Сообщений: 32
Использую Visio c: 2013
Отрасль: АСУТП
Уровнь квалификации: Чуть выше среднего
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
Surrogate писал(а):
я далек от АСУ ТП. погуглил что такое С5
Не совсем то. У меня на выходе будет так
Изображение

Surrogate писал(а):
не понимаю необходимости привязывать для этого Эксель ? Для потенциальной возможности обновления данных ?
Да, совершенно верно. В процессе работы могут появиться изменения в файле-базе, которые необходимо чтобы отражались на схеме.

Surrogate писал(а):
IMHO собственно для построения схемы по внешним данным, нет необходимость эти данные связывать !
Это я понимаю, но написать собственные процедуры, которые будут строить схему без привязки файла данных, отслеживать изменения в нем и обновлять чертеж, я просто физически не смогу, в силу своих познаний. Поэтому пока иду по пути наименьшего сопротивления для меня.

Surrogate писал(а):
Точно проверил?
У меня работает именно как я описал.
Да, перепроверил. Пробовал на разные строки отсылать (1, 2, 3). Все работает. Вот скрин shape sheet мастера

Изображение


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: 2 банальных вопроса
СообщениеДобавлено: 17 апр 2017, 15:46 
Не в сети
Ветеран

Зарегистрирован: 30 июл 2014, 14:28
Сообщений: 433
Использую Visio c: 2008
Очков репутации: 97

Добавить очки репутацииУменьшить очки репутации
Цитата:
Да, перепроверил. Пробовал на разные строки отсылать (1, 2, 3). Все работает. Вот скрин shape sheet мастера

А какие строки относятся к источнику данных?


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: 2 банальных вопроса
СообщениеДобавлено: 17 апр 2017, 15:48 
Не в сети
Новичок

Зарегистрирован: 07 апр 2017, 10:18
Сообщений: 32
Использую Visio c: 2013
Отрасль: АСУТП
Уровнь квалификации: Чуть выше среднего
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
Shishok писал(а):
А какие строки относятся к источнику данных?
У меня в шаблоне в ShapeData 50 строк, и все они привязываются в данным в файле excel.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: 2 банальных вопроса
СообщениеДобавлено: 17 апр 2017, 15:50 
Не в сети
Administrator

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 3362
Откуда: оттуда
Использую Visio c: 1998
Отрасль: Связь
Должность: Бывший проектировщик
Уровнь квалификации: ShapeSheet, VBA
lite.fun писал(а):
но написать собственные процедуры, которые будут строить схему без привязки файла данных, отслеживать изменения в нем и обновлять чертеж, я просто физически не смогу, в силу своих познаний. Поэтому пока иду по пути наименьшего сопротивления для меня.
это хорошо, если в файле источнике просто поменялись некие значения - надписи на схеме. и это не влечет перестроения схемы - замена одного условного элемента другим !
IMHO в случае серьезных изменений проще генерить новую схему заново, чем пытаться что-то в ней изменять программно.!


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: 2 банальных вопроса
СообщениеДобавлено: 17 апр 2017, 15:57 
Не в сети
Ветеран

Зарегистрирован: 30 июл 2014, 14:28
Сообщений: 433
Использую Visio c: 2008
Очков репутации: 97

Добавить очки репутацииУменьшить очки репутации
Цитата:
У меня в шаблоне в ShapeData 50 строк, и все они привязываются в данным в файле excel.


Ну если ВСЕ 50 строк привязаны к источнику данных, то конечно все правильно будет работать.
В диапазоне номеров от 0 до 49. Под своими строками я имел в виду, строки созданные например вручную и ни к чему не привязанные.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: 2 банальных вопроса
СообщениеДобавлено: 17 апр 2017, 16:01 
Не в сети
Новичок

Зарегистрирован: 07 апр 2017, 10:18
Сообщений: 32
Использую Visio c: 2013
Отрасль: АСУТП
Уровнь квалификации: Чуть выше среднего
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
Surrogate писал(а):
это хорошо, если в файле источнике просто поменялись некие значения - надписи на схеме. и это не влечет перестроения схемы - замена одного условного элемента другим !
IMHO в случае серьезных изменений проще генерить новую схему заново, чем пытаться что-то в ней изменять программно.!
Абсолютно согласен с Вами Surrogate! Когда схема уже построена, обновляются изменения только значений полей на схеме. В случае если добавляются или удаляются строки в файле данных, то буду "перерисовывать" саму схему. По крайней мере пока иные варианты для меня слишком сложны. Возможно в будущих версиях буду пробовать иной подход.

Shishok писал(а):
Ну если ВСЕ 50 строк привязаны к источнику данных, то конечно все правильно будет работать.
В диапазоне номеров от 0 до 49. Под своими строками я имел в виду, строки созданные например вручную и ни к чему не привязанные.
Ну возможно я чего-то недопонимаю, но для чего создавать ShepeData строку, если она никуда не привязана? Если для каких-то внутренних задач шейпа, то для этого есть UserRow. Или это может понадобиться еще для чего то?


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 48 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Вы можете создать форум бесплатно PHPBB3 на Getbb.Ru, Также возможно сделать готовый форум PHPBB2 на Mybb2.ru
Русская поддержка phpBB