Условное форматирование

Автор Alder, 12 февраля 2015, 11:17

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

Alder

Добрый день.
Для работы, в LO (4.4) надо в большом кол-ве документов сверить данные на предмет повтора в 2-х колонках.
Есть функция "Условное форматирование", но это очень долго (выбрать стиль, значение, формы)
Нужно что бы выделив 2 колонки 1-м нажатием выделить повторы. Можно зелёным.

kompilainenn

#1
запишите макрос, в котором для уже выделенных ячеек будет настраиваться условное форматирование. Надеюсь диапазон ячеек один и тот же?

зы: а повторы нужно вообще есть в 1 столбце и есть во втором, или по строкам совпадение?

ззы: и по-моему этого условным форматированием не добиться, это нужно формулу рисовать на основе vlookup, ща гуру придут, расскажут, мне самому стало интересно...
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

Alder

#2
К сожалению, я не силен в данном языке и не знаю как сделать привязку к выделенному диапазону. (Да и вообще ноль, всё что умею это назвать макрос)
Диапазон меняется, все время меняются столбцы. Нужно сравнивать колонки и подсвечивать одинаковые значения ( и не пустые) или не повторяющиеся красным.
В идеале (я не про макрос) колонки должны иметь одинаковые данные, но человеческий фактор...

kompilainenn

и это, если возможно приложите образец файла
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

rami

Цитата: kompilainenn от 12 февраля 2015, 10:37ззы: и по-моему этого условным форматированием не добиться, это нужно формулу рисовать
Смысл условного форматирования в том, чтобы в случае выполнения условия применить заданный формат.
Добрые пожелания™ : "Я хочу ну, это как его..." не поддаются программированию.

kompilainenn

Цитата: rami от 12 февраля 2015, 11:38Добрые пожелания™ : "Я хочу ну, это как его..." не поддаются программированию.
хм, а разве ТС явно не сказал, что хотел бы увидеть подсветку дубликатов? я может не так понял его конечно...
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

rami

Цитата: Alder от 12 февраля 2015, 09:17надо в большом кол-ве документов сверить данные на предмет повтора в 2-х колонках.
Цитата: Alder от 12 февраля 2015, 10:53Диапазон меняется, все время меняются столбцы. Нужно сравнивать колонки и подсвечивать одинаковые значения ( и не пустые) или не повторяющиеся красным.
Очень явно и однозначно...
Что такое "дубликаты" , одинаковые ячейки? одинаковые столбцы?
Подобные задачи уже решались на форуме. Чем эта задача отличается от предыдущих?

JohnSUN

В общем, наверное, как-то так...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Alder

#8
Цитата: rami от 12 февраля 2015, 11:38Добрые пожелания™ : "Я хочу ну, это как его..." не поддаются программированию.
Я конечно извиняюсь, за плохо сформулированный вопрос, попробую ещё раз.

Есть 2 колонки с числовыми значениями.
Надо удостовериться что все числа из 1-го столбца соответствуют числам 2-го столбца.
Числа не отсортированы и находятся произвольном порядке.
Так же числа имеют денежный формат.
Местонахождения этих столбцов всегда в разных местах.

Цитата: rami от 12 февраля 2015, 12:17Подобные задачи уже решались на форуме. Чем эта задача отличается от предыдущих?
В предыдущих вопросах можно было использовать функцию:  "Условное форматирование" - "Условие" - "Дублирующиеся значения"
Но моя проблема заключается в том что на это тратится очень много времени.
Поэтому я и спрашиваю про макрос, который делает эту функцию сразу, без выбора стиля.

Цитата: JohnSUN от 12 февраля 2015, 12:35В общем, наверное, как-то так...
При нажатии не работает, либо версия другая (LO 4.3) либо туплю, пока посмотрю сам макрос.



rami

Цитата: Alder от 12 февраля 2015, 13:30При нажатии не работает, либо версия другая (LO 4.3) либо туплю
Ищите новую иконку(как на картинке в документе) в панели инструментов (она добавляется автоматом). Я тоже не сразу усёк куда жать.

Alder

Я просто добавил новую кнопку (Только потом её заметил)
Разобрался, убрал всплывающее окно и получил то, что хотел.
Спасибо за хлопоты.

Alder

#11
Появилась новая проблема, например:


43928478,11   (1 ячейка)
43893659,81   (2 ячейка)
=1 яч. - 2 яч. (3 ячейка)
34818,3         (4 ячейка)

Когда я выбираю скрипт для 3-тий и 4-той ячейке.
Выделяет красным. (как не схожии)

Можно ли изменить скрипт для денежного формата?

Заранее благодарен.



Alder

Sub colorDbl
Dim oCurrentSelection As Variant
Dim oActiveSheet As Variant
Dim oSelection As Variant
Dim oDataArray As Variant
Dim oData As Variant
Dim oElement As Variant
Dim aCounter As Variant
Dim i&, j&, k&, z&
Dim oSearchDescriptor As Variant
Dim oSearchResults As Variant
Dim sResult As String
Dim nCellBackColor As Long
oCurrentSelection = ThisComponent.getCurrentSelection()
If oCurrentSelection.supportsService("com.sun.star.table.Cell") Then ' Выделена только одна ячейка (то есть - ничего)
oActiveSheet = ThisComponent.getCurrentController().getActiveSheet()
oCurrentSelection = oActiveSheet.createCursor()
oCurrentSelection.gotoEndOfUsedArea(True)
EndIf
REM Чтобы не перебирать кучу пустых ячеек, выберем из выделения только непустые
oSearchDescriptor = oCurrentSelection.createSearchDescriptor()
oSearchDescriptor.SearchType = 1 ' Поиск по значениям
oSearchDescriptor.SearchRegularExpression = True
oSearchDescriptor.setSearchString(".+")
oSearchResults = oCurrentSelection.findAll(oSearchDescriptor)
aCounter = Array()
If IsEmpty(oSearchResults) Or IsNull(oSearchResults) Then
MsgBox("В указанном выделении нет ячеек для поиска дублей", 64, "Измените или снимите выделение")
Else
For i=0 To oSearchResults.getCount()-1
oSelection = oSearchResults.getByIndex(i)
oDataArray = oSelection.getDataArray()
For j = LBound(oDataArray) To UBound(oDataArray)
oData = oDataArray(j)
For k = LBound(oData) To UBound(oData)
z = (Fix(oData(k) * 100))/100
oElement = z
If oElement <> "" Then CountOrAdd(oElement, aCounter)
Next k
Next j
Next i
REM Информация собрана, для всех повторов - раскраска
oSearchDescriptor = oCurrentSelection.createSearchDescriptor()
oSearchDescriptor.SearchType = 1 ' Поиск по значениям
oSearchDescriptor.SearchWords = True
j = 0
k = 0
sResult = ""
For i=LBound(aCounter) To UBound(aCounter)
oData = aCounter(i)
oSearchDescriptor.setSearchString(oData(0))
oSearchResults = oCurrentSelection.findAll(oSearchDescriptor)
If oData(1) > 1 Then
j = j + 1
If sResult <> "" Then sResult = sResult +", "
nCellBackColor = RGB(180,255,180)
sResult = sResult + oData(0)
               
k = k + oSearchResults.getCount()
         
Else
nCellBackColor = RGB(255,180,180)
EndIf
oSearchResults.CellBackColor = nCellBackColor
Next i
If j = 0 Then
MsgBox("В указанном выделении дублей не обнаружено", 64, "Без результата")
Else
EndIf
EndIf
End Sub

Private Sub CountOrAdd(key, aData)
Dim l&, r&, m&, N&, i&
l=LBound(aData)
r=UBound(aData)+1
N=r
While (l<r)
m=l+Int((r-l)/2)
If aData(m)(0)<key Then
l=m+1
Else
r=m
EndIf
Wend
If r=N Then
ReDim Preserve aData(0 To N)
aData(N) = Array(key,1)
ElseIf  aData(r)(0)=key Then
aData(r)(1)=aData(r)(1)+1
Else
ReDim Preserve aData(0 To N)
For i = N-1 To r Step -1
aData(i+1)=aData(i)
Next i
aData(r) = Array(key,1)
EndIf
End Sub

Меняю код, но ошибка за ошибкой, сейчас ругается на нулевой oSearchResults.
Хотя я эту переменную даже не трогал
В строке:
k = k + oSearchResults.getCount()

JohnSUN

Ну, может быть, не то меняешь? Или не везде где надо?
Строка oSearchDescriptor.setSearchString(oData(0)) в первоначальном варианте заставляла макрос искать те же самые значения, которые были в ячейках. А после попытки преобразования Element = Fix/100 это уже не совсем то значение, нет?

Возможно, нужно менять не код, а формулу
Цитата: Alder от 11 мая 2016, 12:16
=1 яч. - 2 яч. (3 ячейка)
Например, так:
=ROUND(1 яч. - 2 яч.;2)
То есть, вынести в ячейку таблицы то, что ты пытаешься вкрутить в код с помощью
z = (Fix(oData(k) * 100))/100
oElement = z
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Alder

К сожалению вкрутить это в 100500 документов не вижу резона.
Легче сделать сразу 1 макрос на все случаи.
Подумаю ещё.

В строке
oSearchResults = oCurrentSelection.findAll(oSearchDescriptor)

Я как понял записываются все выделенные ячейки, но почему через 1 проход через цикл значение oCurrentSelection пустое?
И как мой FIX мешает, понять не могу.

ЦитироватьСтрока oSearchDescriptor.setSearchString(oData(0)) в первоначальном варианте заставляла макрос искать те же самые значения, которые были в ячейках. А после попытки преобразования Element = Fix/100 это уже не совсем то значение, нет?

Так как Round я не могу вставить (реально это работа на пол года, легче автоматизировать макросом). То из-за того что у меня денежные значения. Element = Fix/100*100 ближе к 4 яч. Чем то, что у меня получается при =1 яч. - 2 яч

Простите за мой тупняк. в Basice я ноль, знаю только как делать циклы в Pascele.