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 :

Fonction MATCH dans une variable tableau [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Membre émérite Avatar de curt
    Homme Profil pro
    Ingénieur Etudes
    Inscrit en
    Mars 2006
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Etudes
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 566
    Points : 2 525
    Points
    2 525
    Par défaut Fonction MATCH dans une variable tableau
    Bonjour,
    Dans le cadre d’une reprise de feuille Excel, j’ai passé le traitement fait sur une feuille Excel dans une variable TABLEAU
    Initialement, je venais regarder si l’étiquette (= Entête) d’une colonne existait au moyen de la commande ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    column = WorksheetFunction.Match(Attributes(j).TagString, Range(Cells(2, 1), Cells(2, LastColumn)), False)
    ça fonctionne parfaitement si on a les valeurs sur la feuille.

    Pour optimiser le temps de traitement (voir tuto sur les variables tableau), j’essaye (en vain pour l’instant) d’avoir la même commande mais pour la variable TABLEAU
    Le début de la commande devrait être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     column = WorksheetFunction.Match(Attributes(j).TagString, Range(TABLEAU ???
    D’avance merci pour l’aide.

    Curt
    Pas de demande par MP, sinon j'correctionne plus, j'dynamite, j'disperse, j'ventile !!!
    ---------------------------------------------------------------------
    Vous avez un talent insoupçonné... Faites-en profitez les autres. Un p'tit CLIC pour une grande cause.
    Et si vous faisiez un bon geste en 2024 ? Soyez utile, ça vous changera ! Moi, ça m’a changé !

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 771
    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 : 12 771
    Points : 28 631
    Points
    28 631
    Billets dans le blog
    53
    Par défaut
    Bonjour Curt,
    Voici un petit exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub t2()
     Dim myTable As Variant, LookUpValue As String
     myTable = Range("A2:A15").Value
     LookUpValue = "E"
     MsgBox Application.WorksheetFunction.Match(LookUpValue, myTable, 0)
    End Sub
    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

  3. #3
    Membre émérite Avatar de curt
    Homme Profil pro
    Ingénieur Etudes
    Inscrit en
    Mars 2006
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Etudes
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 566
    Points : 2 525
    Points
    2 525
    Par défaut
    Bonsoir Philippe,

    le soucis que j'ai, c'est de mettre la plage "MY TABLE" dans ton exemple, qui représente la première ligne de ma variable TABLEAU
    Clairement, MYTable n'est pas le RANGE("A2:A15"), mais le RANGE(TABLEAU(LIGNE 1)

    Merci pour le début de piste en tout cas.
    Je continue à creuser.

    Curt
    Pas de demande par MP, sinon j'correctionne plus, j'dynamite, j'disperse, j'ventile !!!
    ---------------------------------------------------------------------
    Vous avez un talent insoupçonné... Faites-en profitez les autres. Un p'tit CLIC pour une grande cause.
    Et si vous faisiez un bon geste en 2024 ? Soyez utile, ça vous changera ! Moi, ça m’a changé !

  4. #4
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Points : 2 156
    Points
    2 156
    Par défaut
    Bonsoir,

    Recherche d'un élément dans la colonne d'un Array à 1 dimension avec Application.Match()

    La recherche de la position d'un élément dans un tableau peut se faire avec Application.Match() (Equiv()). Dans une boucle, cette recherche n'est pas très rapide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub RecherchePositionElement()
      a = Array("aa", "bb", "cc", "dd", "ee")
      x = "cc"
      p = Application.Match(x, a, 0)
      MsgBox p
    End Sub
    On obtient 3

    Pour une recherche dans dans la première colonne d'un tableau 2D:

    aa 11
    bb 22
    cc 33
    dd 44

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub RecherchePositionElement2()
      a = [{"aa",11;"bb",22;"cc",33;"dd",44}]
      clé= "cc"
      p = Application.Match(clé, Application.Index(a, , 1), 0) ' Recherche dans colonne 1 du tableau a()
      MsgBox a(p, 2)
    End Sub
    On obtient 33

    Boisgontier

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 771
    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 : 12 771
    Points : 28 631
    Points
    28 631
    Billets dans le blog
    53
    Par défaut
    Bonjour Curt,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub t3()
     Dim myTable As Variant, LookUpValue As String
     myTable = Range("A1:E1").Value
     LookUpValue = "Key"
     MsgBox Application.WorksheetFunction.Match(LookUpValue, myTable, 0)
    End Sub
    et aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub t3()
     Dim myTable As Variant, LookUpValue As String, rng As Range
     Set rng = Range("A1:E15")
     myTable = rng.Rows(1).Value
     LookUpValue = "Key"
     MsgBox Application.WorksheetFunction.Match(LookUpValue, myTable, 0)
    End Sub
    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

  6. #6
    Membre émérite Avatar de curt
    Homme Profil pro
    Ingénieur Etudes
    Inscrit en
    Mars 2006
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Etudes
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 566
    Points : 2 525
    Points
    2 525
    Par défaut
    Bonsoir et merci à vous deux,

    Encore une fois (mais merci pour ces pistes), les valeurs ne sont pas dans la feuille excel (sur la première ligne par exemple) - Tout est traité dans la variable tableau et à la fin, on recopie la variable tableau sur la feuille.

    Donc je voudrais pouvoir trouver dans quelle colonne de ma variable tableau se trouve la valeur recherchée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            column = WorksheetFunction.Match(Attributes(j).TagString, Range(TABLEAU(1, 5), TABLEAU(1, UBound(TABLEAU, 2))), False)
    C'est la partie en gras qui pose problème

    Encore merci pour le coup de main.
    Curt
    Pas de demande par MP, sinon j'correctionne plus, j'dynamite, j'disperse, j'ventile !!!
    ---------------------------------------------------------------------
    Vous avez un talent insoupçonné... Faites-en profitez les autres. Un p'tit CLIC pour une grande cause.
    Et si vous faisiez un bon geste en 2024 ? Soyez utile, ça vous changera ! Moi, ça m’a changé !

  7. #7
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Points : 2 156
    Points
    2 156
    Par défaut
    -Match ne fonctionne que pour une colonne ou une ligne d'Array.
    -Pour la vitesse d'exécution,le + rapide est de parcourir tous les éléments de l'Array(variable tableau):


    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 Essai()
     Tbl = [{11,12,13;21,22,23;31,32,33;41,42,43}]   ' Array avec 4 lignes et 3 colonnes
     Position = RechPositionElement(Tbl, 33)
     MsgBox Position
     Position = RechPositionElement(Tbl, 32)
     MsgBox Position
    End Sub
     
    Function RechPositionElement(Tbl, valCherchée)
     Nlig = UBound(Tbl)
     NCol = UBound(Tbl, 2)
     For lig = 1 To Nlig
      For col = 1 To NCol
        If Tbl(lig, col) = valCherchée Then RechPositionElement = "Ligne:" & lig & "/Colonne:" & col: Exit Function
      Next col
     Next lig
    End Function
    Boisgontier
    Fichiers attachés Fichiers attachés

  8. #8
    Membre émérite Avatar de curt
    Homme Profil pro
    Ingénieur Etudes
    Inscrit en
    Mars 2006
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Etudes
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 566
    Points : 2 525
    Points
    2 525
    Par défaut
    Bonjour Jacques,

    merci pour la réponse. Je vais tester et reviendrai si nécessaire.

    Pour ma culture, qu'elle est alors la commande qui permet le EQUIV (=MATCH) dans une variable tableau comme je souhaitai le faire ? (sans parler à présent de la vitesse d'exécution)

    Encore merci.
    Curt
    Pas de demande par MP, sinon j'correctionne plus, j'dynamite, j'disperse, j'ventile !!!
    ---------------------------------------------------------------------
    Vous avez un talent insoupçonné... Faites-en profitez les autres. Un p'tit CLIC pour une grande cause.
    Et si vous faisiez un bon geste en 2024 ? Soyez utile, ça vous changera ! Moi, ça m’a changé !

  9. #9
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut
    Bonjour,

    comme déjà indiqué :

      WorksheetFuntion    Application  ‼

    Si utilisation d'une variable pour le résultat de cette fonction de feuille de calculs EQUIV,
    elle doit forcément être de type Variant en cas d'erreur et si besoin de tester ce résultat
    soit via IsError soit via IsNumeric comme dans les exemples dans les discussions de ce forum …

    ___________________________________________________________________________________________________________
    Je suis Paris, Egypte, Nigeria, New-York, Mogadicio, Barcelone, London, Manchester, Stockholm, Istanbul, Berlin, Nice, Bruxelles, Charlie, …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  10. #10
    Membre émérite Avatar de curt
    Homme Profil pro
    Ingénieur Etudes
    Inscrit en
    Mars 2006
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Etudes
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 566
    Points : 2 525
    Points
    2 525
    Par défaut
    Bonsoir et merci à tous

    pour les réponses ou les pistes données.

    au final, la ligne devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    column = Application.Match(Attributes(j).TagString, Application.Index(TABLEAU, 0, 0), 0)
    Comme dit précédemment, l'itération via une boucle est plus performante ... mais avoir une alternative, c'est bien aussi

    Merci encore à tous.
    Curt
    Pas de demande par MP, sinon j'correctionne plus, j'dynamite, j'disperse, j'ventile !!!
    ---------------------------------------------------------------------
    Vous avez un talent insoupçonné... Faites-en profitez les autres. Un p'tit CLIC pour une grande cause.
    Et si vous faisiez un bon geste en 2024 ? Soyez utile, ça vous changera ! Moi, ça m’a changé !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment insérer les valeurs d'une requete dans une variable tableau
    Par uptoditime dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 04/12/2007, 12h03
  2. Réponses: 3
    Dernier message: 28/09/2007, 16h58
  3. recherche dans une variable tableau
    Par le petit nicolas dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 17/05/2007, 12h41
  4. [Fonction]récuperer dans une variable le résultat d'une requete
    Par nejisama8 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 28/04/2007, 12h34
  5. [VBA-E]Recherche dans une variable tableau
    Par illight dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 12/12/2006, 17h50

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