Могу ли я создать горизонтальный автофильтр в OpenOffice Calc?
-
11-12-2019 - |
Вопрос
Автофильтр сортирует данные по вертикали, но я хочу фильтровать строки по горизонтали.Допустим, у меня есть следующая таблица:
1 2 2 1 2
Б А Е Ф Ф
Б Г Д Е Ж Ж
В Г Д Е Ж Ф
Что я могу сделать, так это установить автофильтр и фильтровать только строки, содержащие букву «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
Любая помощь очень ценится!
Решение
Вы не можете, при условии разумных затрат.Гораздо проще просто преобразовать данные так, чтобы строки получили столбцы, и наоборот.Поэтому я настоятельно рекомендую преобразовать данные с помощью 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
Итак, следующая таблица:
будет выглядеть так после автофильтра на Col1 и после того, как макрос выполнил свою работу: