Доброе утро, специалисты по программированию Помогите разобраться с задачей.
На листе находится линия, чье название вписано в ячейку M3. Рядом находится определенная сгруппированная фигура, чье название вписано в ячейку K3.
Как макросом - симметрично расставить пять копий подобных сгруппированных фигур - по длине линии (сразу под ней) ? (То есть я так понимаю, что нужно расставить две фигуры по краям, одну строго в центре, а оставшиеся две - посередине между центром и краями.)
Подскажите - как это сделать макросом ? (Длина линии может быть любой.)
Доброе утро, специалисты по программированию Помогите разобраться с задачей.
На листе находится линия, чье название вписано в ячейку M3. Рядом находится определенная сгруппированная фигура, чье название вписано в ячейку K3.
Как макросом - симметрично расставить пять копий подобных сгруппированных фигур - по длине линии (сразу под ней) ? (То есть я так понимаю, что нужно расставить две фигуры по краям, одну строго в центре, а оставшиеся две - посередине между центром и краями.)
Подскажите - как это сделать макросом ? (Длина линии может быть любой.)RipVanWinkel
Здравствуйте. Если линия строго горизонтальная, то можно так [vba]
Код
Public Sub Copy5() Dim ln As Shape, fg As Shape Dim step, i& With ActiveSheet Set ln = .Shapes(Range("M3").Text) Set fg = .Shapes(Range("K3").Text) step = (ln.Width - fg.Width) / 4 fg.Copy For i = 0 To 4 .Paste .Shapes(.Shapes.Count).Left = ln.Left + step * i .Shapes(.Shapes.Count).Top = ln.Top Next i End With End Sub
[/vba]
Здравствуйте. Если линия строго горизонтальная, то можно так [vba]
Код
Public Sub Copy5() Dim ln As Shape, fg As Shape Dim step, i& With ActiveSheet Set ln = .Shapes(Range("M3").Text) Set fg = .Shapes(Range("K3").Text) step = (ln.Width - fg.Width) / 4 fg.Copy For i = 0 To 4 .Paste .Shapes(.Shapes.Count).Left = ln.Left + step * i .Shapes(.Shapes.Count).Top = ln.Top Next i End With End Sub
RipVanWinkel, Тоже самое. Для негоризонтальной линии: [vba]
Код
Type point_ X As Single Y As Single End Type Sub ddd() Dim line1 As Shape Dim figure1 As Shape, figure2 As Shape Dim pline(2) As point_, lineW As Single Dim k As Single Dim VF As Boolean, HF As Boolean Set line1 = ActiveSheet.Shapes(Cells(3, 13)) Set figure1 = ActiveSheet.Shapes(Cells(3, 11)) line1.Select figure1.Select VF = line1.DrawingObject.ShapeRange.VerticalFlip ' свойство меняется при изменении положения отрезка в пространстве HF = line1.DrawingObject.ShapeRange.HorizontalFlip ' свойство меняется при изменении положения отрезка в пространстве If VF = HF Then pline(1).X = line1.Left pline(1).Y = line1.Top pline(2).X = line1.Left + line1.Width pline(2).Y = line1.Top + line1.Height Else pline(1).X = line1.Left pline(1).Y = line1.Top + line1.Height pline(2).X = line1.Left + line1.Width pline(2).Y = line1.Top End If lineW = Sqr((pline(1).Y - pline(2).Y) ^ 2 + (pline(1).X - pline(2).X) ^ 2) n& = 5 For i = 1 To n figure1.Copy ActiveSheet.Paste Set figure2 = ActiveSheet.Shapes(ActiveSheet.Shapes.Count) k = (i - 1) / (n - 1) figure2.Top = pline(1).Y + k * (pline(2).Y - pline(1).Y) figure2.Left = pline(1).X + k * (pline(2).X - pline(1).X) - figure2.Width / 2 Next i End Sub
[/vba]
RipVanWinkel, Тоже самое. Для негоризонтальной линии: [vba]
Код
Type point_ X As Single Y As Single End Type Sub ddd() Dim line1 As Shape Dim figure1 As Shape, figure2 As Shape Dim pline(2) As point_, lineW As Single Dim k As Single Dim VF As Boolean, HF As Boolean Set line1 = ActiveSheet.Shapes(Cells(3, 13)) Set figure1 = ActiveSheet.Shapes(Cells(3, 11)) line1.Select figure1.Select VF = line1.DrawingObject.ShapeRange.VerticalFlip ' свойство меняется при изменении положения отрезка в пространстве HF = line1.DrawingObject.ShapeRange.HorizontalFlip ' свойство меняется при изменении положения отрезка в пространстве If VF = HF Then pline(1).X = line1.Left pline(1).Y = line1.Top pline(2).X = line1.Left + line1.Width pline(2).Y = line1.Top + line1.Height Else pline(1).X = line1.Left pline(1).Y = line1.Top + line1.Height pline(2).X = line1.Left + line1.Width pline(2).Y = line1.Top End If lineW = Sqr((pline(1).Y - pline(2).Y) ^ 2 + (pline(1).X - pline(2).X) ^ 2) n& = 5 For i = 1 To n figure1.Copy ActiveSheet.Paste Set figure2 = ActiveSheet.Shapes(ActiveSheet.Shapes.Count) k = (i - 1) / (n - 1) figure2.Top = pline(1).Y + k * (pline(2).Y - pline(1).Y) figure2.Left = pline(1).X + k * (pline(2).X - pline(1).X) - figure2.Width / 2 Next i End Sub