Могу ли я создать горизонтальный автофильтр в OpenOffice Calc

Автофильтр сортирует данные по вертикали, но я хочу фильтровать строки по горизонтали. Допустим, у меня есть следующая таблица:

1 2 2 1 2

B A E F F

B D E F F

C D E F F

Что я могу сделать, так это установить автофильтр и фильтровать только строки, содержащие «B» в первом столбце. Что я хотел бы сделать, так это отфильтровать только строки, содержащие «2» (в этом случае строки являются вторыми, третьими и последними в этом случае).

Я нашел некоторую информацию по этому поводу. Все найденные мной ответы содержат некоторые макросы для выполнения работы, но они были написаны для MS Excel и несовместимы с OpenOffice.

Например, этот макрос должен фильтровать строки, но не работает в OpenOffice Calc:

Option Explicit

Sub horizontal_filter()
'Erik Van Geit
'060910

Dim LC As Integer           'Last Column
Dim R As Long
Dim i As Integer
Dim FilterValue As String

Const FilterColumn = 1      '1 is most logical value but you may change this

R = ActiveCell.Row
LC = Cells(R, Columns.Count).End(xlToLeft).Column

FilterValue = Cells(R, FilterColumn)

Application.ScreenUpdating = False

'to filter starting after FilterColumn
For i = FilterColumn + 1 To LC
'to filter all columns even before the filtercolumn
'For i = 1 To LC
    If i <> FilterColumn Then
    Columns(i).Hidden = Cells(R, i) <> FilterValue
    End If
Next i

Application.ScreenUpdating = True

End Sub

Любая помощь приветствуется!


person eroteev    schedule 18.05.2012    source источник
comment
вы хотите отобразить 1-ю строку? или 2-й, 3-й и 5-й столбец? или 2-я, 3-я и 5-я строки на основе информации из столбцов?   -  person Aprillion    schedule 18.05.2012


Ответы (1)


Вы не можете этого сделать при условии разумных затрат. Гораздо проще просто преобразовать ваши данные так, чтобы строки стали столбцами и наоборот. Поэтому я настоятельно рекомендую преобразовывать данные с помощью Paste Special вместе с параметром Transpose. Вы даже можете сделать это динамически, используя функцию TRANSPOSE().

РЕДАКТИРОВАТЬ:

Теперь я понял - вы хотите скрыть столбцы на основе определенного значения. На самом деле это возможно с использованием макроса, поэтому мой первый ответ был неправильным - извините за это! Есть несколько макросов, которые сделают это за вас. Вы можете совместить такое решение с автофильтром. Вот решение от king_026 из OpenOffice.org форумы (немного адаптированы к структуре таблиц - см. ниже):

REM  *****  BASIC  *****
sub hide
   rem ----------------------------------------------------------------------
   rem define variables
   dim document   as object
   dim dispatcher as object
   rem ----------------------------------------------------------------------
   rem get access to the document
   document   = ThisComponent.CurrentController.Frame
   dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

   rem get the current column
   nCol = ThisComponent.CurrentSelection.CellAddress.Column

   rem set the properties for moving right
   dim args2(1) as new com.sun.star.beans.PropertyValue
   args2(0).Name = "By"
   args2(0).Value = 1
   args2(1).Name = "Sel"
   args2(1).Value = false

   rem make thecurrent column counter
   dim cCol as integer
   CCol = 0

   rem goto the first column
   dim args1(0) as new com.sun.star.beans.PropertyValue
   args1(0).Name = "ToPoint"
   args1(0).Value = "$A$2"

   dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())

   rem loop until you get back to the selected cell
    Do Until cCol > nCol

    rem hide if the cell value is 1
        if ThisComponent.CurrentSelection.string <> "" and ThisComponent.CurrentSelection.value = 1 then

            rem ----------------------------------------------------------------------
            dispatcher.executeDispatch(document, ".uno:HideColumn", "", 0, Array())

        End if

        rem goto the right nad increment the column counter
        dispatcher.executeDispatch(document, ".uno:GoRight", "", 0, args2())
        cCol = cCol + 1

    Loop

End sub

Итак, следующая таблица:

calc1

будет выглядеть так после автофильтра на Col1 и после того, как макрос выполнил свою работу:

calc

person tohuwawohu    schedule 18.05.2012
comment
+1 - я не согласен с вами не могу расстаться, но я согласен, что транспонирование - это лучший способ - person Aprillion; 18.05.2012
comment
Что ж, я не могу этого сделать. Причина в том, что одновременно мне нужно иметь два фильтра - один горизонтальный и один вертикальный. Поэтому, если я преобразовываю данные так, чтобы строки получали столбцы, и наоборот, я все равно не смогу выполнять фильтрацию в обоих направлениях. - person eroteev; 19.05.2012
comment
Спасибо за ответ tohuwawohu. В таблице примеров моего вопроса я хотел бы отфильтровать данные по вертикали и горизонтали, чтобы я мог получить все строки, у которых есть B в первом столбце, и все столбцы, у которых есть 2 в первой строке. Автофильтр отлично работает для фильтрации строк, но после фильтрации строк я хочу получить только столбцы, у которых 2 в верхней строке. - person eroteev; 19.05.2012
comment
@StefanEroteev: хорошо, теперь я понял. Я удалил свой предыдущий комментарий и добавил код к своему ответу. - person tohuwawohu; 19.05.2012
comment
@deathApril: ты был прав - ты точно не ошибся :) - person tohuwawohu; 19.05.2012
comment
Спасибо @tohuwawohu, это то, что я искал! - person eroteev; 23.05.2012