[РЕШЕНО]Фильтр

Автор malegender, 8 января 2012, 23:40

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

malegender

Добрый день. Помогите разобраться.
Потребовалось создать фильтр на определенный столбец.
Из хелпа вырезал код. Отфильтровать ячейки с данным больше 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". Если применить макрос то выпадают числа.

[вложение удалено Администратором]

neft

Такой попробуйте.
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

Цитата: neft от  8 января 2012, 23: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

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

neft

Ну тогда так.
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

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

[вложение удалено Администратором]

neft

Наверное, нужно дать пояснения.
При задании таким образом массива параметров
Цитировать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) и именно с этими параметрами.
Что и приводит к неверному результату.

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