2011-07-28 3 views
1

J'ai un public à la suite sous dans mon code comme indiqué ci-dessous:Range.Autofilter échoue sur vba Excel 2011 (Mac)

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 

Comme vous pouvez le voir je utilise des tableaux Excel (ListObjects en vba parler) donc je passe la référence dans le sous-marin, et il est supposé réinitialiser la table à un état non filtré. Il fonctionne très bien sur un PC avec Excel 2007, mais échoue sur Excel 2011 sur Mac avec:

méthode 'Autofilter' de l'objet 'Range' a échoué

Le lien suivant pour Excel 2011 VBA Reference montre la méthode AutoFilter de l'objet Range et il correspond à ce que je peux voir dans les références pour Excel 2007 Références VBA.

Alors, peut-on voir pourquoi cela échoue?

Répondre

0

Il ne semble pas qu'il y ait eu beaucoup de gens sautant à cette question ... En tout cas, si quelqu'un d'autre est intéressé, je pense que j'ai trouvé une solution de contournement en utilisant la propriété ListObject.ShowAutoFilter. C'est une propriété booléenne en lecture/écriture et lorsqu'elle est désactivée, elle réinitialise les filtres dans ListObject. Il a le bonus supplémentaire de travailler sur Excel 2011 pour Mac et Excel 2007 (et 2010 d'ailleurs) sur PC.

3

Je n'ai pas réussi à obtenir votre solution de travail ListObject.ShowAutoFilter pour travailler pour moi, en particulier parce que je devais non seulement désactiver le filtre automatique, mais ensuite restaurer par programme le filtre une fois mon code a été fait. J'ai fait un peu de déconner avec l'enregistrement de macro sur le Mac et a constaté que même si Range.AutoFilter jette une erreur Selection.AutoFilter ne fait pas. J'ai donc pu sélectionner la plage que je voulais filtrer puis appliquer mon filtre à la sélection.

ws.Range(currentFiltRange).Select 
    Selection.AutoFilter 

Si vous devez conserver la sélection de l'utilisateur, vous pouvez facilement restaurer cela aussi bien, voici ma routine complète de sous pour enregistrer l'état autofilter, exécutez votre propre code, puis restaurer l'état autofilter et il fonctionne aussi bien sur PC et 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 
Questions connexes