Type point_ X As Single Y As Single End Type Sub dsd() Dim d As Shape Dim p() As point_ Dim po() As Single Dim c As Long, r As Long Set d = ActiveSheet.Shapes(cells(5, 26))
With d.DrawingObject.ShapeRange.Nodes ReDim p(.Count) For i = 1 To .Count po = .Item(i).Points p(i).X = po(1, 1) p(i).Y = po(1, 2) Next i End With r = 8 c = 26 For i = 1 To UBound(p) cells(i + r, c) = p(i).X cells(i + r, c + 1) = p(i).Y Next i End Sub
[/vba]
yl3d, попробуйте так: [vba]
Код
Type point_ X As Single Y As Single End Type Sub dsd() Dim d As Shape Dim p() As point_ Dim po() As Single Dim c As Long, r As Long Set d = ActiveSheet.Shapes(cells(5, 26))
With d.DrawingObject.ShapeRange.Nodes ReDim p(.Count) For i = 1 To .Count po = .Item(i).Points p(i).X = po(1, 1) p(i).Y = po(1, 2) Next i End With r = 8 c = 26 For i = 1 To UBound(p) cells(i + r, c) = p(i).X cells(i + r, c + 1) = p(i).Y Next i End Sub
В "Полилинии 2" узлов - всего 6. А макрос выдает координаты для 16 узлов. То есть - в Полилинии отсутствуют те узлы, для которых макрос выдает координаты.
Как узнать - какие координаты узлов истинные, а какие ложные ?
Roman777, применил ваш макрос.
Получилось странное несовпадение.
В "Полилинии 2" узлов - всего 6. А макрос выдает координаты для 16 узлов. То есть - в Полилинии отсутствуют те узлы, для которых макрос выдает координаты.
Как узнать - какие координаты узлов истинные, а какие ложные ?yl3d
Sub dsd() Dim d Dim p() As point_ Dim po() As Single Dim c As Long, r As Long Set d = ActiveSheet.Shapes(Cells(5, 26))
With d.DrawingObject.ShapeRange.Nodes ReDim p(.Count) For i = 1 To .Count po = .Item(i).Points p(i).X = po(1, 1) p(i).Y = po(1, 2) Next i End With r = 8 c = 26 For i = 1 To UBound(p) Cells(i + r, c) = p(i).X Cells(i + r, c + 1) = p(i).Y ' Set ff = Worksheets(1).Shapes.AddLine(p(i).X, p(i).Y, p(i).X + 10, p(i).Y + 10) If i <> 1 Or i <> UBound(p) Then If (i - 1) Mod 3 = 0 Then Cells(i + r, c + 2).Interior.Color = 111 ' Set ff = ActiveSheet.Shapes.AddLine(p(i).X, p(i).Y, p(i).X + 10, p(i).Y + 10) End If End If Next i End Sub
[/vba] По условию выделяю справа ячейку напротив узлов, отображемых при редактировании. Не проверял, но предполагаю, что у каждого узла, отображаемого в режиме редактирования, на самом деле есть "подузел" выше и ниже по линии. Они есть у всех, кроме начального и конечного узла, которые имеют только по одному узлу. Положение этих "подузлов" определяют изгиб кривой.
yl3d, судя по всему, можно попробовать так: [vba]
Код
Sub dsd() Dim d Dim p() As point_ Dim po() As Single Dim c As Long, r As Long Set d = ActiveSheet.Shapes(Cells(5, 26))
With d.DrawingObject.ShapeRange.Nodes ReDim p(.Count) For i = 1 To .Count po = .Item(i).Points p(i).X = po(1, 1) p(i).Y = po(1, 2) Next i End With r = 8 c = 26 For i = 1 To UBound(p) Cells(i + r, c) = p(i).X Cells(i + r, c + 1) = p(i).Y ' Set ff = Worksheets(1).Shapes.AddLine(p(i).X, p(i).Y, p(i).X + 10, p(i).Y + 10) If i <> 1 Or i <> UBound(p) Then If (i - 1) Mod 3 = 0 Then Cells(i + r, c + 2).Interior.Color = 111 ' Set ff = ActiveSheet.Shapes.AddLine(p(i).X, p(i).Y, p(i).X + 10, p(i).Y + 10) End If End If Next i End Sub
[/vba] По условию выделяю справа ячейку напротив узлов, отображемых при редактировании. Не проверял, но предполагаю, что у каждого узла, отображаемого в режиме редактирования, на самом деле есть "подузел" выше и ниже по линии. Они есть у всех, кроме начального и конечного узла, которые имеют только по одному узлу. Положение этих "подузлов" определяют изгиб кривой.Roman777
Sub dsd2() Dim d Dim p() As point_ Dim po() As Single Dim c As Long, r As Long Dim k As Long, count As Long Set d = ActiveSheet.Shapes(Cells(5, 26)) With d.DrawingObject.ShapeRange.Nodes count = .count ReDim p(count) For i = 1 To count po = .Item(i).Points p(i).X = po(1, 1) p(i).Y = po(1, 2) Next i End With r = 8 c = 26 For i = 1 To count If i = 1 Or i = count Or (i - 1) Mod 3 = 0 Then k = k + 1 Cells(k + r, c) = p(i).X Cells(k + r, c + 1) = p(i).Y End If Next i End Sub
[/vba]
yl3d,
[vba]
Код
Type point_ X As Single Y As Single End Type
Sub dsd2() Dim d Dim p() As point_ Dim po() As Single Dim c As Long, r As Long Dim k As Long, count As Long Set d = ActiveSheet.Shapes(Cells(5, 26)) With d.DrawingObject.ShapeRange.Nodes count = .count ReDim p(count) For i = 1 To count po = .Item(i).Points p(i).X = po(1, 1) p(i).Y = po(1, 2) Next i End With r = 8 c = 26 For i = 1 To count If i = 1 Or i = count Or (i - 1) Mod 3 = 0 Then k = k + 1 Cells(k + r, c) = p(i).X Cells(k + r, c + 1) = p(i).Y End If Next i End Sub