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 !
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 '-----------------------------------------
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
'-----------------------------------------
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 '-----------------------------------------
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
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
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
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
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
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 '-----------------------------------------
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
'-----------------------------------------
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 '-----------------------------------------
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 :
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 :
12088371.66.1335566168920.JavaMail.geo-discussion-forums@vbcg6...
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 :
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 '----------------------------------------------------
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
'----------------------------------------------------
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 '----------------------------------------------------