Макрос стандартного фильтра

Автор sofi, 30 августа 2014, 07:08

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

sofi

Доброго всем время дня!

Пытаюсь написать макрос удаляющий дубликаты в таблице по одному столбцу

Sub Filter_db()
Dim oSheet ' Лист для фильтра.
Dim oRange ' Диапазон для фильтрации.
Dim oFilterDesc 'Описатель фильтра.
Dim oFields(0) As New com.sun.star.sheet.TableFilterField

oSheet = ThisComponent.getSheets().getByIndex(2)
oRange = oSheet.getCellRangeByName("A15:M10050")

'создаем пустой описатель фильтра.
oFilterDesc = oRange.createFilterDescriptor(True)

'Задаем поле для просмотра ячеек
With oFields(0)
.Field = 3 ' Фильтр по Столбцу D.
.Operator = com.sun.star.sheet.FilterOperator.NOT_EMPTY 'критерий фильтра НЕ ПУСТО
End With

oFilterDesc.setFilterFields(oFields())
oFilterDesc.ContainsHeader = False 'без учета заголовка
oFilterDesc.SkipDuplicates = True 'без дубликатов
oSheet.filter(oFilterDesc)

End Sub

Как видно из кода, я задаю конкретный диапазон, а при запуске
макроса, во первых, ничего не фильтруется, во вторых, скрывает все,
что выше заданного диапазона!
Делая этот алгоритм, через меню, все замечательно работает!
Подскажите, пж., что я делаю не так!?  :'(
Правильно поставленный вопрос, на 50% предполагает правильный ответ!
А, если автоматизировать бардак, то получится автоматизированный бардак!

rami

Цитата: sofi от 30 августа 2014, 06:08Подскажите, пж., что я делаю не так!?
Вы фильтруете всю страницу:oSheet.filter(oFilterDesc)
а надо диапазон:oRange.filter(oFilterDesc)
Цитата: sofi от 30 августа 2014, 06:08во первых, ничего не фильтруется
Проверьте, может в "пустых ячейках" стоят нули, которые не отображаются. У меня фильтрует правильно.

sofi

Кажется Вы правы!
Сейчас, попробуем.
Самое интересное, что эту строку кода я взял из
"Руководства пользователя OOCalc", потому и не
глядел внимательно. :o
Правильно поставленный вопрос, на 50% предполагает правильный ответ!
А, если автоматизировать бардак, то получится автоматизированный бардак!

sofi

Уважаемый rami!
Исправил код, как Вы предлагаете.
Перестало происходить, что-либо вообще!!! :o
Правильно поставленный вопрос, на 50% предполагает правильный ответ!
А, если автоматизировать бардак, то получится автоматизированный бардак!

rami

Цитата: sofi от 30 августа 2014, 09:26Самое интересное, что эту строку кода я взял из
"Руководства пользователя OOCalc", потому и не
глядел внимательно. :o
А, ну тогда валите всё до кучи, что-нибудь да сработает ;D
Цитата: sofi от 30 августа 2014, 09:52Исправил код, как Вы предлагаете.
Перестало происходить, что-либо вообще!!! :o
Всё что могло произойти, уже произошло ;D.

У вас практически есть два условия:
1) .Operator = com.sun.star.sheet.FilterOperator.NOT_EMPTY 'критерий фильтра НЕ ПУСТО — это условие относится только к столбцу D. Если в ячейке записан "0", который не отображается, то ячейка не пустая.
2) oFilterDesc.SkipDuplicates = True 'без дубликатов — это условие относится ко всей ширине диапазона: если все ячейки в одной строке диапазона соответственно равны всем ячейкам в другой строке, то это дубликат, если хоть одна ячейка в строке хоть чем-то отличается от соответствующей ячейки в другой строке, то это не дубликат.

sofi

#5
ЦитироватьoFilterDesc.SkipDuplicates = True 'без дубликатов — это условие относится ко всей ширине диапазона: если все ячейки в одной строке диапазона соответственно равны всем ячейкам в другой строке, то это дубликат, если хоть одна ячейка в строке хоть чем-то отличается от соответствующей ячейки в другой строке, то это не дубликат.

Ну почему же, обязательно при сравнении строк (диапазонов)?
Дубликатом, также, будет повторение какого-либо значения и в пределах
одного диапазона (столбца).
Если выбрать фильтр по умолчанию в меню данные, то в нем есть "галка"
"БЕЗ ПОВТОРЕНИЙ", сие и есть скрывать дубликаты, к примеру, в столбце.
Соответственно, если я "ручками" устанавливаю нужные параметры, то я
выделив диапазон и указав столбец D, выбираю условия фильтра:
"Значения" - "Не пусто"
"Доп.параметры" - "Без повторений"
и все прекрасно работает.
А вот макросом тоже самое, никак!  ???    
Правильно поставленный вопрос, на 50% предполагает правильный ответ!
А, если автоматизировать бардак, то получится автоматизированный бардак!

rami

Цитата: sofi от 30 августа 2014, 14:33Дубликатом, также, будет повторение какого-либо значения и в пределах
одного диапазона (столбца).
sofi, вы ошибаетесь.
Если выбрать в качестве диапазона только один столбец, то да, все одинаковые значения в этом столбце будут дубликатами. Но если выбрать больше чем один столбец, то дубликатом будет вся строка в пределах диапазона точно соответствующая другой строке.

Вручную, возможно вы так и делаете, но в макросе прописан диапазон: oRange = oSheet.getCellRangeByName("A15:M10050")и он тупо делает то, что записано

sofi

Дык, конечно же, лопух я!!!!!!! ;D

Вот так, должно быть:
ЦитироватьoRange = oSheet.getCellRangeByName("D15:D10050")

Все заработало!
Rami, респект и уважение! :beer:
Правильно поставленный вопрос, на 50% предполагает правильный ответ!
А, если автоматизировать бардак, то получится автоматизированный бардак!