IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Filtre VBA sur Array, match non exact


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti Avatar de maxxikilla
    Homme Profil pro
    Analyste Risques
    Inscrit en
    Mars 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Analyste Risques
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2014
    Messages : 19
    Par défaut Filtre VBA sur Array, match non exact
    Bonjour,

    Je poste ici un petit point de blocage dans une macro.

    J'explique un peu ce que j'ai sur mon fichier. D'un côté, j'ai un range avec des références (une centaine, toutes différentes).

    Je souhaite filtrer tout d'une traite sur un onglet contenant toutes mes données.

    Ma démarche pour le moment, est de venir stocker les données de mon Range dans une variable de type Array.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ReDim myArray(f)
     
            For i = flagFirstRow To flagLastRow
     
                If Left(Cells(i, 4), 4) = "NEFA" Then
                    myArray(i - flagFirstRow) = Cells(i, 5)
                End If
            Next i
     
            Sheets("Data").Activate
            Range("A1").AutoFilter Field:=idrow9, Criteria1:=myArray, Operator:=xlFilterValues
    Ce code fonctionne parfaitement bien si la "capsule" array contient des valeurs qui ont un match exact avec le champ sur lequel je fais mon filtre.

    Cependant, les valeurs de mon Range par exemple "0021CF15", ne vont pas matcher exactement avec ce que j'ai dans mon onglet data, par exemple "0021CF15-LBO015".
    Ainsi le filtre fait sur la variable array ne remonte rien.

    Comment est ce que je peux faire en sorte que le filtre soit réalisé sur un critère de match approximatif?

    Je sais qu'il existe des syntaxe avec quelque chose du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Range("A1").AutoFilter Field:=idrow9, Criteria1:="*=" & "0021CF15", Operator:=xlFilterValues
    Mais je ne vois pas comment combiner cela avec le myArray.

    Merci, A dispo pour tout complément d'info si besoin.

  2. #2
    Membre Expert Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Par défaut
    Bonsoir,

    Avec l'utilisation de filtre, j'ajouterais une colonne supplémentaire, si contion x ou y ou z = True, et filtrerais que sur les True.

    Si tu peu juste "caché" des lignes, un code de ce style pourrait faire le job.

    En considérant que À soit ta colonne à "Filtrer"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    Sub HideOnCriteria()
        Dim crit As String, HideRow As Boolean, N As Long
        Dim i As Long, critARR
        N = Cells(Rows.Count, "A").End(xlUp).Row
     
        crit = "VVV/WWW/XXX" ' Critères de filtre séparé par /
        critARR = Split(crit, "/")
     
        For i = 2 To N' ou commence à ligne 2 1 étant les titres
            HideRow = True
            v = Cells(i, "A").Value
            For Each a In critARR
                If InStr(1, v, a) > 0 Then HideRow = False
            Next a
            If HideRow Then Cells(i, 1).EntireRow.Hidden = True
        Next i
    End Sub

  3. #3
    Membre averti Avatar de maxxikilla
    Homme Profil pro
    Analyste Risques
    Inscrit en
    Mars 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Analyste Risques
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2014
    Messages : 19
    Par défaut
    Bonjour, et merci pour ta réponse,

    Je vais tester cette solution de contournement. J'ai un peu peur du temps de traitement parce que ma base de donnés à quelques centaines de miliers de lignes.

    Si jamais quelqu'un a une solution pour faire un match inexact sur un filtre de type Array, je reste preneur

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 166
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    S'il s'agit d'obtenir une table filtrée avec des éléments contenant une chaîne de caractères, il y a la fonction Filter d'un Array

    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Sub t()
      Dim myTable()
      Dim oList As ListObject
      Dim rngColumn As Range
      Dim FilterTable() As String
      Dim Elem As Long
      Dim msg As String
      Set oList = Range("T_Member").ListObject
      Set rngColumn = oList.ListColumns("Nom").DataBodyRange
      myTable = rngColumn.Value                                ' Charge la colonne "Nom" dans un Arrray à 2 dimensions
      myTable = Application.Transpose(myTable)                 ' Transforme la table à une dimension
      FilterTable = Filter(myTable, "ch", True, vbTextCompare) ' Renvoie la table filtrée
      '
      For Elem = 0 To UBound(FilterTable)
        msg = msg & vbCrLf & FilterTable(Elem)
      Next
      MsgBox msg  ' Affiche les éléments filtrés
      Set oList = Nothing: Set rngColumn = Nothing
    End Sub
    Pour en savoir plus sur les variables tableaux à lire : Utiliser les variables tableaux en VBA Excel
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

Discussions similaires

  1. [AC-2016] filtre vba sur 2 champs date
    Par Milou16 dans le forum VBA Access
    Réponses: 18
    Dernier message: 14/08/2017, 18h05
  2. [VBA] Find même sur les éléments non visibles suite à un filtre
    Par Free94 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 23/07/2015, 14h54
  3. [WD11] Filtre sur des champs non clé
    Par shadowdiablo dans le forum WinDev
    Réponses: 20
    Dernier message: 09/09/2009, 20h35
  4. Réponses: 3
    Dernier message: 13/02/2008, 10h10
  5. [VBA] Sur une saisie oui/non, stocker la date
    Par PhNou dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 04/02/2008, 10h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo