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

VBA fonction Match

14 réponses
Avatar
ke78ke
Bonjour,
dans un tableau assez gros, je cherche le n° de ligne selon deux critères
correspondant à deux colonnes.
Le code suivant ne fonctionne pas :
...
Dim ClientCt As Variant
Dim RefCt As String
Dim toto As Variant
Dim titi As Variant
...
toto = Range("A36:A" & LastRow)
titi = Range("B36:B" & LastRow)
If WorksheetFunction.IsNA(Application.Match(1, (toto = ClientCt)
* (titi = RefCt), 0)) Then
...
>>> erreur d'excécution 13 Incompatibilité de type...
la même fonction sous excel fonctionne :
=EQUIV(1;(A36:A41532="12")*(B36:B41532="as");0). Je dois mettre "12" car la
colonne est formatée texte.
Merci pour toute aide.

4 réponses

1 2
Avatar
Daniel.C
Var = Evaluate("Max((" & toto.Address & "=""" & _
ClientCt & """)*(" & titi.Address & "=""" & _
RefCt & """)*row(" & toto.Address & "))")

Renvoie le numéro de ligne cherché. Il faut donc ôter 35 du résultat
trouvé.
Daniel

Merci de ta réponse, sumprod() fonctionne en effet pour vérifier que je n'ai
aucune occurence sur les deux critères ; dans ce cas j'ajoute une nouvelle
ligne à mon tableau ("A36:DF" & LastRow), dont toto et titi sont les deux
1ères colonnes ; mais dans le cas contraire, j'ai besoin de savoir quel est
le rang dans le tableau de la ligne répondant aux deux critères (pour la
modiifier), et j'utilisais pour celà la même fonction Match()... qui ne
marche toujours pas !
Pour la rapidité (je balaye un tableau ~100 x 10.000 dans 13 feuilles), je
ne voudrais pas être amené à faire pour chaque feuille, une boucle qui lit
toto et titi, fait un test et s'arrête sur la bonne ligne... Match me
semblait séduisant...
Avec mes remerciements
Avatar
ke78ke
Merci pour la continuité de ton soutien !
Je n'aurais pas eu l'idée de * le test logique par le n° de ligne, très
malin...
ClientCt et RefCt étant des String (bien qu'ils puissent avoir des valeurs
pouvant ressembler à des entiers), j'ai dû modifier l'expression en enlevant
deux " à droite et à gauche de ClientCt et refCt, et enfin, cela fonctionne !
Où pourrais-je trouver une explication claire et exhaustive pour l'emploi
des " et des & dans l'écriture des formules, cela me semble bien curieux ...?
bonne journée.
Avatar
Daniel.C
Signification d'une partie de la formule :
"Max((" & toto.Address & "="""
"Max((" : chaîne de caractères
& toto.Address : concaténationde l'adresse de la plage; on obtient
quelque chose comme :
Max((A1:B10
& "=""" : concaténation d'une autre chaîne de caractères; on obtient :
Max((A1:B10=""
etc.
Cordialement.
Daniel
Merci pour la continuité de ton soutien !
Je n'aurais pas eu l'idée de * le test logique par le n° de ligne, très
malin...
ClientCt et RefCt étant des String (bien qu'ils puissent avoir des valeurs
pouvant ressembler à des entiers), j'ai dû modifier l'expression en enlevant
deux " à droite et à gauche de ClientCt et refCt, et enfin, cela fonctionne !
Où pourrais-je trouver une explication claire et exhaustive pour l'emploi
des " et des & dans l'écriture des formules, cela me semble bien curieux ...?
bonne journée.
Avatar
ke78ke
Merci Daniel,
Ma question ne portait pas sur la concaténation, mais plutôt sur le fait
qu'en VBA il faille parfois multiplier les " autour de valeurs pour qu'elles
soient bien comprises comme des valeurs et non des champs, ou inversement.
Par exemple, pour que ta formule fonctionne, j'ai dû ne mettre qu'un seul "
autour de ClientCt, mais il m'est arrivé dans d'autres formiules de devoir
entourer une valeur de trois "... Ceci lié au fait que l'écriture ne me
semble pas être la même lorsqu'une expression est incluse dans un
evaluate()... on passerait alors dans un langage plutôt excel que VBA... ?
En tout état de cause, ça marche dorénavant, et c'est bien l'essentiel !
1 2