Страницы: Пред. 1 2 3 След.
RSS
Как макросом закрасить ячейки, ориентируясь на центры фигур
 
Цитата
Александр Моторин
написал:
3. для каждого шапа назначить из словарей цвет и радиус
с цветом - понятно. А вот с радиусом, подскажите, пожалуйста. Это для моего "ограмотнения": - там же, прямоугольники, куда радиус применять?
Изменено: Григорий Калюга - 27.10.2022 21:17:23
 
не то красит
Цитата
радиус от центра этой фигуры, на котором должны закрашиваться ячейки в этот цвет.
 
Григорий Калюга,  большое спасибо.
Цвет макрос верно определил, но покрасил немного не то.
Он красит фигуры, цвет которых менять не нужно.
Нужно закрасить ячейки, как изображено на скриншоте.
 
Код
                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 - радиус
Цитата
куда радиус применять?
Сумма квадратов раззниц координат должна быть меньше квадрата радиуса
По принципу вхождения точки в круг
Изменено: Александр Моторин - 27.10.2022 21:38:26
 
Цитата
написал:
Есть группа с названием Фигура1.
У этой группы есть геометрический центр, который соответствует какой-то ячейке.
И вот по этому центру - нужно закрасить ячейки своим цветом (цвет тоже указан в таблице и для Фигура1 он желтый) и своим радиусом.
1. в предложенном Вами файле Фигуры никак к ячейкам не привязаны. Можно программно узнать привязку Shape-са к ячейке, но только левым верхним углом:
типа
Код
adr = sh.TopLeftCell.Address
а вот центр фигуры - это уже программно, только нужно понимать, что за фигура Вам нужна?

2. Вы все время толкуете о радиусе, а в примере прямоугольники. И где там радиус?  
 
Цитата
написал:
1. в предложенном Вами файле Фигуры никак к ячейкам не привязаны.
Имеется ввиду геометрический центр Фигуры (Фигура - это группа с названием "Фигура").
Он попадает на какую-то ячейку.
Вот эта ячейка, на которую он попадает - это и есть центр пятна (залитых определенным цветом ячеек).
(если указывать левый верхний угол, то это будет не центр фигуры и пятно получится смещено влево-вверх. А нужно чтобы оно было более-менее по центру.)
Цитата
написал:
2. Вы все время толкуете о радиусе, а в примере прямоугольники. И где там радиус?  
Ну "радиус" тут понятное дело - в кавычках.
Условный радиус.
Ведь пятно из залитых ячеек - не должно получиться в виде большого прямоугольника, оно должно быть как-то приближено немного к круглому.
Изменено: Dalm - 27.10.2022 21:43:42
 
примерно так
Код
    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 ' центр у

дальше ваш код и конец цикла перебора шапов
Изменено: Александр Моторин - 27.10.2022 21:48:43
 
Александр Моторин,  вот это куда поставить - в начало или конец ?
 
Цитата
написал:
rr - радиус
Ну, как то так:
Код
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

- красит Ваши "амебы" ;)
Изменено: Григорий Калюга - 27.10.2022 22:08:59
 
Цитата
написал:
примерно так
то то и оно, что примерно.
Вот тут:
Код
If r > 6 And r < 33 And c > 9 And c < 40 Then ' границы поля
     'красим
     ws.Cells(r, c).Interior.Color = zv
End If
координаты указаны в количестве строк и столбцов.
А тут:
Код
x0 = sh.Left + sh.Width / 2 ' центр х
y0 = sh.Top + sh.Height / 2 ' центр у
в pt-х, т.е. долях дюйма. Или я неправ?

Мыслю, что-то к чему-то пересчитывать нужно ...
 
Код
                    Y = k.Row
                    X = k.Column
Это будет немного не корректно
надо искать ячейку где находится центр фигуры
Это допустимо если фигура помещается в ячейку
Изменено: Александр Моторин - 27.10.2022 22:18:52
 
Григорий Калюга, спасибо.
Все раскрашивает, но только тут центры пятен не совпадают с центрами Фигур.
Они смещены сейчас - слишком влево-вверх (по диагонали).
Изменено: Dalm - 27.10.2022 22:19:01
 
Цитата
написал:
Это будет немного не корректно
Ну, так я же писал в пост № 40 ...
Значит границы диапазона, тоже нужно пересчитать и сравнивать в долях дюйма. Вот для этой строки:
Код
If r > 6 And r < 33 And c > 9 And c < 40 Then ' границы поля
А
Цитата
искать ячейку где находится центр фигуры
Вы, уважаемый Мастер, уже показали как посчитать, вот здесь:
Код
x0 = sh.Left + sh.Width / 2 ' центр х
y0 = sh.Top + sh.Height / 2 ' центр у
 
Цитата
Григорий Калюга написал:
2. Вы все время толкуете о радиусе, а в примере прямоугольники. И где там радиус?
радиус, как суслик: его не видно, но он есть!
эта проблема решена еще во времена Пифагора и Архимеда, когда удалось посчитать площадь круглой фигуры в квадратных единицах (чем больше размеры квадратиков тем хуже они описывают круг и наоборот)
Изменено: Ігор Гончаренко - 27.10.2022 23:03:13
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Это координаты центра фигуры
А надо найти номера строки и колонки ячейки где находится центр
У меня для этого функция, в которой перебираются ячейки диапазона и ищется ячейка где находится центр фигуры
И уже от этой ячейки плясать
Цитата
Вот для этой строки:
Нет пересчитывать не надо
Там достаточно проверять номера строк и столбцов чтобы амёба не вылезала за границы
 
Нужно просто сдвинуть это пятно - по диагонали немного вправо-вниз.
 
По центру нужно
Изменено: Dalm - 27.10.2022 23:52:27
 
заголовок темы:
Цитата
Dalm написал:
Как макросом закрасить ячейки, ориентируясь на центры фигур
сообщение 47
Цитата
Dalm написал:
По центру нужно
какая новая информация о задаче здесь сообщена? что из того, что не было известно о задаче раньше уточнила эта фраза?
Изменено: Ігор Гончаренко - 28.10.2022 08:23:48
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко,  ну так и ?
Цитата
написал:
ориентируясь на центры фигур
Я же в заголовке так и написал - что по центрам нужно.
Вот вроде код определения центра:
Код
x0 = sh.Left + sh.Width / 2 ' центр х
y0 = sh.Top + sh.Height / 2 ' центр у
Куда его в макросе нужно поставить, чтобы по центрам фигур пятна расставлялись ?
Сейчас пока выглядит вот так:
 
Цитата
написал:
Куда его в макросе нужно поставить, чтобы по центрам фигур пятна расставлялись ?
Вы, к сожалению, невнимательно читаете, что Вам пишут коллеги ... Вот здесь:
Цитата
написал:
Это координаты центра фигуры А надо найти номера строки и колонки ячейки где находится центрУ меня для этого функция, в которой перебираются ячейки диапазона и ищется ячейка где находится центр фигуры
или просите уважаемого Александра подарить Вам функцию, или подождите до вечера. Я пока на работе и, немного занят ...

ПС: почему то в окне скопированной цитаты автор ее показывается, а при выводе сообщения в форуме - куда то прячется. Куда ...?? :)
Изменено: Григорий Калюга - 28.10.2022 10:48:50
 
Цитата
Dalm написал:
ну так и ?
когда пишу, что не понимаю задачу - нужно уточнять задачу, а не повторять то, что уже написано
мне уже ничего уточнять не нужно, на мои посты не обращайте внимания)
а свою задачу вы скоро решите (может быть). 50 сообщений в теме- не так уже и много, еще 50 или сотня-другая и все будет готово в лучшем виде
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Григорий Калюга написал:
Куда ...??
в строке с инструментами для форматирования сообщения в самом конце есть кнопка ВВ. пишите сообщения в режиме "ВВ нажата"
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Помогите  
 
Цитата
Dalm написал:
Помогите  
вы не хотите помочь себе сами? (обьяснить что вам нужно)
может в тему подтянутся люди, которые хоть что-то поймут и решат вашу задачу
поймите никто не будет с карандашем и бумагой перечитывает весь написанный тут мусор (в чпстности данное сообщение) чтобы выбрать из тонн мусора крупицы условий задачи
неужели это не понятно?

фраза "Помогите", просто исчерпывающе обьясняет суть задачи. теперь каждому понятно, что нужно помочь, не понятно правда в чем помочь и чем
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Вот вроде код определения центра:
Код
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 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
 
Цитата
Григорий Калюга написал:
Как и обещал
так я спать не ложился, думаю когда уже... Калюга же обещал
как вы думаете написанное вами можно уложить в 25-30 строк кода?
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Григорий Калюга, спасибо вам большое.
Сразу видно кто тут - специалист с большой буквы.
 
Цитата
Dalm написал:
Сразу видно
это к 59 сообщению прояснилось?
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Страницы: Пред. 1 2 3 След.
Наверх