Форум пользователей Visio
http://visio.getbb.ru/

2 банальных вопроса
http://visio.getbb.ru/viewtopic.php?f=6&t=1113
Страница 1 из 3

Автор:  lite.fun [ 14 апр 2017, 13:16 ]
Заголовок сообщения:  2 банальных вопроса

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

Взахлеб изучаю форум, однако ввиду моих довольно скудных знаний о 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
но это не очень удобно, возможно есть способ попроще. А второе значение вообще не знаю как получить.

Автор:  Surrogate [ 14 апр 2017, 13:23 ]
Заголовок сообщения:  Re: 2 банальных вопроса

lite.fun писал(а):
получаю type mismatch
для передачи строковых значений в визио их нужно в тройные кавычки запихивать. и использовать свойство Formula
Код:
Application.ActiveDocument.DocumentSheet.Cells("User.DocFormat").Formula = """aaa"""

Автор:  Surrogate [ 14 апр 2017, 13:42 ]
Заголовок сообщения:  Re: 2 банальных вопроса

lite.fun писал(а):
как то возможно из VBA считать значения "Общее число строк" и "Связанные строки"?
Первое значение пока получаю так:
да, слишком много лишнего. собственно количество записей вроде так можно получить
Код:
intCount = ThisDocument.DataRecordsets.Count

Автор:  Shishok [ 14 апр 2017, 14:23 ]
Заголовок сообщения:  Re: 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

Автор:  Shishok [ 14 апр 2017, 15:01 ]
Заголовок сообщения:  Re: 2 банальных вопроса

А насчет связанных строк:

Код:
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 источника.

Автор:  lite.fun [ 17 апр 2017, 13:12 ]
Заголовок сообщения:  Re: 2 банальных вопроса

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, а возможно ли как-то скорректировать код, чтобы поиск и подсчет велся не на активном листе, а на всех листах документа среди всех шейпов? Или может, например, на всех листах документа, но среди шейпов у которых конкретный мастер?

Автор:  Shishok [ 17 апр 2017, 14:10 ]
Заголовок сообщения:  Re: 2 банальных вопроса

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

Код:
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

Автор:  lite.fun [ 17 апр 2017, 14:53 ]
Заголовок сообщения:  Re: 2 банальных вопроса

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

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

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

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

Автор:  Shishok [ 17 апр 2017, 15:18 ]
Заголовок сообщения:  Re: 2 банальных вопроса

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

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

Автор:  lite.fun [ 17 апр 2017, 15:21 ]
Заголовок сообщения:  Re: 2 банальных вопроса

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

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

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

Автор:  Surrogate [ 17 апр 2017, 15:26 ]
Заголовок сообщения:  Re: 2 банальных вопроса

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

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

Автор:  Shishok [ 17 апр 2017, 15:30 ]
Заголовок сообщения:  Re: 2 банальных вопроса

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

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

Автор:  Surrogate [ 17 апр 2017, 15:34 ]
Заголовок сообщения:  Re: 2 банальных вопроса

Shishok писал(а):
Точно проверил?
я бы посоветовал обоим выложить свои тестовые файлы

Автор:  Shishok [ 17 апр 2017, 15:36 ]
Заголовок сообщения:  Re: 2 банальных вопроса

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

Автор:  lite.fun [ 17 апр 2017, 15:41 ]
Заголовок сообщения:  Re: 2 банальных вопроса

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

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

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

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

Изображение

Автор:  Shishok [ 17 апр 2017, 15:46 ]
Заголовок сообщения:  Re: 2 банальных вопроса

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

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

Автор:  lite.fun [ 17 апр 2017, 15:48 ]
Заголовок сообщения:  Re: 2 банальных вопроса

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

Автор:  Surrogate [ 17 апр 2017, 15:50 ]
Заголовок сообщения:  Re: 2 банальных вопроса

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

Автор:  Shishok [ 17 апр 2017, 15:57 ]
Заголовок сообщения:  Re: 2 банальных вопроса

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


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

Автор:  lite.fun [ 17 апр 2017, 16:01 ]
Заголовок сообщения:  Re: 2 банальных вопроса

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

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

Страница 1 из 3 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/