Выделение повторений разными цветами

Автор Aleksandr H., 22 мая 2014, 22:22

0 Пользователи и 1 гость просматривают эту тему.

joshua

Rami спасибо тебе. Но почему то если повторы идут подряд(например одинаковые первые три значения) и они больше нигде не встречаются, то они не выделяются.

А если в выделение попадают пустые ячейки то он вылетает с ошибкой

Логику алгоритма в целом понял, но ошибки эти отловить увы не могу :(
Маэстро, выручай

rami

Цитата: joshua от 18 августа 2016, 09:01А если в выделение попадают пустые ячейки то он вылетает с ошибкой
Это потому, что Apache OpenOffice не обрабатывает пустую ячейку как ноль. В LibreOffice это можно настроить.

Сделал так же для Apache OpenOffice:

joshua

Rami, спасибо большое!
...ушел вносить вклад в форум)

SergeyK

Rami, спасибо огромное за полезный макрос. Можно ли как то сделать так чтобы он выделял цветом всю строку, а не только ячейку с совпавшими данными?
В диапазоне всегда будет один столбец.

rami

Цитата: SergeyK от 14 марта 2017, 11:37Можно ли как то сделать так чтобы он выделял цветом всю строку, а не только ячейку с совпавшими данными?
Выделять строку будет на ширину выбранного диапазона, поиск по первому столбцу диапазона.

VitaliyAT

Работает, если текст в ячейке чистый. Без формул. Даже простое =A1 роняет скрипт. Есть более универсальный вариант? Зачастую то, что сравнивается, перед этим вычисляется или стягивается для наглядности в одно место, а без формул этого не сделать.

rami

Пробовал на разных версиях LibreOffice 7.2.1.1, LibreOffice 5.0.6 и Apache OpenOffice 4.2 на маке, ничего не падает. Сделал чтобы учитывало формулы. Если будут проблемы, пишите на чём работаете и что делаете. Проверяйте:

Ravstin

Добрый вечер!

Скачал последнюю версию этого уникального скрипта (который не про выделение строк), но возникают сложности с его работой...
REM  *****  BASIC  *****
Sub Main Dim oRange, oReplace, iRow%, iCol%, i%, a(), k%
oRange=ThisComponent.CurrentSelection
oRange.CellBackColor=-1
RangeAddress=oRange.getRangeAddress()
oSearch=oRange.createSearchDescriptor()
For iCol=RangeAddress.StartColumn To RangeAddress.EndColumn
For iRow=RangeAddress.StartRow To RangeAddress.EndRow
oCell=oRange.SpreadSheet.getCellByPosition(iCol,iRow)
If oCell.CellBackColor>0 Or oCell.String="" Then GoTo Line1 Else
oSearch.SearchWords=True
oSearch.setSearchString(oCell.String)
oFind=oRange.findAll(oSearch)
If oFind.Count<2 And isNull(oRange.findNext(oFind,oSearch)) Then GoTo Line1 Else
If k>15 Then k=0
k=k+1
a=array(234790,13421772,4700344,10053324,10079487,1434450,13625433,14614494,15138660,15222109,15461270,_
16543210,16744450,16768734,16771111)
For i=0 To oFind.Count-1
oFind.getByIndex(i).CellBackColor=a(k)
Next
Line1:
Next
Next
End Sub

В ситуации, когда нужно больше 15 цветов - открывается окно редактирования скрипта с ошибкой
Inadmissible value or data type.
Index out of defined range.

Ссылается на строку oFind.getByIndex(i).CellBackColor=a(k)

mikekaganski

Цитата: Ravstin от 20 июля 2022, 10:40If k>15 Then k=0

Замените > на >=, либо поменяйте местами строки "If k>15 Then k=0" и "k=k+1".
С уважением,
Михаил Каганский

rami

Пробуйте так:
Sub Main
Dim a(), oRange, RangeAddress, oSearch, oReplace, iCol%, iRow%, oCell, oFind, k%, i%
a = array(234790, 13421772, 4700344, 10053324, 10079487, 1434450, 13625433, 14614494, 15138660, 15222109, 15461270, _
16543210, 16744450, 16768734, 16771111, 16777113)

oRange = ThisComponent.CurrentSelection
oRange.CellBackColor = -1
RangeAddress = oRange.getRangeAddress()
oSearch = oRange.createSearchDescriptor()
oSearch.SearchWords = True
For iCol = RangeAddress.StartColumn To RangeAddress.EndColumn
For iRow = RangeAddress.StartRow To RangeAddress.EndRow
oCell = oRange.SpreadSheet.getCellByPosition(iCol,iRow)
If oCell.CellBackColor < 0 Then
oSearch.setSearchString(oCell.String)
oFind = oRange.findAll(oSearch)
If oFind.Count > 1 Then
If k > UBound(a) Then k = 0
For i = 0 To oFind.Count - 1
oFind.getByIndex(i).CellBackColor = a(k)
Next
k = k + 1
EndIf
EndIf
Next
Next
End Sub

Ravstin

Спасибо Вам, маэстро - заработало после того И поменял местами строки И дописал If k>=15

К сожалению, второй вариант ничего не выполнил, хотя вроде просто в редакторе текст макроса заменил :<