我可以在 OpenOffice Calc 中创建水平自动过滤器吗

Posted

技术标签:

【中文标题】我可以在 OpenOffice Calc 中创建水平自动过滤器吗【英文标题】:Can I create horizontal autofilter in OpenOffice Calc 【发布时间】:2012-05-18 13:13:25 【问题描述】:

自动过滤器正在垂直排序数据,但我想水平过滤行。 假设我有下表:

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

非常感谢任何帮助!

【问题讨论】:

你想显示第一行吗?还是第 2、3、5 列?还是基于列信息的第 2、3、5 行? 【参考方案1】:

在合理费用的假设下,您不能这样做。仅转换数据以使行获得列会容易得多,反之亦然。因此,我强烈建议使用Paste SpecialTranspose 选项转换数据。您甚至可以使用TRANSPOSE() 函数动态地执行此操作。

编辑:

现在我明白了 - 您想根据某个值隐藏列。事实上,这可以使用宏来实现,所以我的第一个答案是不正确的 - 抱歉!周围有一些宏可以为您执行此操作。您可以将此类解决方案与自动过滤器结合使用。这是solution by king_026 from the OpenOffice.org forums(略微适应表结构 - 见下文):

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 上的 Autofilter 和宏完成工作后将如下所示:

【讨论】:

+1 - 我不同意“你不能”部分,但我同意转调是要走的路 好吧,我不能那样做。原因是同时我需要两个过滤器——一个水平的,一个垂直的。因此,如果我转换数据以使行获得列,反之亦然,我仍然无法同时进行过滤。 感谢您对huwawohu的回复。在我的问题的示例表中,我想垂直和水平地过滤数据,所以我最终可以得到第一列中包含“B”的所有行和第一行中包含“2”的所有列。自动过滤器在过滤行时工作正常,但在过滤行后,我只想获取顶行有“2”的列。 @StefanEroteev:好的,现在我明白了。我删除了我之前的评论并在我的答案中添加了一些代码。 @deathApril:你是对的——“你不能”绝对是错的 :)

以上是关于我可以在 OpenOffice Calc 中创建水平自动过滤器吗的主要内容,如果未能解决你的问题,请参考以下文章

在 Libgdx 中创建水

在 OpenOffice Calc 中自动化图表的标题

OpenOffice Calc 复杂函数

excel 和 openoffice calc 的宏

Openoffice-calc 无法更改列的日期格式

OpenOffice Calc 合并单元格属性