Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

24 Май 2019, 06:49 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Доступно и просто о работе в офисных пакетах
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Макрос стандартного фильтра  (Прочитано 6318 раз)
0 Пользователей и 1 Гость смотрят эту тему.
sofi
Форумчанин
***
Offline Offline

Пол: Мужской
Расположение: Ижевск
Сообщений: 63

Глядя на мир, нельзя не удивляться!


« Стартовое сообщение: 30 Август 2014, 06:08 »

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

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

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

Как видно из кода, я задаю конкретный диапазон, а при запуске
макроса, во первых, ничего не фильтруется, во вторых, скрывает все,
что выше заданного диапазона!
Делая этот алгоритм, через меню, все замечательно работает!
Подскажите, пж., что я делаю не так!?  Плачущий
 
« Последнее редактирование: 30 Август 2014, 06:25 от sofi » Записан

Правильно поставленный вопрос, на 50% предполагает правильный ответ!
А, если автоматизировать бардак, то получится автоматизированный бардак!
rami
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 2 711


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #1: 30 Август 2014, 07:12 »

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

sofi
Форумчанин
***
Offline Offline

Пол: Мужской
Расположение: Ижевск
Сообщений: 63

Глядя на мир, нельзя не удивляться!


« Ответ #2: 30 Август 2014, 09:26 »

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

Правильно поставленный вопрос, на 50% предполагает правильный ответ!
А, если автоматизировать бардак, то получится автоматизированный бардак!
sofi
Форумчанин
***
Offline Offline

Пол: Мужской
Расположение: Ижевск
Сообщений: 63

Глядя на мир, нельзя не удивляться!


« Ответ #3: 30 Август 2014, 09:52 »

Уважаемый rami!
Исправил код, как Вы предлагаете.
Перестало происходить, что-либо вообще!!! Шокирован
Записан

Правильно поставленный вопрос, на 50% предполагает правильный ответ!
А, если автоматизировать бардак, то получится автоматизированный бардак!
rami
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 2 711


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #4: 30 Август 2014, 13:03 »

Самое интересное, что эту строку кода я взял из
"Руководства пользователя OOCalc", потому и не
глядел внимательно. Шокирован
А, ну тогда валите всё до кучи, что-нибудь да сработает Смеющийся
Исправил код, как Вы предлагаете.
Перестало происходить, что-либо вообще!!! Шокирован
Всё что могло произойти, уже произошло Смеющийся.

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

sofi
Форумчанин
***
Offline Offline

Пол: Мужской
Расположение: Ижевск
Сообщений: 63

Глядя на мир, нельзя не удивляться!


« Ответ #5: 30 Август 2014, 14:33 »

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

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

Правильно поставленный вопрос, на 50% предполагает правильный ответ!
А, если автоматизировать бардак, то получится автоматизированный бардак!
rami
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 2 711


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #6: 30 Август 2014, 15:40 »

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

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

sofi
Форумчанин
***
Offline Offline

Пол: Мужской
Расположение: Ижевск
Сообщений: 63

Глядя на мир, нельзя не удивляться!


« Ответ #7: 30 Август 2014, 16:49 »

Дык, конечно же, лопух я!!!!!!! Смеющийся

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

Все заработало!
Rami, респект и уважение! Всё хорошо
Записан

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

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!