2010-09-08 9 views
0

J'ai beaucoup de données dans une feuille de calcul Excel. Pour les calculs, je voudrais limiter ces données aux données pertinentes seulement. C'est-à-dire: filtrez les données et placez le sous-ensemble dans une autre feuille de calcul.
Les données pertinentes sont des données qui se situent dans une valeur minimale et maximale donnée. Supposons que je souhaite filtrer la colonne A pour les valeurs comprises entre 1 et 2, et la colonne B pour les valeurs comprises entre 0 et 1. Le résultat devrait devenir comme suit.Comment filtrer et copier des données dans Excel?

A B C = Data 
1 0 0 0 
2 1 1 0 
3 2 0 3 
4 2 2 1 

    A B C = Result 
1 1 1 0 
2 2 0 3 

Existe-t-il une solution simple pour cela?
Le fait que je ne filtre pas sur les correspondances exactes rend apparemment le problème plus difficile.

Merci d'avance!

Répondre

0

J'ai une procédure VBA rapide qui va faire tout ce que vous voulez ...

Private Sub MultiFilter(DataRange As Range, CriteriaRange As Range, OutputRangeTL As Range) 
    Dim intRowCounter As Integer 
    Dim intColCounter As Integer 
    Dim varCurrentValue As Variant 
    Dim blnCriteriaError As Boolean 
    Dim rngOutputCurrent As Range 

    If CriteriaRange.Columns.Count <> DataRange.Columns.Count Then 
     Err.Raise Number:=513, Description:="CriteriaRange and DataRange must have same column count" 
    End If 
    If CriteriaRange.Rows.Count <> 2 Then 
     Err.Raise Number:=513, Description:="CriteriaRange must be of 2 rows" 
    End If 

    Set rngOutputCurrent = OutputRangeTL.Resize(1, DataRange.Columns.Count) 

    For intRowCounter = 1 To DataRange.Rows.Count 
     For intColCounter = 1 To DataRange.Columns.Count 
      varCurrentValue = DataRange.Cells(intRowCounter, intColCounter).Value 
      If Not (varCurrentValue >= CriteriaRange.Cells(1, intColCounter) _ 
      And varCurrentValue <= CriteriaRange.Cells(2, intColCounter)) Then 
       ''#i.e. criteria doesn't match 
       blnCriteriaError = True 
       Exit For 
      End If 
     Next intColCounter 
     If Not blnCriteriaError Then 
      ''#i.e. matched all criteria 
      rngOutputCurrent.Value = DataRange.Resize(1).Offset(intRowCounter - 1).Value 
      Set rngOutputCurrent = rngOutputCurrent.Offset(1) 
     End If 
     blnCriteriaError = False 
    Next intRowCounter 
End Sub 

Utilisation:

DataRange: 
0 0 0 
1 1 0 
2 0 3 
2 2 1 

CriteriaRange: 
1 0 0 
2 1 10 

Ensuite, faites:

Public Sub DoTheFilter() 
    MultiFilter Range("MyDataRange"), Range("MyCriteriaRange"), Range("MyOutputRangeTopLeft") 
End Sub 

Le CriteriaRange est simplement une plage de 2 lignes donnant des valeurs minimales et maximales pour chaque colonne.

Ce n'est pas le moyen le plus élégant et le plus efficace dont je suis sûr, mais je l'ai utilisé comme une solution rapide car j'avais besoin de le faire une ou deux fois. Si vous n'êtes pas à l'aise avec l'utilisation du code VBA, faites-le moi savoir et je suis sûr de pouvoir le convertir en fonction de feuille de calcul pour vous (cela aurait également l'avantage de se mettre à jour si vous changiez les critères ...)

Simon

Questions connexes