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

Comparer une plage à un tableau

12 réponses
Avatar
Apitos
Bonsoir =E0 tous,

J'aimerais comparer une plage =E0 un tableau Tbl.

Je voulais utiliser la fonction InArray, mais =E7a ne marche pas :

[CODE]if cel.Value inarray(tbl) then range("F" & Cel.Row).Value=3D"#" & Str=
date & "#"[/CODE]

Alors j'ai ajout=E9 quelques lignes de codes en plus, pour remplacer le tra=
vail de cette fonction...

Sub Comparer()
Dim WS1 As Worksheet, WS2 As Worksheet
Dim i As Long, j As Long
Dim Tbl() As String, Strg As String, Strdate As String
Dim C As Range, Cel As Range

Set WS1 =3D Sheets("feuil1")
Set WS2 =3D Sheets("feuil2")
Strdate =3D Format(Now, "dd/mm/yy")


'-- Remplir le tableau Tbl par les valeurs de la colonne A correspondan=
te
i =3D 1
For Each C In WS2.Range("F2:F" & WS2.[F65000].End(xlUp).Row)
If C.Value =3D "Done" Then
ReDim Preserve Tbl(i)
Tbl(i) =3D WS2.Range("A" & C.Row)
i =3D i + 1
End If
Next C

'-- Regrouper les valeurs du Tbl dans la chaine Strg pour faciliter la =
comparaison avec InStr
For j =3D 1 To UBound(Tbl)
Strg =3D Strg & Tbl(j) & "|"
Next j

'-- S'il y a une valeur de la colonne A feuille 1 qui corresponde =E0 u=
ne valeur de Tbl
'-- On =E9crit la date d'aujourd'hui dans la colonne F
For Each Cel In WS1.Range("A2:A" & [A65000].End(xlUp).Row)

'if cel.Value inarray(tbl) then range("F" & Cel.Row).Value=3D"#" & =
Strdate & "#"
If InStr(Strg, Cel.Value) =3D 1 Then
Range("F" & Cel.Row).Value =3D "#" & Strdate & "#"
End If
Next Cel
End Sub

1 - Existe-t-il une fonction similaire pour comparer une valeur =E0 toutes =
les valeurs d'un tableau en une seule fois ?

2 - Si mon tableau Tbl comporte 4 valeurs, la derni=E8re boucle du code ne =
consid=E8re la comparaison juste avec Instr que pour la premi=E8re valeur s=
eulement !

3 - Sinon comment r=E9duire ces lignes de codes ?

Merci d'avance.

10 réponses

1 2
Avatar
MichD
Bonjour

| inarray(tbl)

Pour rechercher une valeur dans un "Array" (tableau), tu utilises la fonction "Match"
(Equiv())

X = application.Match(cel.Value,Tbl,0)
if IsNumeric(x) then
'X représente la position de la valeur dans le tableau
'La fonction Match s'arrête dès qu'elle trouve la première occurrence de la valeur
cherchée.
end if

Un petit exemple :
'-----------------------------------------
Sub test()

Dim InArray(), X As Variant

InArray = Array(5, 10, 25)
X = Application.Match(12, InArray, 0)
If IsNumeric(X) Then
MsgBox X
Else
Err = 0
End If
End Sub
'-----------------------------------------


MichD
---------------------------------------------------------------
Avatar
Apitos
Bonjour Denis,

En voulant adapter ton code avec le mien, j'ai reçu cette erreur :
'------------
Dim Tbl() As Long, X as Variant

X = Application.Match(Cel.Value, Tbl, 0)

'-------------

Erreur d'exécution '5':
Argument ou appel de procédure incorrect
Avatar
MichD
Attention,

Quel est le type de donnée que représente "cel.value" ? Valeur numérique, texte ?
Quel est le type de données contenues dans la variable tableau "Tbl" ? Valeur numérique,
texte?

Il doit y avoir concordance dans le type des données et du tableau pour que la fonction
"Match" fonctionne.
Au besoin, tu peux utiliser l'une des fonctions de conversion...
Cstr(), Clng() , Cdbl() .... voir l'aide VBA - Excel



MichD
---------------------------------------------------------------
Avatar
Apitos
Salut,

Quel est le type de donnée que représente "cel.value" ? Valeur numé rique, texte ?



Numérique

Quel est le type de données contenues dans la variable tableau "Tbl" ? Valeur numérique,
texte?



Numérique
Avatar
MichD
Est-ce que cet exemple fonctionne? Est-ce que ton tableau contient une grande quantité de
données? Quelle est ta version d'Excel?


'-----------------------------------------
Sub test()

Dim InArray(), X As Variant

InArray = Array(5, 10, 25)
X = Application.Match(12, InArray, 0)
If IsNumeric(X) Then
MsgBox X
Else
Err = 0
End If
End Sub
'-----------------------------------------


MichD
---------------------------------------------------------------
Avatar
Apitos
ca marche maintenant..

voila l'exemple que j'utilise :

http://cjoint.com/?BDCaGWXmq9d

j'espere qu'on peut paufiner ce code ?
Avatar
MichD
Dans la colonne de la feuille où tu veux inscrire la date, tu pourrais utiliser
cette formule et la recopier sur toute la colonne.

'La plage de cellules Feuil1!A2:A11 peut être défini par un nom utilisant la fonction
Decaler()
'tu substitues dans la formule la plage par le nom.
'Tu mets la colonne avec un format date de ton choix.
=IF(ISNUMBER(INDEX(Feuil1!A2:A11;MATCH(IF(Feuil2!F2="done";A2;"");Feuil1!A2:A11;0)));TODAY();"")


Tu peux utiliser VBA pour copier la formule sur l'étendue de la plage de cellules...
et pour enlever la formule et mettre en dur la date
En supposant que tu veuilles tes dates en colonne B:B
Range("B2:B" & x).value = range("B2:B" & x) .value



MichD
---------------------------------------------------------------
"Apitos" a écrit dans le message de groupe de discussion :


ca marche maintenant..

voila l'exemple que j'utilise :

http://cjoint.com/?BDCaGWXmq9d

j'espere qu'on peut paufiner ce code ?
Avatar
MichD
Dans le fichier que tu as publié, attache cette macro au
bouton de commande de la feuil1.

'----------------------------------------------------
Sub test()
Application.ScreenUpdating = False
Application.EnableEvents = False

With Feuil1
With .Range("A2:A" & .Range("A65536").End(xlUp).Row)
.Offset(, 1).Formula = "=IF(ISNUMBER(INDEX(" & _
"Feuil1!A2:A11,MATCH(IF(Feuil2!F2=" & _
"""done"",A2,""""),Feuil1!A2:A11,0))),TODAY(),"""")"
.Offset(, 1).Value = .Offset(, 1).Value
.Offset(, 1).NumberFormat = "dd/mm/yy"
End With
End With
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
'----------------------------------------------------


MichD
---------------------------------------------------------------
Avatar
MichD
C'est la même procédure mais avec des plages ajustables automatiquement!

'-------------------------------------------
Sub test1()

Dim Rg As Range
Application.ScreenUpdating = False
Application.EnableEvents = False

With Feuil2
Set Rg = .Range("A2:A" & .Range("A65536").End(xlUp).Row)
End With

With Feuil1
With .Range("A2:A" & .Range("A65536").End(xlUp).Row)
.Offset(, 1).Formula = "=IF(ISNUMBER(INDEX(" _
& Rg.Parent.Name & "!" & Rg.Address & _
",MATCH(IF(" & Rg.Parent.Name & "!" & _
Rg(1).Offset(, 5).Address(0, 0) & _
"=""done"",A2,"""")," & .Address & ",0))),TODAY(),"""")"
.Offset(, 1).Value = .Offset(, 1).Value
.Offset(, 1).NumberFormat = "dd/mm/yy"
End With
End With
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
'-------------------------------------------



MichD
---------------------------------------------------------------
Avatar
Apitos
Bonsoir Denis,

Ca marche parfaitement.

Merci bien.

Cordialment.
1 2