Страницы: 1 2 3 След.
RSS
Как макросом закрасить ячейки, ориентируясь на центры фигур
 
Здравствуйте.
Помогите.

Вопрос вот какой:
На листе находятся несколько фигур с разными названиями.
Рядом таблица, в которой каждому названию фигуры - соответствует свой цвет и радиус от центра этой фигуры, на котором должны закрашиваться ячейки в этот цвет.
Пятна не должны выходить за пределы диапазона диапазона 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 - 26.10.2022 11:54:32
 
Кросс
Особенно погано выглядит, как вы под "Вот как видится примерно работа макроса:" выдаёте чужое решение.
Удачи вам на обоих сайтах с помощью!
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, какое чужое решение ?
Мне там так и не ответили.
 
Цитата
Dalm: какое чужое решение ? Мне там так и не ответили.
Вот ведь балабол
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, И ?
А что же не всю переписку публикуете?  Я же там писал, что не работает это решение.

И насколько помню, правилами форума - запрещается оскорбления участников.
 
Цитата
Ну а дальше нужно найти центры фигур
А какая в этом проблема?
Известны Left и Wldth!
Проблема к  Left прибавить половину Wldth!?
Хоть чуть-чуть вспомни школьную программу
 
Александр Моторин, ну вот спрашиваю знающих людей - как это макросом можно сделать.
имеющийся макрос - не срабатывает. Выдает ошибку - Compile error
 
Помогите
 
Цитата
написал:
Выдает ошибку - Compile error
Доброго дня!
А чего 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
Во всяком случае работает без "error" ;)  
Изменено: Григорий Калюга - 26.10.2022 21:52:48
 
Григорий Калюга, спасибо.
Но этот макрос - тоже диапазон не раскрашивает.
Только выводит сообщения - номер цвета и величину радиуса.
 
Цитата
Dalm написал:
Только выводит сообщения - номер цвета и величину радиуса
это уже не слабо! мог и этого не вывести)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
написал:
Григорий Калюга, ...
Но этот макрос - тоже диапазон не раскрашивает. ...
Доброго дня!
Дело в том, что я не совсем понял, ту задачу, которую Вы ставите. Я полагал, что "затык" в выдаваемой кодом ошибке, насколько я понимаю, связанной с тем, что Вам выдали, так сказать, схему, но не решение. Я попытался показать "старт" без ошибок: как Вы, вероятно, видите из предложенного кода, программа "сама" находит начало таблицы цветов и определяет ее нижнюю границу. Затем она "загоняет" имена фигур, номера цветов, и радиусы в 2-у мерный массив. Дальше, перебирая имеющиеся на листе .Shapes, она находит, такое же имя в массиве и записывает в переменные номер цвета и значение радиуса. И выводит в сообщении, для Вас, то, что она "творит" ... Дальше, А вот дальше я не понимаю: у Вас в таблице указано: "Фигура 1" и т.д., но "Фигура 1" - это, на самом деле 2-е, скажем так, "подфигуры", причем имеющие различные цвета. Какую из подфигур нужно "осчастливить" изменением в тот цвет, который мы записали из таблицы? Наверное, необходимо, более четко сформулировать условия ТЗ (тех. задания) ...

Да, и еще. В первом посту темы, речь идет о ячейках (т.е. .Cells) фигуры. А в предложенном Вами коде используется .Shapes. Это, мягко говоря, не совсем одно и то же ... Хотя, если Вам нужны округлости фигур, то без .Shapes, вероятно не обойтись. Только их нужно "заключить" в границы ячеек.
Изменено: Григорий Калюга - 27.10.2022 06:40:36 (добавил данные)
 
Цитата
написал: это уже не слабо! мог и этого не вывести)
- ну, таки ж, выводить! ;))

Доброго дня, уважаемый Игорь!
Это уже для моей "самонеобразованности" :))
Вот тут
Код
If arrN(0, i) = n Then
    'ws.Shapes(n).Select
попытался "попросить" программу показывать то, что она нашла, но: - не срабатывает в ходе выполнения, лишь после отработки кода светит крайнюю найденную, Как сделать так, чтобы селектила каждую найденную? Подскажите, если знаете?
Да, поскольку строка не решала задачу - закомментил, но ... вопрос остался ...
Изменено: Григорий Калюга - 27.10.2022 06:19:35
 
Григорий Калюга,
Код
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
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Григорий Калюга написал:
Как сделать так, чтобы селектила каждую найденную?
Код
ws.Shapes(n).Select False
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Что-то все равно не раскрашивает диапазон.
Даже если
Код
ws.Shapes(n).Select False
добавить
 
еще строк 30-40 кода и раскрасит
но не факт, что так как вам нужно, потому что как нужно - пока знаете только вы((
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, ну я же там скриншот привел.
 
Ну как по мне, так Вы достаточно получили информации, что бы сделать это самостоятельно. Мне кажется, что в Вашем понимании помощь это сделайте за меня :(
Изменено: Msi2102 - 27.10.2022 11:25:08
 
Цитата
написал:
Дальше, А вот дальше я не понимаю: у Вас в таблице указано: "Фигура 1" и т.д., но "Фигура 1" - это, на самом деле 2-е, скажем так, "подфигуры", причем имеющие различные цвета. Какую из подфигур нужно "осчастливить" изменением в тот цвет, который мы записали из таблицы?
А что за подфигуры ?
Там же в таблице - например стоит Фигура1 - ей соответствует желтый цвет.
В диапазоне J7:AM32 - размещены две фигуры с названием Фигура1.
То есть в этом диапазоне - ячейки закрасятся в виде - двух желтых пятен.

(там никаких подфигур нет)
 
Помогите
 
Цитата
Dalm написал:
ну я же там скриншот привел.
нужны не скриншоты, а файл с обьяснениями, как получено то или иное пятно и почему именно такой формы, почему оно расположено тут, а не правее или выше. лично мне не интересно это все угадывать, я предпочитаю прочитать обьяснения
Изменено: Ігор Гончаренко - 27.10.2022 16:31:14
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
И так, приступим:
1) термин "подфигура" я использовал, чтобы обратить Ваше внимание, на то, что представленные Вами "Фигура 1" ... "Фигура N" есть ни что иное, как Сгруппированная из 2-х фигур Фигура (извините за тавтологию). Например: в самом верху слева в обозначенном Вами поле находится фигура с именем "Фигура 2". На самом деле - это:
- Скругленный прямоугольник 5 - синего цвета и
- Прямоугольник 6 - красного цвета.
Когда Вы говорите "покрасить", то встает вопрос, который я Вам и задал: КАКУЮ из этих 2-х фигур красить? Ведь не просто так Вы их сгруппировали. Впрочем, осмелюсь предположить, что Вы о Группировке не подозревали? Коли говорите, что имеем дело с ПРОСТО "Фигурой 1".
2) Вам, глубоко мною уважаемые коллеги, написали, да собственно и я предлагал: Сформулировать более развернутое описание, которое ответит, в том числе и на вопрос: как следует поступить с цветом "Прямоугольник 6", при окрашивании "Скругленный прямоугольник 5"? И еще внимательно перечитайте вопросы, заданные мной в пост № 12. Вы, к сожалению, на них не посчитали нужным ответить.
ПС: Уважаемый Dalm призываю Вас внимательнее относится к тому, что люди, откликающиеся на Ваше "Помогите", вовсе необязаны терпеть Ваше вот такое отношение к их труду и желанию Вам помочь. Поймите, я не хочу Вас обидеть, но Эта тема, могла тихо схлопнутся, еще на пост № 6.  
 
Цитата
написал:
Что-то все равно не раскрашивает диапазон.Даже еслиКод ? 1ws.Shapes(n).Select Falseдобавить
С чего Вы взяли, что это должно что-то раскрашивать? Прочтите внимательно, на какой вопрос отвечали уважаемые коллеги.
 
Цитата
Помогите
Дай шанс! хоть немного начни делать
Сделать за тебя не является помощью
хочешь чтоб за тебя сделали обращайся во фриланс
 
Dalm,
я не очень понимаю что нужно, а почитайте сообщение 23 и осознайте насколько можно вообще не понимать вашу задачу после ваших обьяснений
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
написал:
Сгруппированная из 2-х фигур Фигура (извините за тавтологию). Например: в самом верху слева в обозначенном Вами поле находится фигура с именем "Фигура 2". На самом деле - это:- Скругленный прямоугольник 5 - синего цвета и- Прямоугольник 6 - красного цвета.
Да все так. Это Группа с названием Фигура1.
Именно это название указано в таблице.
Цитата
написал:
Когда Вы говорите "покрасить", то встает вопрос, который я Вам и задал: КАКУЮ из этих 2-х фигур красить?
Так я же это в начале вроде описал.
Есть группа с названием Фигура1.
У этой группы есть геометрический центр, который соответствует какой-то ячейке.
И вот по этому центру - нужно закрасить ячейки своим цветом (цвет тоже указан в таблице и для Фигура1 он желтый) и своим радиусом.
В итоге после срабатывания макроса - в диапазоне J7:AM32 появятся несколько пятен разного размера и радиуса.
Примерный вид - показал на скриншоте.
Цитата
написал:
как следует поступить с цветом "Прямоугольник 6", при окрашивании "Скругленный прямоугольник 5"?
А при чем тут "Пямоугольник 6" и "Скругленный прямоугольник 5" ?
Они же в таблице не указаны.
В таблице указаны - "Фигура1", "Фигура2" и т.д.
Вот только о них и идет речь - о тех фигурах которые указаны в таблице..
 
 
Цитата
Dalm написал:
Так я же это в начале вроде описал.
все четко расписано. ждите - скоро повалят варианты решений
у темы полторы тысячи просмотров. сколько ответов по существу задачи? не подскажете
Изменено: Ігор Гончаренко - 27.10.2022 18:49:51
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
я давно сделал как понял и предложил автору алгоритм решения на другом форуме
1. загнать в словари радиусы и цвета
2. перебрать шапы на листе
3. для каждого шапа назначить из словарей цвет и радиус
3. для каждого шапа рассчитать центр
4. с помощью дополнительной функции определить номер строки и номер колонки
5. в цикле от найденной строки - радиус до найденной строки + радиус
   6.  в цикле от найденной колонки - радиус до найденной колонки + радиус
       7. с проверкой на вхождение в радиус
           8. с проверкой на вхождение в заданный регион
               9. залить ячейку нужным цветом
           end if
       end if
   next c
next r

сделай за меня не считаю помощью
удочку дал
Изменено: Александр Моторин - 27.10.2022 20:06:32
 
Цитата
написал:
Вот только о них и идет речь - о тех фигурах которые указаны в таблице..
Ну, вот: - Красит ...
Код
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
Страницы: 1 2 3 След.
Наверх