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 : incompréhension.


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Fonction Match : incompréhension.
    Bonjour tout le monde,

    Je viens vous appeler au secours concernant la fonction match en VBA.
    L'objectif est de restituer la valeur de la cellule renvoyée dans la plage destination. Celà fonctionne pour d'autre champs dans le même fichier, même manip. Mais pour l'un d'entre eux je'y parviens pas.
    Je joins le fichier en PJ. L'objectif est de renvoyé la valeur de la colonne Décision" de l'onglet sélection vers la colonne info 1 (L) de l'onglet synth, si le nom correspond.
    J'ai rendu le fichier neutre en intitulés car c'est pour du scolaire et confidentiel.

    Lorsque j'utilise le code ci dessous, pas d'anomalie, mais rien ne se passe...
    J'ai vérifié, ce n'est pas à cause de la reconnaissance de correspondance (enfin jen e pense pas), car cela fonctionne avec la formule Equiv qui correspond à Match.
    Pouvez vous m'aider svp ?

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    Sub info()
    Dim Selection As Worksheet
    Dim Synth As Worksheet
    Dim Sreinfo1 As Range
    Dim Destinfo1 As Range
    Dim cel As Range
    Dim Ligne As Range
     
    Set Selection = Worksheets("Selection")
    Set Synth = Worksheets("Synth")
     
     
     
     
    'défini les plages
    With Selection
     
    Set Sreinfo1 = .Range(.Cells(4, 1), .Cells(.Rows.Count, 1).End(xlUp))
     
    End With
     
    With Synth
    Set Destinfo1 = .Range(.Cells(2, 3), .Cells(.Rows.Count, 3).End(xlUp))
    End With
     
     
     
     
    'parcour la plage de la feuille de destination
    For Each cel In Destinfo1
     
    'gestion de l'erreur de la valeur non trouvé
    On Error Resume Next
    Ligne = Application.WorksheetFunction.Match(cel.Value, Sreinfo1, 0) + 3 'rajoute 3 car départ de plage en ligne 4
     
    'si pas d'erreur, récupère les valeurs en colonnes E:G et les inscrit en colonne AN:AP
    If Err.Number = 0 Then
     
    cel.Offset(, 9).Value = Selection.Cells(Ligne, 1).Offset(, 2).Value
     
    End If
     
    Next cel
     
    End Sub


    Merci par avance pour votre aide!

  2. #2
    Membre émérite
    Bonjour,

    La fonction Match retourne un Double. Un nombre qui peut-êtr très grand.
    Donc, à ne pas déclarer As Range...
    Remplacer :
    Cordialement,
    Franck

  3. #3
    Expert confirmé
    Bonjour le Fil,
    Bonjour Frank,

    J'ajouterais qu'il faut faire attention aux noms choisis pour les variables ...
    Utiliser Selection, c'est chercher le bâton pour se faire battre !
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Sub info()
    Dim Selection As Worksheet
    '...
    Set Selection = Worksheets("Selection")


    A lire (en particulier le point 4) : https://docs.microsoft.com/fr-fr/off...c-naming-rules
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  4. #4
    Membre émérite
    Citation Envoyé par Patrice740 Voir le message
    Bonjour le Fil,
    Bonjour Frank,

    J'ajouterais qu'il faut faire attention aux noms choisis pour les variables ...
    Utiliser Selection, c'est chercher le bâton pour se faire battre !
    Salut Patrice,

    Cordialement,
    Franck

  5. #5
    Rédacteur

    Bonjour Franck,
    La fonction Match retourne un Double
    Pour moi, c'est plutôt un entier Long que cette fonction renvoie
    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
    Quelques contributions : USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire - Géolocalisation d'une adresse avec Excel et Google sans VBA

  6. #6
    Membre émérite
    Bonjour Philippe,

    Pour moi, c'est plutôt un entier Long que cette fonction renvoie
    Et bien, pour moi également.
    Enfin, jusqu'à ce que je lise ceci :
    https://docs.microsoft.com/fr-fr/off...h#return-value

    Idem pour l'explorateur d'objet de l'éditeur :
    Function Match(Arg1, Arg2, [Arg3]) As Double
    Membre de Excel.WorksheetFunction
    C'est d'autant plus surprenant que son utilisation pour les variables tableaux [j'ai déjà eu cette discussion avec Pierre Fauconnier] est limité à 65536.

    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
    20
    21
    22
    23
    24
    25
    26
    Sub TestMatch()
    Dim ListTooLong(65536) As String, ListGood(65535) As String, ListCellules(1 To 100000, 1 To 1) As String, i As Long, msg As String
        For i = 0 To 65535
            ListGood(i) = "List " & i
        Next
        msg = "Si la variable tableau contient moins de 65536 valeurs, Match fonctionne : " & _
                Application.WorksheetFunction.Match("List 65527", ListGood, 0)
        For i = 0 To 65536
            ListTooLong(i) = "List " & i
        Next i
        On Error Resume Next
        Debug.Print Application.WorksheetFunction.Match("List 65527", ListTooLong, 0)
        If Err.Number > 0 Then
            msg = msg & vbCrLf & "___________________________________________" & vbCrLf & vbCrLf & _
                "Si la variable tableau contient plus de 65536 valeurs, Match ne fonctionne pas : " & vbCrLf & Err.Description
        End If
        On Error GoTo 0
        For i = 1 To 100000
            ListCellules(i, 1) = "List " & i
        Next i
        Range("A1").Resize(UBound(ListCellules, 1), 1) = ListCellules
        msg = msg & vbCrLf & "___________________________________________" & vbCrLf & vbCrLf & _
                    "Dans la feuille de calcul avec plus de 65536 valeurs, Match fonctionne : " & _
                            Application.WorksheetFunction.Match("List 99527", Range("A1:A100000"), 0)
        MsgBox msg
    End Sub


    Pour le coup, un Long devrait donc faire l'affaire...
    Cordialement,
    Franck

  7. #7
    Rédacteur

    Bonjour Franck,
    J'ai lu l'article que tu as référencé et franchement je ne comprend pas.
    La fonction Match devant renvoyer une position relative dans une plage de cellules (Ligne ou Colonne) et les variable donc une valeur entière positive compris entre 1 et 1 048 576, on ne risque pas de dépasser la valeur maximale d'un type Long (Max -2 147 483 648 et 2 147 483 647)
    Personnellement, je déclare toujours mes variables en Long pour ces cas là, et je n'ai jamais rencontré de souci
    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
    Quelques contributions : USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire - Géolocalisation d'une adresse avec Excel et Google sans VBA