Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

vba - comparaison entre 2 zones nommées

9 réponses
Avatar
cousinhub
Bonsoir, pour un projet, j'ai besoin de comparer 2 zones de données nommées :
val1, val2... et base1, base2...
par la méthode : For j = 1 to vcompteur, je voudrais donc comparer les zones
val1 avec base1, val2 avec base2 et renvoyer le résultat dans une cellule.
Voici une partie de mon code :

For j = 1 To vCompteur
i = 2 + j
Range("c" & i) = [SUM(ISNUMBER(MATCH(val& j),base& j),0))*1)]
Next j

A noter que la cellule de destination se situe dans une autre feuille que
les deux zones nommées.
Cependant les deux zones "val & j" et "base & j" ne sont pas prises en compte.
ci-joint un exemple (simplifié) : http://cjoint.com/?lnwOXAugNk
Merci de bien vouloir m'expliquer ce qui ne fonctionne pas

9 réponses

Avatar
AV
Range("c" & i) = [SUM(ISNUMBER(MATCH(val& j),base& j),0))*1)]


Sans avoir régardé le reste, cette syntaxe de "Evaluate" est incorrecte dans la
mesure ou tu veux intégrer des variables.
Il faut passer, obligatoirement, par la "méthode longue" :

Le principe (non testé in situ car on ne sait pas ce que sont tes variables) :

Range("c" & i) = Evaluate("SUM(ISNUMBER(MATCH(" &val &"&" & j &")," &[base] &"&"
& j &"),0))*1)")

AV

Avatar
cousinhub
Bonjour AV,
merci pour ta réponse, mais cela ne fonctionne pas non plus.
Je ne vois pas ce que tu veux dire avec la "méthode longue".
Pour ce qui est des variables, j est le nombre de cellules non vides dans la
zone nommée "val"
Si tu avais une autre façon de procéder, je suis aussi preneur
Merci


Range("c" & i) = [SUM(ISNUMBER(MATCH(val& j),base& j),0))*1)]


Sans avoir régardé le reste, cette syntaxe de "Evaluate" est incorrecte dans la
mesure ou tu veux intégrer des variables.
Il faut passer, obligatoirement, par la "méthode longue" :

Le principe (non testé in situ car on ne sait pas ce que sont tes variables) :

Range("c" & i) = Evaluate("SUM(ISNUMBER(MATCH(" &val &"&" & j &")," &[base] &"&"
& j &"),0))*1)")

AV






Avatar
AV
Est-ce toi qui a écrit cette ligne :
Range("c" & i) = [SUM(ISNUMBER(MATCH(val& j),base& j),0))*1)]

Si oui, que cherches-tu à faire ?
Le "MATCH(....)" me laisse perplexe...

Je ne vois pas ce que tu veux dire avec la "méthode longue".


PS : Il s'agit de la syntaxe Evaluate("chaine de caractères") au lieu de
[chaine de caractères sans variables]

Si "val" et "base" sont des plages nommées, la syntaxe pourrait avoir cette
allure :
Range("c" & i) = Evaluate("SUM(ISNUMBER(MATCH(" &[val] &"&" & j &")," &[base]
&"&"
& j &"),0))*1)")

AV

Avatar
cousinhub
Re,
hélas, cela ne fonctionne pas plus!
avec MATCH(...), je cherche à obtenir le nombre de valeurs identiques entre
les zones nommées (val1) et (base1), (val2) et (base2) etc... et ceci pour
toutes les zones (val"n") renseignées (déterminées par la fonction
CellulesUtilisées)
Merci de ton intérêt


Est-ce toi qui a écrit cette ligne :
Range("c" & i) = [SUM(ISNUMBER(MATCH(val& j),base& j),0))*1)]

Si oui, que cherches-tu à faire ?
Le "MATCH(....)" me laisse perplexe...

Je ne vois pas ce que tu veux dire avec la "méthode longue".


PS : Il s'agit de la syntaxe Evaluate("chaine de caractères") au lieu de
[chaine de caractères sans variables]

Si "val" et "base" sont des plages nommées, la syntaxe pourrait avoir cette
allure :
Range("c" & i) = Evaluate("SUM(ISNUMBER(MATCH(" &[val] &"&" & j &")," &[base]
&"&"
& j &"),0))*1)")

AV






Avatar
AV
J'avoue que j'ai du mal...
Dans ton code les variables "val" et "base" ne sont pas initialisée donc
l'Evaluate plantera forcément quelle que soit la syntaxe !
La comparaison entre les plages doit se faire colonne par colonne (exemple :
comparaison A4 /A12) ou indifféremment sur l'ensemble des données ?
Il serait préférable que dans ton fichier exemple tu donnes le résultat
attendu..

AV
Avatar
cousinhub
Re,
la comparaison doit s'effectuer sur toutes les cellules des zones
concernées, et compter le nombre de cellules identiques
ci joint le fichier avec le résultat escompté : http://cjoint.com/?lopF3PoqKN
les variables "val" et "base" ne sont en fait pas des variables, mais il
faut plutôt comprendre "val1", "val2".. "base1", "base2"....
Merci


J'avoue que j'ai du mal...
Dans ton code les variables "val" et "base" ne sont pas initialisée donc
l'Evaluate plantera forcément quelle que soit la syntaxe !
La comparaison entre les plages doit se faire colonne par colonne (exemple :
comparaison A4 /A12) ou indifféremment sur l'ensemble des données ?
Il serait préférable que dans ton fichier exemple tu donnes le résultat
attendu..

AV





Avatar
AV
Une fonction perso devrait faire :

Function COMPT_COMPAR(plage1, plage2)
x1 = [countA(plage1)]
x2 = [countA(plage2)]
If x1 > x2 Or x1 = x2 Then
For Each c In [plage1]
If c <> "" And Application.CountIf([plage2], c) > 0 Then n = n + 1
Next
Else
For Each c In [plage2]
If c <> "" And Application.CountIf([plage1], c) > 0 Then n = n + 1
Next
End If
COMPT_COMPAR = n
End Function

Dans ta feuille ça peut faire :
=COMPT_COMPAR(val1;base1)

AV
Avatar
cousinhub
Merci beaucoup,
je vais opter pour ta proposition
je voulais faire cela par macro afin de n'avoir pas de formules dans les
cellules de destination, mais tant pis, cela fonctionne parfaitement.
Merci encore


Une fonction perso devrait faire :

Function COMPT_COMPAR(plage1, plage2)
x1 = [countA(plage1)]
x2 = [countA(plage2)]
If x1 > x2 Or x1 = x2 Then
For Each c In [plage1]
If c <> "" And Application.CountIf([plage2], c) > 0 Then n = n + 1
Next
Else
For Each c In [plage2]
If c <> "" And Application.CountIf([plage1], c) > 0 Then n = n + 1
Next
End If
COMPT_COMPAR = n
End Function

Dans ta feuille ça peut faire :
=COMPT_COMPAR(val1;base1)

AV





Avatar
AV
je voulais faire cela par macro afin de n'avoir pas de formules


Tu peux aisément transformer la fonction perso fournie en macro ...

AV