Вопрос вот какой: На листе находятся несколько фигур с разными названиями. Рядом таблица, в которой каждому названию фигуры - соответствует свой цвет и радиус от центра этой фигуры, на котором должны закрашиваться ячейки в этот цвет. Пятна не должны выходить за пределы диапазона диапазона J7:AM32. исходный цвет диапазона J7:AM32 - задан в ячейке AW3 Как макросом закрасить ячейки в диапазоне J7:AM32 ?
(по итогу получится несколько пятен, не выходящих за пределы J7:AM32. Тут важно, чтобы получившиеся пятна были не квадратной, а более скругленной формы.)
Вот как видится примерно работа макроса: 1. Загнать в словари по имени цвет и радиус
Код
For r = 6 To 10
n = Cells(r, 48)
sz(n) = Cells(r, 49).Interior.Color
sr(n) = Cells(r, 50)
Next r
2. Перебрать все фигуры в регионе и определить цвет и радиус
Код
For Each sh In ActiveSheet.Shapes
n = sh.Name
If sz.exists(n) Then
zv = sz(n)
rr = sr(n)
Ну а дальше нужно найти центры фигур, и привязать их к номерам строк и колонок И проверяя номера строк и колонок на вхождение в радиус и на выход за пределы региона залить нужным цветом
Прикладываю скриншот того, что желательно получить в результате срабатывания макроса.
Кросс Особенно погано выглядит, как вы под "Вот как видится примерно работа макроса:" выдаёте чужое решение. Удачи вам на обоих сайтах с помощью!
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Dalm: какое чужое решение ? Мне там так и не ответили.
Вот ведь балабол
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Доброго дня! А чего Compile error? - Приведите полностью текст сообщения. Ну и как вариант: пишете в самом начале , после Sub и объявления переменных Stop и, запускаете макрос. Он остановится на Stop и далее по F8 - по-шагово смотрите на какой строке макрос реально "срубается". Ну, а дальше разбираетесь или разбираемся с этой строкой: чего, кого неправильно или чего не хватает. Без кода сложно помочь ... Успеха.
Вот, посидел немного:
Код
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
zv = arrN(1, i)
rr = arrN(2, i)
MsgBox "Цвет = " & zv & Chr(10) & "Радиус = " & rr, vbInformation + vbOKOnly, "" & n
Exit For
End If
Next i
Next
End Sub
написал: Григорий Калюга, ... Но этот макрос - тоже диапазон не раскрашивает. ...
Доброго дня! Дело в том, что я не совсем понял, ту задачу, которую Вы ставите. Я полагал, что "затык" в выдаваемой кодом ошибке, насколько я понимаю, связанной с тем, что Вам выдали, так сказать, схему, но не решение. Я попытался показать "старт" без ошибок: как Вы, вероятно, видите из предложенного кода, программа "сама" находит начало таблицы цветов и определяет ее нижнюю границу. Затем она "загоняет" имена фигур, номера цветов, и радиусы в 2-у мерный массив. Дальше, перебирая имеющиеся на листе .Shapes, она находит, такое же имя в массиве и записывает в переменные номер цвета и значение радиуса. И выводит в сообщении, для Вас, то, что она "творит" ... Дальше, А вот дальше я не понимаю: у Вас в таблице указано: "Фигура 1" и т.д., но "Фигура 1" - это, на самом деле 2-е, скажем так, "подфигуры", причем имеющие различные цвета. Какую из подфигур нужно "осчастливить" изменением в тот цвет, который мы записали из таблицы? Наверное, необходимо, более четко сформулировать условия ТЗ (тех. задания) ...
Да, и еще. В первом посту темы, речь идет о ячейках (т.е. .Cells) фигуры. А в предложенном Вами коде используется .Shapes. Это, мягко говоря, не совсем одно и то же ... Хотя, если Вам нужны округлости фигур, то без .Shapes, вероятно не обойтись. Только их нужно "заключить" в границы ячеек.
Изменено: Григорий Калюга - 27.10.2022 06:40:36(добавил данные)
написал: это уже не слабо! мог и этого не вывести)
- ну, таки ж, выводить! )
Доброго дня, уважаемый Игорь! Это уже для моей "самонеобразованности" ) Вот тут
Код
If arrN(0, i) = n Then
'ws.Shapes(n).Select
попытался "попросить" программу показывать то, что она нашла, но: - не срабатывает в ходе выполнения, лишь после отработки кода светит крайнюю найденную, Как сделать так, чтобы селектила каждую найденную? Подскажите, если знаете? Да, поскольку строка не решала задачу - закомментил, но ... вопрос остался ...
Sub Circles()
Dim a, b, c&, d, rg As Range
Set d = CreateObject("Scripting.Dictionary")
Set rg = [av5].CurrentRegion
For r = 2 To rg.Rows.Count
ReDim b(1 To 2): b(1) = rg(r, 2).Interior.Color
b(2) = rg(r, 3): d(rg(r, 1).Value) = b
Next r
For Each sh In ActiveSheet.Shapes
sh.Select
DoEvents: Stop
Next
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Ну как по мне, так Вы достаточно получили информации, что бы сделать это самостоятельно. Мне кажется, что в Вашем понимании помощь это сделайте за меня
написал: Дальше, А вот дальше я не понимаю: у Вас в таблице указано: "Фигура 1" и т.д., но "Фигура 1" - это, на самом деле 2-е, скажем так, "подфигуры", причем имеющие различные цвета. Какую из подфигур нужно "осчастливить" изменением в тот цвет, который мы записали из таблицы?
А что за подфигуры ? Там же в таблице - например стоит Фигура1 - ей соответствует желтый цвет. В диапазоне J7:AM32 - размещены две фигуры с названием Фигура1. То есть в этом диапазоне - ячейки закрасятся в виде - двух желтых пятен.
нужны не скриншоты, а файл с обьяснениями, как получено то или иное пятно и почему именно такой формы, почему оно расположено тут, а не правее или выше. лично мне не интересно это все угадывать, я предпочитаю прочитать обьяснения
И так, приступим: 1) термин "подфигура" я использовал, чтобы обратить Ваше внимание, на то, что представленные Вами "Фигура 1" ... "Фигура N" есть ни что иное, как Сгруппированная из 2-х фигур Фигура (извините за тавтологию). Например: в самом верху слева в обозначенном Вами поле находится фигура с именем "Фигура 2". На самом деле - это: - Скругленный прямоугольник 5 - синего цвета и - Прямоугольник 6 - красного цвета. Когда Вы говорите "покрасить", то встает вопрос, который я Вам и задал: КАКУЮ из этих 2-х фигур красить? Ведь не просто так Вы их сгруппировали. Впрочем, осмелюсь предположить, что Вы о Группировке не подозревали? Коли говорите, что имеем дело с ПРОСТО "Фигурой 1". 2) Вам, глубоко мною уважаемые коллеги, написали, да собственно и я предлагал: Сформулировать более развернутое описание, которое ответит, в том числе и на вопрос: как следует поступить с цветом "Прямоугольник 6", при окрашивании "Скругленный прямоугольник 5"? И еще внимательно перечитайте вопросы, заданные мной в пост № 12. Вы, к сожалению, на них не посчитали нужным ответить. ПС: Уважаемый Dalm призываю Вас внимательнее относится к тому, что люди, откликающиеся на Ваше "Помогите", вовсе необязаны терпеть Ваше вот такое отношение к их труду и желанию Вам помочь. Поймите, я не хочу Вас обидеть, но Эта тема, могла тихо схлопнутся, еще на пост № 6.
написал: Сгруппированная из 2-х фигур Фигура (извините за тавтологию). Например: в самом верху слева в обозначенном Вами поле находится фигура с именем "Фигура 2". На самом деле - это:- Скругленный прямоугольник 5 - синего цвета и- Прямоугольник 6 - красного цвета.
Да все так. Это Группа с названием Фигура1. Именно это название указано в таблице.
Цитата
написал: Когда Вы говорите "покрасить", то встает вопрос, который я Вам и задал: КАКУЮ из этих 2-х фигур красить?
Так я же это в начале вроде описал. Есть группа с названием Фигура1. У этой группы есть геометрический центр, который соответствует какой-то ячейке. И вот по этому центру - нужно закрасить ячейки своим цветом (цвет тоже указан в таблице и для Фигура1 он желтый) и своим радиусом. В итоге после срабатывания макроса - в диапазоне J7:AM32 появятся несколько пятен разного размера и радиуса. Примерный вид - показал на скриншоте.
Цитата
написал: как следует поступить с цветом "Прямоугольник 6", при окрашивании "Скругленный прямоугольник 5"?
А при чем тут "Пямоугольник 6" и "Скругленный прямоугольник 5" ? Они же в таблице не указаны. В таблице указаны - "Фигура1", "Фигура2" и т.д. Вот только о них и идет речь - о тех фигурах которые указаны в таблице..
я давно сделал как понял и предложил автору алгоритм решения на другом форуме 1. загнать в словари радиусы и цвета 2. перебрать шапы на листе 3. для каждого шапа назначить из словарей цвет и радиус 3. для каждого шапа рассчитать центр 4. с помощью дополнительной функции определить номер строки и номер колонки 5. в цикле от найденной строки - радиус до найденной строки + радиус 6. в цикле от найденной колонки - радиус до найденной колонки + радиус 7. с проверкой на вхождение в радиус 8. с проверкой на вхождение в заданный регион 9. залить ячейку нужным цветом end if end if next c next r
написал: Вот только о них и идет речь - о тех фигурах которые указаны в таблице..
Ну, вот: - Красит ...
Код
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
'Меняем высоту и ширину фигуры
'.Height = 150
'.Width = 100
'Меняем цвет фигуры
.Fill.ForeColor.RGB = zv
End With
Exit For
End If
Next i
Next
End Sub