У меня есть макрос, который помещает фигуру из ячейки K1 - в ячейки, содержащие текст, представленный в ячейке O1.
Как по аналогии с этим макросом - для фигур из диапазона R6:R8 - назначить ячейкам с содержимым S6:S8 ? Соответствующим фигурам нужно переместится к центрам этих ячеек (имеются ввиду ячейки, содержащие текст из диапазона S6:S8 ).
У меня есть макрос, который помещает фигуру из ячейки K1 - в ячейки, содержащие текст, представленный в ячейке O1.
Как по аналогии с этим макросом - для фигур из диапазона R6:R8 - назначить ячейкам с содержимым S6:S8 ? Соответствующим фигурам нужно переместится к центрам этих ячеек (имеются ввиду ячейки, содержащие текст из диапазона S6:S8 ).ПутинВВ
Sub Макрос1() Dim rx, adr, fn, zd, x, y, z, zz, cnt& zd = [R6] fn = [S6] For Each x In ActiveSheet.Shapes If x.Name Like "ОбъектX*" Then x.Delete Next Set z = ActiveSheet.Shapes(zd) With ActiveSheet.Cells Set rx = .Find(fn) If Not rx Is Nothing Then adr = rx.Address Do If rx.Address <> "$S$6" Then rx.Select x = rx.Left + rx.Width - z.Width y = rx.Top z.Copy ActiveSheet.Paste: cnt = cnt + 1 Selection.Left = x: Selection.Name = "ОбъектX" & Format(cnt, " 000") End If Set rx = .FindNext(rx) Loop While rx.Address <> adr End If End With End Sub
Sub Макрос2() Dim rx, adr, fn, zd, x, y, z, zz, cnt& zd = [R7] fn = [S7] For Each x In ActiveSheet.Shapes If x.Name Like "ОбъектY*" Then x.Delete Next Set z = ActiveSheet.Shapes(zd) With ActiveSheet.Cells Set rx = .Find(fn) If Not rx Is Nothing Then adr = rx.Address Do If rx.Address <> "$S$7" Then rx.Select x = rx.Left + rx.Width - z.Width y = rx.Top z.Copy ActiveSheet.Paste: cnt = cnt + 1 Selection.Left = x: Selection.Name = "ОбъектY" & Format(cnt, " 000") End If Set rx = .FindNext(rx) Loop While rx.Address <> adr End If End With End Sub
Sub Макрос3() Dim rx, adr, fn, zd, x, y, z, zz, cnt& zd = [R8] fn = [S8] For Each x In ActiveSheet.Shapes If x.Name Like "ОбъектZ*" Then x.Delete Next Set z = ActiveSheet.Shapes(zd) With ActiveSheet.Cells Set rx = .Find(fn) If Not rx Is Nothing Then adr = rx.Address Do If rx.Address <> "$S$8" Then rx.Select x = rx.Left + rx.Width - z.Width y = rx.Top z.Copy ActiveSheet.Paste: cnt = cnt + 1 Selection.Left = x: Selection.Name = "ОбъектZ" & Format(cnt, " 000") End If Set rx = .FindNext(rx) Loop While rx.Address <> adr End If End With End Sub
[/vba]
Потому что я по сути написал три похожих макроса - для трех ячеек с именами фигур. А тут надо видимо как-то массив использовать. Подскажите, как заменить эти громоздкие макросы на макрос работающий с массивом ячеек R6:S8 ?
В общем я тут сам пытался что-то сделать.
Намудрил вот такой макрос, но он мне кажется неимоверно большим. [vba]
Sub Макрос1() Dim rx, adr, fn, zd, x, y, z, zz, cnt& zd = [R6] fn = [S6] For Each x In ActiveSheet.Shapes If x.Name Like "ОбъектX*" Then x.Delete Next Set z = ActiveSheet.Shapes(zd) With ActiveSheet.Cells Set rx = .Find(fn) If Not rx Is Nothing Then adr = rx.Address Do If rx.Address <> "$S$6" Then rx.Select x = rx.Left + rx.Width - z.Width y = rx.Top z.Copy ActiveSheet.Paste: cnt = cnt + 1 Selection.Left = x: Selection.Name = "ОбъектX" & Format(cnt, " 000") End If Set rx = .FindNext(rx) Loop While rx.Address <> adr End If End With End Sub
Sub Макрос2() Dim rx, adr, fn, zd, x, y, z, zz, cnt& zd = [R7] fn = [S7] For Each x In ActiveSheet.Shapes If x.Name Like "ОбъектY*" Then x.Delete Next Set z = ActiveSheet.Shapes(zd) With ActiveSheet.Cells Set rx = .Find(fn) If Not rx Is Nothing Then adr = rx.Address Do If rx.Address <> "$S$7" Then rx.Select x = rx.Left + rx.Width - z.Width y = rx.Top z.Copy ActiveSheet.Paste: cnt = cnt + 1 Selection.Left = x: Selection.Name = "ОбъектY" & Format(cnt, " 000") End If Set rx = .FindNext(rx) Loop While rx.Address <> adr End If End With End Sub
Sub Макрос3() Dim rx, adr, fn, zd, x, y, z, zz, cnt& zd = [R8] fn = [S8] For Each x In ActiveSheet.Shapes If x.Name Like "ОбъектZ*" Then x.Delete Next Set z = ActiveSheet.Shapes(zd) With ActiveSheet.Cells Set rx = .Find(fn) If Not rx Is Nothing Then adr = rx.Address Do If rx.Address <> "$S$8" Then rx.Select x = rx.Left + rx.Width - z.Width y = rx.Top z.Copy ActiveSheet.Paste: cnt = cnt + 1 Selection.Left = x: Selection.Name = "ОбъектZ" & Format(cnt, " 000") End If Set rx = .FindNext(rx) Loop While rx.Address <> adr End If End With End Sub
[/vba]
Потому что я по сути написал три похожих макроса - для трех ячеек с именами фигур. А тут надо видимо как-то массив использовать. Подскажите, как заменить эти громоздкие макросы на макрос работающий с массивом ячеек R6:S8 ?ПутинВВ
Option Explicit Sub Общий() With Application .ScreenUpdating = 0: .EnableEvents = 0 With ActiveSheet DuplicateShapes .[O1], .[K1], "Звездочка", _ .[S6], .[R6], "ОбъектX", _ .[S7], .[R7], "ОбъектY", _ .[S8], .[R8], "ОбъектZ" End With .ScreenUpdating = 1: .EnableEvents = 1 End With End Sub
Private Sub DuplicateShapes(ParamArray arg() As Variant) Dim arr() As Variant, lc As Range, c As Range, x As Shape, i&, cnt& For i = 0 To UBound(arg) \ 3 For Each x In arg(i * 3).Parent.Shapes If x.Name Like arg(i * 3 + 2) & "*" Then x.Delete Next With arg(i * 3).Parent.UsedRange arr = .Formula Set lc = .SpecialCells(11).Offset(1, 1) .Replace "*" & arg(i * 3) & "*", "=" & lc.Address, xlWhole For Each c In lc.DirectDependents If c.Address <> arg(i * 3).Address Then With ActiveSheet.Shapes(arg(i * 3 + 1)).Duplicate cnt = cnt + 1: .Left = c.Left + c.Width - .Width .Top = c.Top: .Name = arg(i * 3 + 2) & Format(cnt, " 000") End With End If Next .Formula = arr End With Next End Sub
[/vba]
Здравствуйте [vba]
Код
Option Explicit Sub Общий() With Application .ScreenUpdating = 0: .EnableEvents = 0 With ActiveSheet DuplicateShapes .[O1], .[K1], "Звездочка", _ .[S6], .[R6], "ОбъектX", _ .[S7], .[R7], "ОбъектY", _ .[S8], .[R8], "ОбъектZ" End With .ScreenUpdating = 1: .EnableEvents = 1 End With End Sub
Private Sub DuplicateShapes(ParamArray arg() As Variant) Dim arr() As Variant, lc As Range, c As Range, x As Shape, i&, cnt& For i = 0 To UBound(arg) \ 3 For Each x In arg(i * 3).Parent.Shapes If x.Name Like arg(i * 3 + 2) & "*" Then x.Delete Next With arg(i * 3).Parent.UsedRange arr = .Formula Set lc = .SpecialCells(11).Offset(1, 1) .Replace "*" & arg(i * 3) & "*", "=" & lc.Address, xlWhole For Each c In lc.DirectDependents If c.Address <> arg(i * 3).Address Then With ActiveSheet.Shapes(arg(i * 3 + 1)).Duplicate cnt = cnt + 1: .Left = c.Left + c.Width - .Width .Top = c.Top: .Name = arg(i * 3 + 2) & Format(cnt, " 000") End With End If Next .Formula = arr End With Next End Sub