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

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

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

Войти
Новости: Здесь можно поблагодарить участников форума Улыбка
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: [РЕШЕНО]Фильтр  (Прочитано 6178 раз)
0 Пользователей и 1 Гость смотрят эту тему.
malegender
Новичок
*
Offline Offline

Сообщений: 3


« Стартовое сообщение: 8 Январь 2012, 22:40 »

Добрый день. Помогите разобраться.
Потребовалось создать фильтр на определенный столбец.
Из хелпа вырезал код. Отфильтровать ячейки с данным больше 0:
Код:
Sub SimpleSheetFilter_2()
 Dim oSheet ' Лист, на котором применен фильтр.
 Dim oRange ' диапазон, который будет отфильтрован.
 Dim oFilterDesc ' Критерии фильтра.
 Dim oFields(1) As New com.sun.star.sheet.TableFilterField
 
 oSheet = ThisComponent.getSheets().getByIndex(0)

 oFilterDesc = oSheet.createFilterDescriptor(True)

 With oFields(0)
 .Field = 5 ' Filter column F.
 .IsNumeric = True ' Используется числовое значение
 .Operator = com.sun.star.sheet.FilterOperator.GREATER
 .NumericValue = 0
 End With
 oFilterDesc.setFilterFields(oFields())
 oFilterDesc.OutputPosition=outputaddr
  oSheet.filter(oFilterDesc)
End Sub

Если в файле имется только один столбец то фильтрует нормально. Но если в другом столбце также находятся данные, то получается криво.
В прикрепленном примере имеется два столбца. Отфильтровать нужно столбец "F". Если применить макрос то выпадают числа.

[вложение удалено Администратором]
« Последнее редактирование: 9 Январь 2012, 17:19 от malegender » Записан
neft
Форумчанин
***
Offline Offline

Сообщений: 189


« Ответ #1: 8 Январь 2012, 22:53 »

Такой попробуйте.
Код:
Sub Main
dim outputaddr as new com.sun.star.table.CellAddress

xfilter = thiscomponent.sheets(0).getcellrangebyposition(0,0,5,11)
xfilterDesc=xFilter.createFilterDescriptor(true)

outputaddr.sheet = 0
outputaddr.column=0
outputaddr.row=19

dim aFilterFields(0)  as  new com.sun.star.sheet.TableFilterField

aFilterFields(0).Field        = 5
aFilterFields(0).IsNumeric    = true
aFilterFields(0).Operator     = com.sun.star.sheet.FilterOperator.GREATER
aFilterFields(0).NumericValue = 0

xFilterDesc.setFilterFields(aFilterFields())
xfilterDesc.ContainsHeader=false
xfilterDesc.CopyOutputData=true
xfilterDesc.OutputPosition=outputaddr

xFilter.filter(xFilterDesc)

End Sub
Записан
malegender
Новичок
*
Offline Offline

Сообщений: 3


« Ответ #2: 9 Январь 2012, 14:28 »

Такой попробуйте.
Код:
Sub Main
dim outputaddr as new com.sun.star.table.CellAddress

xfilter = thiscomponent.sheets(0).getcellrangebyposition(0,0,5,11)
xfilterDesc=xFilter.createFilterDescriptor(true)

outputaddr.sheet = 0
outputaddr.column=0
outputaddr.row=19

dim aFilterFields(0)  as  new com.sun.star.sheet.TableFilterField

aFilterFields(0).Field        = 5
aFilterFields(0).IsNumeric    = true
aFilterFields(0).Operator     = com.sun.star.sheet.FilterOperator.GREATER
aFilterFields(0).NumericValue = 0

xFilterDesc.setFilterFields(aFilterFields())
xfilterDesc.ContainsHeader=false
xfilterDesc.CopyOutputData=true
xfilterDesc.OutputPosition=outputaddr

xFilter.filter(xFilterDesc)

End Sub
Данный пример отличается только заданием диапазона ячеек данных и заданием диапазона ячеек куда будет выгружаться результат.
Задача простая(отфильтровать лист по одному столбцу с условием данные больше нуля) но никак у меня не олучается ее реализовать. В книге Питоньяка нашел описание всех условий фильтра, но это мне не помогло
Записан
neft
Форумчанин
***
Offline Offline

Сообщений: 189


« Ответ #3: 9 Январь 2012, 15:19 »

Ну тогда так.
Код:
Sub Main
dim outputaddr as new com.sun.star.table.CellAddress

oDoc=thiscomponent
oSheet=oDoc.sheets(0)

MaxColumn=oSheet.Columns.Count-1
MaxRow=oSheet.Rows.Count-1

xfilter = oSheet.getcellrangebyposition(0,0,MaxColumn,MaxRow)
xfilterDesc=xFilter.createFilterDescriptor(true)

dim aFilterFields(0)  as  new com.sun.star.sheet.TableFilterField

aFilterFields(0).Field        = 5
aFilterFields(0).IsNumeric    = true
aFilterFields(0).Operator     = com.sun.star.sheet.FilterOperator.GREATER
aFilterFields(0).NumericValue = 0

xFilterDesc.setFilterFields(aFilterFields())
xFilter.filter(xFilterDesc)

End Sub

PS. Трудно тебя понять, милый, что тебе хочется иметь в результате.
Записан
malegender
Новичок
*
Offline Offline

Сообщений: 3


« Ответ #4: 9 Январь 2012, 17:18 »

Уважаемый neft!
Спасибо за помощь. Я новичек в программировании. Извиняюсь за то, что действительно коряво объяснил чего хочу.
Благодаря Вам, я нашел ошибку свою. Макрос я скопировал из какого то примера удалив лишнее. Но этот пример фильтровал два столбца(на сколько помню).
Код:
Dim oFields(1) As New com.sun.star.sheet.TableFilterField
Эту строку тоже надо было подкорректировать вот так
Код:
Dim oFields(0) As New com.sun.star.sheet.TableFilterField
Мой макрос заработал как надо.

[вложение удалено Администратором]
Записан
neft
Форумчанин
***
Offline Offline

Сообщений: 189


« Ответ #5: 9 Январь 2012, 19:02 »

Наверное, нужно дать пояснения.
При задании таким образом массива параметров
Цитата:
dim aFilterFields(1) as ...
мы имеем массив с индексами 0, 1

Элемент массива параметров с индексом 0 мы определяем в программе
Код:
aFilterFields(0).Field        = 5
aFilterFields(0).IsNumeric    = true
aFilterFields(0).Operator     = com.sun.star.sheet.FilterOperator.GREATER
aFilterFields(0).NumericValue = 0

а вот элемент массива параметров с индексом 1 мы сами не задаем в программе, а поручаем сделать это самостоятельно программе по умолчанию, что приводит к тому, что элемент массива с индексом 1 получает по умолчанию следующие значения параметров

Код:
aFilterFields(1).Field        = 0
aFilterFields(1).IsNumeric    = false
aFilterFields(1).Operator     = com.sun.star.sheet.FilterOperator.EMPTY
aFilterFields(1).NumericValue = 0

и фактически фильтрация происходит по двум столбцам (5 и 0) и именно с этими параметрами.
Что и приводит к неверному результату.

МОРАЛЬ: нужно правильно указывать число элементов массива параметров, иначе "лишние", не заданные явно параметры могут принимать значения по умолчанию и приводить к "странным" результатам.
Записан
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

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