我可以在 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 Special
和Transpose
选项转换数据。您甚至可以使用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 中创建水平自动过滤器吗的主要内容,如果未能解决你的问题,请参考以下文章