Вот сделал утилитку для вывода отчета в виде таблицы из скрипта. Всегда этого не хватало.
Известно, что для автоматизации Visio можно использовать не только VBA и различные виды Add-On и Add-In, но и скрипты на js, vbs, python и т.д. Скрипты хороши тем, что им не нужны никакие инсталляторы, они не мешают безопасности Visio и не требует наличия в системе каких-либо дополнительных компонентов. Вот только с представлением данных небольшая проблема. Строку с результатом вывести легко. А если нужна табличка, то приходится выводить в файл, который потом нужно открывать в другом приложении.
Решил побороть эту проблему с помощью Internet Explorer. Раз уж он есть в любой Windows системе, пусть поработает. В результате получилась процедура, которая выводит произвольный массив в виде таблички.
Для удобства формирования в качестве входного формата взят массив массивов. То есть одномерный массив (строки), каждый элемент которого является одномерным массивом (столбцы). Двумерный массив был бы более естественным, но его тяжелее динамически расширять. Количество строк и столбцов не ограничено.
Текст процедуры:
Private Sub ReportToIE(ByVal ar)
Dim ie
If TypeName(ar) = "String" Then 'error message
s = ar
ElseIf IsArray(ar) Then 'Array of arrays
r0 = LBound(ar)
r1 = UBound(ar)
c0 = LBound(ar(0))
c1 = UBound(ar(0))
s = "<table>"
For i = r0 To r1
s = s & "<tr>"
For j = c0 To c1
s = s & "<td>" & ar(i)(j) & "</td>"
Next
s = s & "</tr>"
Next
s = s & "</table>"
Else
s = "Unknown error"
End If
Set ie = CreateObject("InternetExplorer.Application")
ie.Silent = True
ie.AddressBar = False
ie.Fullscreen = False
ie.MenuBar = False
ie.Resizable = False
ie.StatusBar = False
ie.Toolbar = False
ie.Height = 300
ie.Width = 480
ie.Navigate "about:blank"
ie.Document.Write s
ie.Visible = True
' ie.Quit
' Set ie = Nothing
End Sub
Для использования нужно сформировать массив указанного формата и обратиться к процедуре. Она откроет окошко в IE и выведет в нем данные из массива в виде таблички.
Пример использования
Например, нам захотелось увидеть список открытых в данный момент окон Visio. Мы знаем, что на верхнем уровне всегда имеется как минимум одно окно с рисунком. У него несколько подчиненных окон - трафареты, ShapeData и т.д. Кроме того, могут быть еще окна на верхнем уровне, например свободные трафареты (в том числе и скрытые).
Пусть вот такая процедура соберет нам нужные данные в массив:
Sub ListWindowsToIE()
Dim c()
s = "Window Caption;Type;Visibility;Level"
b = Split(s, ";")
ReDim a(0)
a(0) = b
For i = 1 To vApp.Windows.Count
Set w1 = vApp.Windows(i)
s = w1.Caption & ";" & w1.Type & ";" & w1.Visible & "; level 1"
AddRow s 'to a
If w1.Windows.Count > 0 Then
For j = 1 To w1.Windows.Count
Set w2 = w1.Windows(j)
s = w2.Caption & ";" & w2.Type & ";" & w2.Visible & ";"
AddRow s
Next
End If
Next
ReportToIE a
End Sub
Private Sub AddRow(ByVal newrow)
n = UBound(a) + 1
ReDim Preserve a(n)
a(n) = Split(newrow, ";")
End Sub
Ну и наконец, нужен головной скрипт, который будет обращаться к этим процедурам.
Dim a()
Dim vApp
On Error Resume Next
Err.Clear
Set vApp = GetObject(,"Visio.Application")
If Err.Number > 0 Then
MsgBox "Visio is not opened"
WScript.Quit
End If
On Error Goto 0
ListWindowsToIE
Задача головного скрипта - найти открытое приложение Visio. С остальным справится ListWindowsToIE.
Собираем все это в файлик с расширением .VBS и проверяем, как оно работает. Открываем Visio, открываем в нем трафарет в скрытом окне. Открываем ShapeSheet.
Наконец, щелкаем по иконке скрипта и видим отчет
В главном окне - шесть подчиненных, причем все скрытые.
Еще на первом уровне - скрытое окно с трафаретом Blocks, у которого в свою очередь одно подчиненное. (Это Drawing Explorer для трафарета).
Также на первом уровне выводится ShapeSheet (видимый) с двумя скрытыми подчиненными окнами.
Еще раз напоминаю преимущества такого способа:
- отсутствие необходимости инсталляторов;
- работа со всеми версиями Windows и Visio (в пределах локальной машины);
- ничего не добавляется в файл Visio;
- отсутствие требований к установленным компонентам и исполняющим системам;
- отсутствие промежуточных файлов (как это было бы при выводе в CSV-Excel).