Добрый вечер, специалисты по экселю. Помогите решить вопрос.
В таблице находятся координаты - замкнутой ломаной линии (имеются ввиду координаты на листе Автофигуры Полилинии). Как при щелчке на кнопку - заставить макрос нарисовать Полилинию по этим координатам - на листе , стерев при этом предыдущую Полилинию ?
Добрый вечер, специалисты по экселю. Помогите решить вопрос.
В таблице находятся координаты - замкнутой ломаной линии (имеются ввиду координаты на листе Автофигуры Полилинии). Как при щелчке на кнопку - заставить макрос нарисовать Полилинию по этим координатам - на листе , стерев при этом предыдущую Полилинию ?rotten41
Шейпы, вообще-то, объекты внедряемые, так что внутренняя структура шейпа - это дело объектной модели самого шейпа.
С другой стороны, возьмём ту же полилинию. У неё коллекция .Nodes должна содержать все узлы; в узле свойство .SegmentType = тип полилинии узла, а свойство .Points - точку узла.
А попробовать начать делать?
Шейпы, вообще-то, объекты внедряемые, так что внутренняя структура шейпа - это дело объектной модели самого шейпа.
С другой стороны, возьмём ту же полилинию. У неё коллекция .Nodes должна содержать все узлы; в узле свойство .SegmentType = тип полилинии узла, а свойство .Points - точку узла.AndreTM
Sub Макрос1() Dim sh As Shape Dim r As Range Dim t() As Single Set r = ActiveSheet.Range("C8:D13") n& = r.Rows.Count ReDim t(n, 2) For i = 1 To n t(i, 1) = r.Cells(i, 1).Value t(i, 2) = r.Cells(i, 2).Value Next i For Each sh In ActiveSheet.Shapes If sh.Type = 5 Then sh.Delete End If Next sh Set sh = ActiveSheet.Shapes.AddPolyline(t) sh.Fill.Visible = msoFalse sh.Name = "Полилиния" End Sub
[/vba] А для точности удаления именно предыдущей линии, созданной этим макросом (а не всех полилиний, которые есть на листе, как сейчас), можно давать имя конкретное в строке [vba]
Код
sh.Name = "Полилиния_Своё_имя"
[/vba], и в Макросе прописать условие вместо: [vba]
Код
If sh.Type = 5 Then sh.Delete End If
[/vba] [vba]
Код
If sh.Name = "Полилиния_Своё_имя" Then sh.Delete End If
[/vba]
rotten41, что-то типа такого: [vba]
Код
Sub Макрос1() Dim sh As Shape Dim r As Range Dim t() As Single Set r = ActiveSheet.Range("C8:D13") n& = r.Rows.Count ReDim t(n, 2) For i = 1 To n t(i, 1) = r.Cells(i, 1).Value t(i, 2) = r.Cells(i, 2).Value Next i For Each sh In ActiveSheet.Shapes If sh.Type = 5 Then sh.Delete End If Next sh Set sh = ActiveSheet.Shapes.AddPolyline(t) sh.Fill.Visible = msoFalse sh.Name = "Полилиния" End Sub
[/vba] А для точности удаления именно предыдущей линии, созданной этим макросом (а не всех полилиний, которые есть на листе, как сейчас), можно давать имя конкретное в строке [vba]
Код
sh.Name = "Полилиния_Своё_имя"
[/vba], и в Макросе прописать условие вместо: [vba]
Код
If sh.Type = 5 Then sh.Delete End If
[/vba] [vba]
Код
If sh.Name = "Полилиния_Своё_имя" Then sh.Delete End If
Roman777, не работает. Выдает ошибку "Run-time error `1004` Указанный параметр имеет неправильный тип данных". Если нажать на кнопку Debug - то в макросе подсветится строка: Set sh = ActiveSheet.Shapes.AddPolyline(t)
Roman777, не работает. Выдает ошибку "Run-time error `1004` Указанный параметр имеет неправильный тип данных". Если нажать на кнопку Debug - то в макросе подсветится строка: Set sh = ActiveSheet.Shapes.AddPolyline(t)rotten41