День добрый,уважаемые программисты. Помогите с решением проблемы.
На листе экселя - находится диапазон ячеек. В этом диапазоне находятся ячейки разного цвета. В месте соприкосновения ячеек с разной окраской - нужно, чтобы на границе возникала линия. То есть линия границы ячейки. Как это можно сделать макросом?
День добрый,уважаемые программисты. Помогите с решением проблемы.
На листе экселя - находится диапазон ячеек. В этом диапазоне находятся ячейки разного цвета. В месте соприкосновения ячеек с разной окраской - нужно, чтобы на границе возникала линия. То есть линия границы ячейки. Как это можно сделать макросом?rotten41
это сколько? как происходит закрашивание - последовательно или поле уже покрашено и надо только пройтись границы проставить? и ключевое - какова конечная цель мероприятия?
rotten41,
Цитата
Цветов очень много
это сколько? как происходит закрашивание - последовательно или поле уже покрашено и надо только пройтись границы проставить? и ключевое - какова конечная цель мероприятия?buchlotnik
buchlotnik, сколько именно цветов? Ну не знаю точно - много, включая оттенки. Насколько я помню - эксель же присваивает цветам номера. Поэтому (я конечно не специалист) - подумал, что макрос будет просто сравнивать цветовой код своей ячейки - с окружающими (и срабатывать если они отличаются).
Как происходит окрашивание. Мне кажется, что - надо только пройтись по окрашенному полю и проставить границы.
Конечная цель - очертить контуры разных цветовых областей, имеющие неправильный геометрический силуэт, чтобы они более четко смотрелись. Еще есть такой метод визуалицации - тепловая карта, там тоже - этот код будет очень полезным. И не только это.
buchlotnik, сколько именно цветов? Ну не знаю точно - много, включая оттенки. Насколько я помню - эксель же присваивает цветам номера. Поэтому (я конечно не специалист) - подумал, что макрос будет просто сравнивать цветовой код своей ячейки - с окружающими (и срабатывать если они отличаются).
Как происходит окрашивание. Мне кажется, что - надо только пройтись по окрашенному полю и проставить границы.
Конечная цель - очертить контуры разных цветовых областей, имеющие неправильный геометрический силуэт, чтобы они более четко смотрелись. Еще есть такой метод визуалицации - тепловая карта, там тоже - этот код будет очень полезным. И не только это.rotten41
Сообщение отредактировал rotten41 - Четверг, 05.01.2017, 09:38
выделяем, запускаем, ждем часа 3-4 (или пару минут, как повезет) [vba]
Код
Sub Line_18() Application.ScreenUpdating = 0 '------------------------------------------------------------- For Each e In Selection If e.Interior.Color <> e.Offset(0, 1).Interior.Color And e.Interior.Color <> 16777215 And e.Offset(0, 1).Interior.Color <> 16777215 Then With e.Borders(xlEdgeRight) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With End If Next '------------------------------------------------------------- For Each e In Selection If e.Interior.Color <> e.Offset(1, 0).Interior.Color And e.Interior.Color <> 16777215 And e.Offset(1, 0).Interior.Color <> 16777215 Then With e.Borders(xlEdgeBottom) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With End If Next End Sub
[/vba]
выделяем, запускаем, ждем часа 3-4 (или пару минут, как повезет) [vba]
Код
Sub Line_18() Application.ScreenUpdating = 0 '------------------------------------------------------------- For Each e In Selection If e.Interior.Color <> e.Offset(0, 1).Interior.Color And e.Interior.Color <> 16777215 And e.Offset(0, 1).Interior.Color <> 16777215 Then With e.Borders(xlEdgeRight) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With End If Next '------------------------------------------------------------- For Each e In Selection If e.Interior.Color <> e.Offset(1, 0).Interior.Color And e.Interior.Color <> 16777215 And e.Offset(1, 0).Interior.Color <> 16777215 Then With e.Borders(xlEdgeBottom) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlMedium End With End If Next End Sub
For Each Mycell In Selection Mycell.Activate For i = 0 To 3 ' можно 0 то 1 If Mycell.Offset(MyRow(i), myColumn(i)).Interior.Color <> Mycell.Interior.Color And _ Mycell.Interior.Color <> 16777215 And _ Mycell.Offset(MyRow(i), myColumn(i)).Interior.Color <> 16777215 Then
With Mycell.Borders(myEdge(i)) .LineStyle = xlContinuous .ColorIndex = xlAutomatic .TintAndShade = 0 .Weight = xlMedium End With End If Next i Next Application.ScreenUpdating = true End Sub
For Each Mycell In Selection Mycell.Activate For i = 0 To 3 ' можно 0 то 1 If Mycell.Offset(MyRow(i), myColumn(i)).Interior.Color <> Mycell.Interior.Color And _ Mycell.Interior.Color <> 16777215 And _ Mycell.Offset(MyRow(i), myColumn(i)).Interior.Color <> 16777215 Then
With Mycell.Borders(myEdge(i)) .LineStyle = xlContinuous .ColorIndex = xlAutomatic .TintAndShade = 0 .Weight = xlMedium End With End If Next i Next Application.ScreenUpdating = true End Sub
черт, :-) не убрал строку :-) Mycell.Activate , сперва в масиив не туда единичку поставил, а так отлаживать проще. Белый - все как в задании :-). раз два человека одинаково поняли, значит так было написано :-)
Яб еще область обработки привел к размерам используемой в пределах выделенного. тогда совсем будет быстро.
[vba]
Код
Sub Border() Debug.Print Now Application.ScreenUpdating = False myEdge = Array(xlEdgeLeft, xlEdgeTop, xlEdgeBottom, xlEdgeRight) MyRow = Array(0, -1, 1, 0) myColumn = Array(-1, 0, 0, 1) If Selection.Row > ActiveSheet.UsedRange.Row Then WorkRow1 = Selection.Row Else WorkRow1 = ActiveSheet.UsedRange.Row End If If Selection.Row + Selection.Rows.Count < ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count Then WorkRow2 = Selection.Row + Selection.Rows.Count Else WorkRow2 = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1 End If If Selection.Column > ActiveSheet.UsedRange.Column Then WorkColumn1 = Selection.Column Else WorkColumn1 = ActiveSheet.UsedRange.Column End If If Selection.Column + Selection.Columns.Count < ActiveSheet.UsedRange.Column + ActiveSheet.UsedRange.Columns.Count Then WorkColumn2 = Selection.Columns.Count + Selection.Columns.Count - 1 Else WorkColumn2 = ActiveSheet.UsedRange.Column + ActiveSheet.UsedRange.Columns.Count - 1 End If
For Each mycell In ActiveSheet.Range(Cells(WorkRow1, WorkColumn1), Cells(WorkRow2, WorkColumn2)) For i = 2 To 3 If mycell.Offset(MyRow(i), myColumn(i)).Interior.Color <> mycell.Interior.Color Then With mycell.Borders(myEdge(i)) .LineStyle = xlContinuous .ColorIndex = xlAutomatic .TintAndShade = 0 .Weight = xlMedium End With End If Next i Next Application.ScreenUpdating = True Debug.Print Now End Sub
[/vba]
rotten41,
черт, :-) не убрал строку :-) Mycell.Activate , сперва в масиив не туда единичку поставил, а так отлаживать проще. Белый - все как в задании :-). раз два человека одинаково поняли, значит так было написано :-)
Яб еще область обработки привел к размерам используемой в пределах выделенного. тогда совсем будет быстро.
[vba]
Код
Sub Border() Debug.Print Now Application.ScreenUpdating = False myEdge = Array(xlEdgeLeft, xlEdgeTop, xlEdgeBottom, xlEdgeRight) MyRow = Array(0, -1, 1, 0) myColumn = Array(-1, 0, 0, 1) If Selection.Row > ActiveSheet.UsedRange.Row Then WorkRow1 = Selection.Row Else WorkRow1 = ActiveSheet.UsedRange.Row End If If Selection.Row + Selection.Rows.Count < ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count Then WorkRow2 = Selection.Row + Selection.Rows.Count Else WorkRow2 = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1 End If If Selection.Column > ActiveSheet.UsedRange.Column Then WorkColumn1 = Selection.Column Else WorkColumn1 = ActiveSheet.UsedRange.Column End If If Selection.Column + Selection.Columns.Count < ActiveSheet.UsedRange.Column + ActiveSheet.UsedRange.Columns.Count Then WorkColumn2 = Selection.Columns.Count + Selection.Columns.Count - 1 Else WorkColumn2 = ActiveSheet.UsedRange.Column + ActiveSheet.UsedRange.Columns.Count - 1 End If
For Each mycell In ActiveSheet.Range(Cells(WorkRow1, WorkColumn1), Cells(WorkRow2, WorkColumn2)) For i = 2 To 3 If mycell.Offset(MyRow(i), myColumn(i)).Interior.Color <> mycell.Interior.Color Then With mycell.Borders(myEdge(i)) .LineStyle = xlContinuous .ColorIndex = xlAutomatic .TintAndShade = 0 .Weight = xlMedium End With End If Next i Next Application.ScreenUpdating = True Debug.Print Now End Sub