Григорий Калюга, большое спасибо. Цвет макрос верно определил, но покрасил немного не то. Он красит фигуры, цвет которых менять не нужно. Нужно закрасить ячейки, как изображено на скриншоте.
For r = Y - rr To Y + rr
For c = X - rr To X + rr
ri = Abs(r - Y): ci = Abs(c - X)
If ri * ri + ci * ci <= rr * rr Then
If r > 6 And r < 33 And c > 9 And c < 40 Then ' границы поля
Cells(r, c).Interior.Color = zv
End If
End If
Next c
rr - радиус
Цитата
куда радиус применять?
Сумма квадратов раззниц координат должна быть меньше квадрата радиуса По принципу вхождения точки в круг
написал: Есть группа с названием Фигура1. У этой группы есть геометрический центр, который соответствует какой-то ячейке. И вот по этому центру - нужно закрасить ячейки своим цветом (цвет тоже указан в таблице и для Фигура1 он желтый) и своим радиусом.
1. в предложенном Вами файле Фигуры никак к ячейкам не привязаны. Можно программно узнать привязку Shape-са к ячейке, но только левым верхним углом: типа
Код
adr = sh.TopLeftCell.Address
а вот центр фигуры - это уже программно, только нужно понимать, что за фигура Вам нужна?
2. Вы все время толкуете о радиусе, а в примере прямоугольники. И где там радиус?
написал: 1. в предложенном Вами файле Фигуры никак к ячейкам не привязаны.
Имеется ввиду геометрический центр Фигуры (Фигура - это группа с названием "Фигура"). Он попадает на какую-то ячейку. Вот эта ячейка, на которую он попадает - это и есть центр пятна (залитых определенным цветом ячеек). (если указывать левый верхний угол, то это будет не центр фигуры и пятно получится смещено влево-вверх. А нужно чтобы оно было более-менее по центру.)
Цитата
написал: 2. Вы все время толкуете о радиусе, а в примере прямоугольники. И где там радиус?
Ну "радиус" тут понятное дело - в кавычках. Условный радиус. Ведь пятно из залитых ячеек - не должно получиться в виде большого прямоугольника, оно должно быть как-то приближено немного к круглому.
For Each sh In ActiveSheet.Shapes
n = sh.Name
If sz.exists(n) Then
zv = sz(n) 'цвет
rr = sr(n) 'радиус
x0 = sh.Left + sh.Width / 2 ' центр х
y0 = sh.Top + sh.Height / 2 ' центр у
Sub Макрос1()
Dim ws As Worksheet
Dim h As Range
Dim nREnd As Integer
Dim arrN()
Set ws = ThisWorkbook.Worksheets("Sheet1")
With ws.UsedRange
Set h = .Range(.Cells(1, 1), .Cells(.Row + .Rows.Count - 1, .Column + .Columns.Count - 1)).Find(What:="Название")
With h
nRIn = .Row + 1
nCIn = .Column
nREnd = .End(xlDown).Row
End With
Set h = Nothing
End With
i = 0
For r = 6 To nREnd
If i = 0 Then
ReDim arrN(2, i)
Else
ReDim Preserve arrN(2, i)
End If
With ws
arrN(0, i) = .Cells(r, nCIn).Text
arrN(1, i) = .Cells(r, nCIn + 1).Interior.Color
arrN(2, i) = .Cells(r, nCIn + 2).Value
End With
i = i + 1
Next r
i = 0
For Each sh In ActiveSheet.Shapes
n = sh.Name
For i = LBound(arrN, 2) To UBound(arrN, 2)
If arrN(0, i) = n Then
'ws.Shapes(n).Select False
zv = arrN(1, i)
rr = arrN(2, i)
MsgBox "Цвет = " & zv & Chr(10) & "Радиус = " & rr, vbInformation + vbOKOnly, "" & n
With sh
'==--==
Dim k As Range
Set k = .TopLeftCell
Y = k.Row
X = k.Column
For r = Y - rr To Y + rr
For c = X - rr To X + rr
ri = Abs(r - Y)
ci = Abs(c - X)
If ri * ri + ci * ci <= rr * rr Then
If r > 6 And r < 33 And c > 9 And c < 40 Then ' границы поля
'красим
ws.Cells(r, c).Interior.Color = zv
End If
End If
Next c
Next r
'==--==
End With
Exit For
End If
Next i
Next
End Sub
Григорий Калюга, спасибо. Все раскрашивает, но только тут центры пятен не совпадают с центрами Фигур. Они смещены сейчас - слишком влево-вверх (по диагонали).
Григорий Калюга написал: 2. Вы все время толкуете о радиусе, а в примере прямоугольники. И где там радиус?
радиус, как суслик: его не видно, но он есть! эта проблема решена еще во времена Пифагора и Архимеда, когда удалось посчитать площадь круглой фигуры в квадратных единицах (чем больше размеры квадратиков тем хуже они описывают круг и наоборот)
Это координаты центра фигуры А надо найти номера строки и колонки ячейки где находится центр У меня для этого функция, в которой перебираются ячейки диапазона и ищется ячейка где находится центр фигуры И уже от этой ячейки плясать
Цитата
Вот для этой строки:
Нет пересчитывать не надо Там достаточно проверять номера строк и столбцов чтобы амёба не вылезала за границы
написал: Куда его в макросе нужно поставить, чтобы по центрам фигур пятна расставлялись ?
Вы, к сожалению, невнимательно читаете, что Вам пишут коллеги ... Вот здесь:
Цитата
написал: Это координаты центра фигуры А надо найти номера строки и колонки ячейки где находится центрУ меня для этого функция, в которой перебираются ячейки диапазона и ищется ячейка где находится центр фигуры
или просите уважаемого Александра подарить Вам функцию, или подождите до вечера. Я пока на работе и, немного занят ...
ПС: почему то в окне скопированной цитаты автор ее показывается, а при выводе сообщения в форуме - куда то прячется. Куда ...??
когда пишу, что не понимаю задачу - нужно уточнять задачу, а не повторять то, что уже написано мне уже ничего уточнять не нужно, на мои посты не обращайте внимания) а свою задачу вы скоро решите (может быть). 50 сообщений в теме- не так уже и много, еще 50 или сотня-другая и все будет готово в лучшем виде
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
вы не хотите помочь себе сами? (обьяснить что вам нужно) может в тему подтянутся люди, которые хоть что-то поймут и решат вашу задачу поймите никто не будет с карандашем и бумагой перечитывает весь написанный тут мусор (в чпстности данное сообщение) чтобы выбрать из тонн мусора крупицы условий задачи неужели это не понятно?
фраза "Помогите", просто исчерпывающе обьясняет суть задачи. теперь каждому понятно, что нужно помочь, не понятно правда в чем помочь и чем
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
осталось определиться как строится пятно вокруг центра (по какому правилу (алгоритму) принимается решение залить эту ячейку или нет, я конечно могу придумать свой алгоритм, но зачем он вам нужен? если вам нужно зарисовать то, что нужно вам, а не то, что придумал я))
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Доброго времени суток, друзья! Как и обещал, вроде, теперь амебы центрируются ...
Код
Sub Макрос1()
Dim ws As Worksheet
Dim h As Range
Dim nREnd As Integer
Dim sh As Shape
Dim arrN()
Set ws = ThisWorkbook.Worksheets("Sheet1")
With ws.UsedRange
Set h = .Range(.Cells(1, 1), .Cells(.Row + .Rows.Count - 1, .Column + .Columns.Count - 1)).Find(What:="Название")
With h
nRIn = .Row + 1
nCIn = .Column
nREnd = .End(xlDown).Row
End With
Set h = Nothing
End With
i = 0
For R = 6 To nREnd
If i = 0 Then
ReDim arrN(2, i)
Else
ReDim Preserve arrN(2, i)
End If
With ws
arrN(0, i) = .Cells(R, nCIn).Text
arrN(1, i) = .Cells(R, nCIn + 1).Interior.Color
arrN(2, i) = .Cells(R, nCIn + 2).Value
End With
i = i + 1
Next R
i = 0
For Each sh In ActiveSheet.Shapes
n = sh.Name
'==--==
Dim Pnt As String
Pnt = koordTi2(sh, ws)
y = ws.Range(Pnt).Row
x = ws.Range(Pnt).Column
'==--==
For i = LBound(arrN, 2) To UBound(arrN, 2)
If arrN(0, i) = n Then
'ws.Shapes(n).Select False
zv = arrN(1, i)
rr = arrN(2, i)
'MsgBox "Цвет = " & zv & Chr(10) & "Радиус = " & rr, vbInformation + vbOKOnly, "" & n
With sh
'==--==
For R = y - rr To y + rr
For c = x - rr To x + rr
ri = Abs(R - y)
ci = Abs(c - x)
'Сумма квадратов разниц координат должна быть меньше квадрата радиуса _
По принципу вхождения точки в круг
If ri * ri + ci * ci <= rr * rr Then
If R > 6 And R < 33 And c > 9 And c < 40 Then ' границы поля
'красим
ws.Cells(R, c).Interior.Color = zv
End If
End If
Next c
Next R
'==--==
End With
Exit For
End If
Next i
Next
End Sub
Function koordTi2(sh_ As Shape, ws_ As Worksheet) As String
Dim U As Range
With sh_
'Это координаты центра фигуры:
x0 = .Left + .Width / 2 ' центр по х
y0 = .Top + .Height / 2 ' центр по у
Set fig = .TopLeftCell
End With
nR = fig.Row
nC = fig.Column
i = 0
j = nR
For i = nC To 39
With ws_.Cells(j, i)
'.Select
x1 = .Left + .Width / 2 ' центр по х
If x1 > x0 Then
i = i - 1
Exit For
End If
End With
Next i
For j = nR To 32
With ws_.Cells(j, i)
'.Select
y1 = .Top + .Height / 2 ' центр по у
If y1 > y0 Then
j = j - 1
Exit For
End If
End With
Next j
'ws_.Cells(j, i).Select
MsgBox "строка = " & j & Chr(10) & _
"колонка = " & i, vbInformation + vbOKOnly, ""
koordTi2 = ws_.Cells(j, i).Address
End Function