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.

10 réponses

1 2
Avatar
Daniel.C
Bonjour.
Essaie :

Dim toto As Range
Dim titi As Range
...
Set toto = Range("A36:A" & LastRow)
Set titi = Range("B36:B" & LastRow)
If WorksheetFunction.IsNA(Application.Match(1, (toto =
ClientCt)
* (titi = RefCt), 0)) Then


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.
Avatar
JB
Bonsoir,

Recherche matricielle 2 critères

http://boisgontierjacques.free.fr/pages_site/cellules.htm#RechercheMatrciel le

JB

On 9 mar, 19:20, ke78ke wrote:
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, (t oto = 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.
Avatar
ke78ke
Merci, c'est en effet simple comme bonjour ! Je doi être un peu fâché avec
les ranges dans VBA... Je n'ai pas encore trouvé un bouquin qui soit
suffisamment clair pour ma petite tête, le Walkenbach est trop touffu...
Bonne journée.

"Daniel.C" wrote:

Bonjour.
Essaie :

Dim toto As Range
Dim titi As Range
....
Set toto = Range("A36:A" & LastRow)
Set titi = Range("B36:B" & LastRow)
If WorksheetFunction.IsNA(Application.Match(1, (toto =
ClientCt)
* (titi = RefCt), 0)) Then


> 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.


.

Avatar
ke78ke
Merci, solution très élégante ...
et plein de bonnes choses dans le reste de la page ! bonne journée.

"JB" wrote:

Bonsoir,

Recherche matricielle 2 critères

http://boisgontierjacques.free.fr/pages_site/cellules.htm#RechercheMatrcielle

JB

On 9 mar, 19:20, ke78ke wrote:
> 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.

.

Avatar
ke78ke
Trop vite parlé...avant d'essayer !
j'ai toujours le même message (erreur 13 incompatibilité de type) lorsque le
nombre d 'éléments du range de toto ou titi est supérieur à 1 lors de
l'exécution de l'instruction Match... tout se passe comme si VBA ne
comprenait pas que l'expression est matricielle, et m'indique qu'il est
impossible de comparer un vecteur et un scalaire...
Faut-il que je crée un vecteur de même dimension que toto dont chaque
élément vaudrait ClientCt, créer le vecteur vrai/faux de même dimension les
comparant, idem avec titi / RefCt puis rentrer dans Match le produit de ces
deux vecteurs ??? cela me semble bien lourd... Please, help me !
-
Dim RefCt As String
Dim RefSt As String
Dim ClientCt As Variant
Dim ClientSt As Variant
Dim toto As Range
Dim titi As Range
...
RefSt = Range("B" & Nb_Of_Old + 2).Value
ClientSt = Range("A" & Nb_Of_Old + 2).Value
...
RefCt = RefSt
ClientCt = ClientSt
...
LastRow = Range("A34").End(xlDown).Row + 1
Set toto = Range("A36:A" & LastRow)
Set titi = Range("B36:B" & LastRow)

If WorksheetFunction.IsNA(Application.Match(1, (toto = ClientCt) * (titi =
RefCt), 0)) Then
i_Ex = Application.WorksheetFunction.Count(toto) + 36
Range("A" & i_Ex) = ClientCt
Range("B" & i_Ex) = RefCt
Else
i_Ex = Application.Match(1, (toto = ClientCt) * (titi = RefCt), 0) + 35
End If
Avatar
ke78ke
J'avais répondu trop vite...
Comme pour la solution proposée par Daniel C., j'ai essayé la méthode avec
pos = Evaluate("Match... puis range().Offset(pos...
ça plante quand même à Match avec la même erreur d'incompatibilité de type,
sauf quand le range de toto et titi se limite à un élément...
Merci devotre aide !
Avatar
Daniel.C
Essaie :

Set toto = Range("A36:A" & LastRow)
Set titi = Range("B36:B" & LastRow)
If Evaluate("SumProduct((" & toto.Address & "=""" & _
ClientCt & """)*(" & titi.Address & "=""" & RefCt & """))") > 0 Then

Daniel

Trop vite parlé...avant d'essayer !
j'ai toujours le même message (erreur 13 incompatibilité de type) lorsque le
nombre d 'éléments du range de toto ou titi est supérieur à 1 lors de
l'exécution de l'instruction Match... tout se passe comme si VBA ne
comprenait pas que l'expression est matricielle, et m'indique qu'il est
impossible de comparer un vecteur et un scalaire...
Faut-il que je crée un vecteur de même dimension que toto dont chaque
élément vaudrait ClientCt, créer le vecteur vrai/faux de même dimension les
comparant, idem avec titi / RefCt puis rentrer dans Match le produit de ces
deux vecteurs ??? cela me semble bien lourd... Please, help me !
-
Dim RefCt As String
Dim RefSt As String
Dim ClientCt As Variant
Dim ClientSt As Variant
Dim toto As Range
Dim titi As Range
...
RefSt = Range("B" & Nb_Of_Old + 2).Value
ClientSt = Range("A" & Nb_Of_Old + 2).Value
...
RefCt = RefSt
ClientCt = ClientSt
...
LastRow = Range("A34").End(xlDown).Row + 1
Set toto = Range("A36:A" & LastRow)
Set titi = Range("B36:B" & LastRow)

If WorksheetFunction.IsNA(Application.Match(1, (toto = ClientCt) * (titi =
RefCt), 0)) Then
i_Ex = Application.WorksheetFunction.Count(toto) + 36
Range("A" & i_Ex) = ClientCt
Range("B" & i_Ex) = RefCt
Else
i_Ex = Application.Match(1, (toto = ClientCt) * (titi = RefCt), 0) + 35
End If
Avatar
Daniel.C
Ou plutôt, pour suivre ta commande, mets "=0" au lieu de ">0".
Daniel

Essaie :

Set toto = Range("A36:A" & LastRow)
Set titi = Range("B36:B" & LastRow)
If Evaluate("SumProduct((" & toto.Address & "=""" & _
ClientCt & """)*(" & titi.Address & "=""" & RefCt & """))") > 0 Then

Daniel

Trop vite parlé...avant d'essayer !
j'ai toujours le même message (erreur 13 incompatibilité de type) lorsque
le nombre d 'éléments du range de toto ou titi est supérieur à 1 lors de
l'exécution de l'instruction Match... tout se passe comme si VBA ne
comprenait pas que l'expression est matricielle, et m'indique qu'il est
impossible de comparer un vecteur et un scalaire...
Faut-il que je crée un vecteur de même dimension que toto dont chaque
élément vaudrait ClientCt, créer le vecteur vrai/faux de même dimension les
comparant, idem avec titi / RefCt puis rentrer dans Match le produit de ces
deux vecteurs ??? cela me semble bien lourd... Please, help me !
-
Dim RefCt As String
Dim RefSt As String
Dim ClientCt As Variant
Dim ClientSt As Variant
Dim toto As Range
Dim titi As Range
...
RefSt = Range("B" & Nb_Of_Old + 2).Value
ClientSt = Range("A" & Nb_Of_Old + 2).Value
...
RefCt = RefSt
ClientCt = ClientSt
...
LastRow = Range("A34").End(xlDown).Row + 1
Set toto = Range("A36:A" & LastRow)
Set titi = Range("B36:B" & LastRow)
If
WorksheetFunction.IsNA(Application.Match(1, (toto = ClientCt) * (titi =
RefCt), 0)) Then
i_Ex = Application.WorksheetFunction.Count(toto) + 36
Range("A" & i_Ex) = ClientCt
Range("B" & i_Ex) = RefCt
Else
i_Ex = Application.Match(1, (toto = ClientCt) * (titi = RefCt), 0) +
35
End If
Avatar
JB
Bonsoir,

http://boisgontierjacques.free.fr/fichiers/Cellules/RechercheMatricielle2Cr iteres.xls

JB

On 16 mar, 14:23, ke78ke wrote:
J'avais répondu trop vite...
Comme pour la solution proposée par Daniel C., j'ai essayé la métho de avec
pos = Evaluate("Match... puis range().Offset(pos...
ça plante quand même à Match avec la même erreur d'incompatibilit é de type,
sauf quand le range de toto et titi se limite à un élément...
Merci devotre aide !
Avatar
ke78ke
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
1 2