Доброго времени суток. Столкнулся с проблемой в экселе. Суть такая: В диапазоне R3:S6 находится кружок В диапазоне E8:H17 изначально пусто. И вот нужно как-то макросом - переносить копии кружка из R3:S6 в E8:H17 - по одной копии за срабатывание.
Но диапазон E8:H17 должен заполнятся с верхнего левого угла - в ряды - до левой границы диапазона, а затем заполнение идет "с новой строки". Это непросто словами объяснить, но в файле - я показал какой порядок заполнения.
Как только диапазон заполнится - макрос при щелчке - должен бездействовать (поскольку в диапазоне больше места свободного не осталось).
Как провести подобное заполнение диапазона E8:H17 - копиями фигур из R3:S6 ?
Доброго времени суток. Столкнулся с проблемой в экселе. Суть такая: В диапазоне R3:S6 находится кружок В диапазоне E8:H17 изначально пусто. И вот нужно как-то макросом - переносить копии кружка из R3:S6 в E8:H17 - по одной копии за срабатывание.
Но диапазон E8:H17 должен заполнятся с верхнего левого угла - в ряды - до левой границы диапазона, а затем заполнение идет "с новой строки". Это непросто словами объяснить, но в файле - я показал какой порядок заполнения.
Как только диапазон заполнится - макрос при щелчке - должен бездействовать (поскольку в диапазоне больше места свободного не осталось).
Как провести подобное заполнение диапазона E8:H17 - копиями фигур из R3:S6 ?димитрий2
Sub Filling() Dim r0, r Dim shp0 As Shape, shp As Shape Dim flg1 As Boolean Dim Lx As Single, Ly As Single, curY#, curX#, X0# Dim w#, h#, L#, T# Dim LxBorder#, LyBorder# Dim deltX#, deltY# flg1 = False deltX = 6.5 'промежуточные расстояния по Х deltY = 5.5 'промежуточные расстояния по Y With ActiveSheet Set r0 = .Range("R3:S6") Set r = .Range("E8:H17") With .Cells(r.Rows(1).Row, 1) curY = deltY + .Top End With With .Cells(1, r.Columns(1).Column) curX = deltX + .Left End With With .Cells(r.Rows(r.Rows.Count).Row, 1) LyBorder = deltY + .Top + .Height End With With .Cells(1, r.Columns(r.Columns.Count).Column) LxBorder = deltX + .Left + .Width End With Lx = curX + deltX X0 = Lx Ly = curY + deltY For Each shp In .Shapes If Not Intersect(r0, .Range(shp.TopLeftCell, shp.BottomRightCell)) Is Nothing And Not flg Then Set shp0 = shp flg1 = True End If If Not Intersect(r, .Range(shp.TopLeftCell, shp.BottomRightCell)) Is Nothing Then w = shp.Width h = shp.Height L = shp.Left T = shp.Top curY = T If Ly <= curY Then If Ly < curY Then Ly = curY Lx = X0 End If curX = w + L If Lx < curX Then Lx = curX + deltX End If End If End If Next shp curX = Lx If curX <= LxBorder - w Then curY = Ly Else curX = X0 curY = Ly + h + deltY End If If curY <= LyBorder - h - deltY Then Set shp = shp0.Duplicate shp.Left = curX shp.Top = curY End If End With End Sub
[/vba] [p.s.]Чутка подправил. Изменения ни на что не влияют, кроме моей самооценки.[/p.s.]
димитрий2, Попробуйте так: [vba]
Код
Sub Filling() Dim r0, r Dim shp0 As Shape, shp As Shape Dim flg1 As Boolean Dim Lx As Single, Ly As Single, curY#, curX#, X0# Dim w#, h#, L#, T# Dim LxBorder#, LyBorder# Dim deltX#, deltY# flg1 = False deltX = 6.5 'промежуточные расстояния по Х deltY = 5.5 'промежуточные расстояния по Y With ActiveSheet Set r0 = .Range("R3:S6") Set r = .Range("E8:H17") With .Cells(r.Rows(1).Row, 1) curY = deltY + .Top End With With .Cells(1, r.Columns(1).Column) curX = deltX + .Left End With With .Cells(r.Rows(r.Rows.Count).Row, 1) LyBorder = deltY + .Top + .Height End With With .Cells(1, r.Columns(r.Columns.Count).Column) LxBorder = deltX + .Left + .Width End With Lx = curX + deltX X0 = Lx Ly = curY + deltY For Each shp In .Shapes If Not Intersect(r0, .Range(shp.TopLeftCell, shp.BottomRightCell)) Is Nothing And Not flg Then Set shp0 = shp flg1 = True End If If Not Intersect(r, .Range(shp.TopLeftCell, shp.BottomRightCell)) Is Nothing Then w = shp.Width h = shp.Height L = shp.Left T = shp.Top curY = T If Ly <= curY Then If Ly < curY Then Ly = curY Lx = X0 End If curX = w + L If Lx < curX Then Lx = curX + deltX End If End If End If Next shp curX = Lx If curX <= LxBorder - w Then curY = Ly Else curX = X0 curY = Ly + h + deltY End If If curY <= LyBorder - h - deltY Then Set shp = shp0.Duplicate shp.Left = curX shp.Top = curY End If End With End Sub
[/vba] [p.s.]Чутка подправил. Изменения ни на что не влияют, кроме моей самооценки.[/p.s.]Roman777
Много чего не знаю!!!!
Сообщение отредактировал Roman777 - Четверг, 27.12.2018, 15:32