XL 2010 Fonction Match : SOS incompréhension.

coni1983

XLDnaute Nouveau
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 ?

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
 

Fichiers joints

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir Coni,
C'est un grand mystère. Pas d'erreur de syntaxe, rien ... et ça ne marche pas.
Alors je l'ai ré écrit en partie.
C'est exactement la même chose écrit différemment :
VB:
Sub info()
Dim DLSel As Integer, DLSyn As Integer, L As Integer
DLSel = Application.CountA(Sheets("Selection").Range("A:A"))    ' derniere ligne de Selection
DLSyn = Application.CountA(Sheets("Synth").Range("C:C"))        ' derniere ligne de Synthèse
'parcour la plage de la feuille de destination
For Each c In Sheets("Synth").Range("C2:C" & DLSyn)
'gestion de l'erreur de la valeur non trouvé
On Error Resume Next
L = WorksheetFunction.Match(c, Sheets("Selection").Range("A4:A" & DLSel), 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
    c.Offset(, 9).Value = Sheets("Selection").Cells(L, 1).Offset(, 2).Value ' copie valeur
End If
Next c
End Sub
Désolé de ne pas avoir trouvé la coquille.
 

Fichiers joints

job75

XLDnaute Barbatruc
Bonjour coni1983, sylvanu,

A priori c'est plutôt la fonction RECHERCHEV (VLOOKUP) qu'il faut utiliser.

Le plus simple est d'entrer en L2 de la feuille "Synth" :
VB:
=RECHERCHEV(C2;Selection!A:C;3;0)
et de tirer la formule vers le bas.

Maintenant si l'on veut absolument faire ça en VBA exécuter :
Code:
Sub info()
With Sheets("Synth")
    .[L2].Resize(Application.CountA(.[A:A]) - 1) = "=VLOOKUP(C2,Selection!A:C,3,0)"
End With
End Sub
Ce n'est pas la solution la plus rapide mais a priori il n'y a pas des milliers d'élèves...

A+
 

coni1983

XLDnaute Nouveau
Bonsoir Coni,
C'est un grand mystère. Pas d'erreur de syntaxe, rien ... et ça ne marche pas.
Alors je l'ai ré écrit en partie.
C'est exactement la même chose écrit différemment :
VB:
Sub info()
Dim DLSel As Integer, DLSyn As Integer, L As Integer
DLSel = Application.CountA(Sheets("Selection").Range("A:A"))    ' derniere ligne de Selection
DLSyn = Application.CountA(Sheets("Synth").Range("C:C"))        ' derniere ligne de Synthèse
'parcour la plage de la feuille de destination
For Each c In Sheets("Synth").Range("C2:C" & DLSyn)
'gestion de l'erreur de la valeur non trouvé
On Error Resume Next
L = WorksheetFunction.Match(c, Sheets("Selection").Range("A4:A" & DLSel), 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
    c.Offset(, 9).Value = Sheets("Selection").Cells(L, 1).Offset(, 2).Value ' copie valeur
End If
Next c
End Sub
Désolé de ne pas avoir trouvé la coquille.
Bonjour Sylvanu, et tout le monde!
Merci, c'est ce qu'il fallait, et celà fonctionne.
Le gors hic, c'est ce qu'il faLLAIT!!! J'ai appris hier que mes donnés auraient un autre format (en gros dans la source, le nom et prénom seront dans la même cellule) . Par conséquent, il faut que je change de fonction.Je crois qu'il en existe une pour retrouver une chaîne de caractère parmi plusieurs chaines.. Pas impossible que je revienne demander à l'aide.

Bon aprèm et merci encore !
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Si la syntaxe est Nom Prénom avec un espace et que c'est en A1 alors vous faites :
VB:
Sub test()
tablo = Split(Range("A1"), " ") ' Espace étant le séparateur
Nom = tablo(0)
Prénom = tablo(1)
End Sub
Si la chaine était : Bonjour comment ça va , alors on aurait :
tablo(0)=Bonjour
tablo(1)=comment
tablo(2)=ça
tablo(3)=va
Très pratique cette fonction pour découper une chaîne.
 

coni1983

XLDnaute Nouveau
Merci, mais je crains que ça ne fonctionne pas.
En effet, c'est par exemple parfait pour DUPOND Jean . Mais ça bug si on tombe sur DE GAULLE Charles.
Il faudrait donc qu'il arrive à me retrouver DE GAULLE dans une cellule DE GAULLE Charles, puis bien sur qu'il me renvoie la valeur recherchée..
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Exact. On a déjà eu ce problème, ... sans solution. :rolleyes:
Impossible de dissocier DE GAULLE Charles et DEGAULLE Jean Charles.
On a toujours trois mots et c'est insoluble. Sauf à édicter des règles précises comme majuscules ou pas d'espace dans le nom ou ....
Sauf à interdire les espaces sur les prénoms, alors il y a une solution par concaténation.
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour coni1983, sylvanu,

Pour élucider ceci :
C'est un grand mystère. Pas d'erreur de syntaxe, rien ... et ça ne marche pas.
la variable Ligne a été mal déclarée, remplacer Dim Ligne As Range par Dim Ligne As Long.

Maintenant pour le dernier problème la solution est évidente : si nom et prénom sont dans la même cellule il faut que ce soit le cas dans les 2 feuilles Synth et Selection.

A+
 

Créez un compte ou connectez vous pour répondre

Vous devez être membre afin de pouvoir répondre ici

Créer un compte

Créez un compte Excel Downloads. C'est simple!

Connexion

Vous avez déjà un compte? Connectez vous ici.

Haut Bas