2011-07-28 101 views
1

我有以下在我的代码子公失败,如下图所示:VBA Range.Autofilter上的Excel 2011(苹果机)

Public Sub ResetFilters(ByRef tbl As ListObject) 
    With tbl 

     '// If Filter Arrows are OFF - turns them on 
     '// If Filter Arrows are ON - turns them off and resets filter 
     .Range.AutoFilter 

     '// Always turns filter arrows to on and sorts table by first field 
     .Range.AutoFilter Field:=1 
    End With 
End Sub 

,你可以看到我使用的Excel表格(ListObjects在VBA说吧)所以我将参考传递给sub,并且它应该将表重置为未过滤状态。它工作正常,在PC上用Excel 2007中,但在Mac上失败Excel的2011年:对象的

法“自动筛选”“范围”失败

以下链接Excel 2011 VBA Reference显示AutoFilter方法的Range对象,它匹配我在Excel 2007 VBA引用的参考中可以看到的内容。

所以任何人都可以看到为什么这是失败?

回答

0

它似乎并没有很多人在这个问题上跳跃......无论如何,如果其他人有兴趣,我想我找到了一个使用ListObject.ShowAutoFilter属性的解决方法。它是一个读/写布尔属性,关闭时它将重置ListObject中的过滤器。它还具有在PC上使用Excel 2011 for Mac和Excel 2007(以及2010年)的额外好处。

3

我无法让ListObject.ShowAutoFilter解决方法为我工作,特别是因为我不仅需要关闭自动筛选器,而且还需要在代码完成后以编程方式恢复筛选器。

我在Mac上做了一些与宏录制有关的事情,发现即使Range.AutoFilter引发错误Selection.AutoFilter没有。所以我能够选择我想要过滤的范围,然后将我的过滤器应用于选择。

ws.Range(currentFiltRange).Select 
    Selection.AutoFilter 

如果您需要保存用户的选择,你可以很容易地恢复为好,这里是我的完整子程序保存自动筛选状态,运行自己的代码,然后恢复自动筛选状态和它的作品上都PC和Mac。

Private Sub saveAndRestoreAutoFilterPCandMAC() 


    Application.ScreenUpdating = False 

    'START SAVING AUTOFILTER STATE 
    Dim ws As Worksheet 
    Dim filterArray() 
    Dim currentFiltRange As String 
    Dim col As Integer 
    Dim usingAutoFilter As Boolean 
    Dim userSelection As String 

    usingAutoFilter = False  
    Set ws = ActiveSheet 

    'Capture AutoFilter settings 
    If ws.AutoFilterMode = True Then 
     With ws.AutoFilter 
      currentFiltRange = .Range.Address 
      If ws.FilterMode = True Then 
       usingAutoFilter = True 
       With .Filters 
        ReDim filterArray(1 To .count, 1 To 3) 
        For col = 1 To .count 
         With .Item(col) 
          If .On Then 
           filterArray(col, 1) = .Criteria1 
           If .Operator Then 
            filterArray(col, 2) = .Operator 
            If .Operator = xlAnd Or .Operator = xlOr Then 
             filterArray(col, 3) = .Criteria2 
            End If 
           End If 
          End If 
         End With 
        Next col 
       End With 
      End If 
     End With 
    End If 
    'END SAVING AUTOFILTER STATE 

    'Remove AutoFilter 
    ws.AutoFilterMode = False 

    'Start Your code here 

    'End of your code 

    'START RESTORE FILTER SETTINGS 
    If Not currentFiltRange = "" Then 
     userSelection = Selection.Address 
     ws.Range(currentFiltRange).Select 
     Selection.AutoFilter 
     If usingAutoFilter Then 
      For col = 1 To UBound(filterArray(), 1) 
       If Not IsEmpty(filterArray(col, 1)) Then 
        If filterArray(col, 2) Then 
         'check if Criteria2 exists and needs to be populated 
         If filterArray(col, 2) = xlAnd Or filterArray(col, 2) = xlOr Then 
          ws.Range(currentFiltRange).Select 
          Selection.AutoFilter Field:=col, _ 
           Criteria1:=filterArray(col, 1), _ 
           Operator:=filterArray(col, 2), _ 
           Criteria2:=filterArray(col, 3) 
         Else 
          ws.Range(currentFiltRange).Select 
          Selection.AutoFilter Field:=col, _ 
           Criteria1:=filterArray(col, 1), _ 
           Operator:=filterArray(col, 2) 
         End If 
        Else 
         ws.Range(currentFiltRange).Select 
         Selection.AutoFilter Field:=col, _ 
         Criteria1:=filterArray(col, 1) 
        End If 
       End If 
      Next col 
     End If 
    End If 
    ws.Range(userSelection).select 

    'END RESTORE FILTER SETTINGS 

    Application.ScreenUpdating = True 

End Sub