Цитата(Гость сочувствующий @ 24.5.2013, 20:41)

За измерение длины кривых не скажу, а длины (в соответствие с мсштабом) прямых отрезков отражаются в левом нижнем углу. У меня стоит Визио 2007, до этого пользовался ещё с 98 Виндой, версию Визио не помню, но там тоже, по-моему, такая примочка была.
вывод длин линий по каждому цвету
Sub dl()
Dim sel As Selection
Dim snap1 As Shape
Set sel = ActiveWindow.Selection
If sel.Count < 0 Then ' если не выделено ничего или больше одного будет сообщение
MsgBox "Нужно выделить лишь одну линию!"
Exit Sub
End If
Dim colors(100)
Dim dls(100) As Double
Dim vsoShape As Visio.Shape
Dim dl_s As Double
Application.ActiveWindow.SelectAll
For Each vsoShape In Application.ActiveWindow.Selection
If InStr(vsoShape.Name, "ssv_") <> 0 Then vsoShape.Delete
Next
i = 0
Application.ActiveWindow.SelectAll
For Each vsoShape In Application.ActiveWindow.Selection
If InStr(vsoShape.Name, "ssv_") <> 0 Then vsoShape.Delete
If InStr(vsoShape.Name, "connector") <> 0 Then
color_s = vsoShape.CellsSRC(visSectionObject, visRowLine, visLineColor).FormulaU
dl_s = Round(KabLength(vsoShape) * 10) / 10
j = 0
Do
j = j + 1
Loop While colors(j) <> color_s And j < 100
If j < 100 Then dls(j) = dls(j) + dl_s Else i = i + 1: colors(i) = color_s: dls(i) = dls(i) + dl_s
End If
Next
a = ""
For j = 1 To i
Set shp = ActivePage.DrawLine(-100, -j * 20, 0, -j * 20)
shp.Name = "ssv_" & shp.Name
shp.Text = dls(j) / 1000 & " м"
shp.CellsSRC(visSectionObject, visRowLine, visLineColor).FormulaU = colors(j)
shp.CellsSRC(visSectionCharacter, 0, visCharacterSize).FormulaU = "40 pt"
shp.Cells("LineWeight") = 0.5
Next
End Sub
Function KabLength(Shap As Shape) As Double
Dim i As Integer
Dim Summa As Double ' сумма длин
Dim dx As Double, dy As Double ' определяем разности координат между концами отрезка
Dim nRows As Integer ' счетчик количества изломов линии
nRows = Shap.RowCount(visSectionFirstComponent) - 1
Summa = 0
For i = 1 To nRows - 1 ' пошагово перебираются узлы линии и вычисляются расстояния между узлами:
dx = (Shap.CellsSRC(visSectionFirstComponent, i, 0) - Shap.CellsSRC(visSectionFirstComponent, i + 1, 0)) * 0.0254 * 1000 ' по оси X
dy = (Shap.CellsSRC(visSectionFirstComponent, i, 1) - Shap.CellsSRC(visSectionFirstComponent, i + 1, 1)) * 0.0254 * 1000 ' по оси Y
Summa = Summa + Sqr(dx ^ 2 + dy ^ 2) ' Вычисляем длину текущего отрезка и прибавляем к сумме длин предыдущих отрезков
Next
KabLength = Summa
End Function