VBA fonction Match

Le
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.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Daniel.C
Le #21350511
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.
JB
Le #21350601
Bonsoir,

Recherche matricielle 2 critères

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

JB

On 9 mar, 19:20, 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, (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.
ke78ke
Le #21385581
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.


.

ke78ke
Le #21385691
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 > 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.

.

ke78ke
Le #21386321
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
ke78ke
Le #21386361
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 !
Daniel.C
Le #21387401
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
Daniel.C
Le #21387821
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
JB
Le #21388691
Bonsoir,

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

JB

On 16 mar, 14:23, ke78ke
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 !
ke78ke
Le #21391001
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
Publicité
Poster une réponse
Anonyme