VBA, recherche parmis un rang de dates

Fermé
amdbg Messages postés 17 Date d'inscription lundi 27 juillet 2009 Statut Membre Dernière intervention 22 juin 2011 - Modifié par amdbg le 10/06/2011 à 11:12
amdbg Messages postés 17 Date d'inscription lundi 27 juillet 2009 Statut Membre Dernière intervention 22 juin 2011 - 14 juin 2011 à 17:23
Bonjour,

Je cherche a créer un programme sur VBA qui pourra traiter une multitude de données.
Dans la colonne E à partir de la ligne 16 j'ai des dates.
Dans la colonne K à partir de la ligne 16 j'ai quelques dates qui figurent toutes parmis les dates de E.
A une date de K est annexé un chiffre dans la colonne L sur la même ligne.

Si la date en E# correspond a une des dates en K j'aimerais mettre en H#, le chiffre de la colonne L qui correspond à la date en K.

Je ne souhaite pas utiliser de boucles mais plutôt une fonction recherche.

J'ai commencé un programme mais il ne fonctionne pas, avez vous une idée pour l'améliorer??

Merci d'avance

Sub vep()

Dim i As Integer
i = ActiveCell.Row


Dim e As Date
e = Cells(i, 5)

Dim h As Double

k = Range("K16", Range("K16").End(xlDown))


If Not k.Find(What:=e, lookin:=xlFormulas) Is Nothing Then h = 48.5 Else h = 0

Cells(i, 8) = h

End Sub

12 réponses

amdbg Messages postés 17 Date d'inscription lundi 27 juillet 2009 Statut Membre Dernière intervention 22 juin 2011
10 juin 2011 à 12:01
Bon j'ai réussi a rendre ma macro effective, maintenant j'aimerais la transformer en fonction. Je serais très reconnaissante de toute aide!

Sub vep()

Dim i As Integer
i = ActiveCell.Row


Dim e As Date
e = Cells(i, 5)


Dim h As Double

Set k = Range("K16", Range("K16").End(xlDown)).Find(What:=e, LookIn:=xlValues)

If k Is Nothing Then h = 0 Else h = Cells(16, 12)

Cells(i, 8).Value = h
End Sub
0
michel_m Messages postés 16602 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 313
Modifié par michel_m le 10/06/2011 à 12:14
Bonjour,

pourquoi cells(16,12) ?
Combien as tu de lignes (environ) ?
0
amdbg Messages postés 17 Date d'inscription lundi 27 juillet 2009 Statut Membre Dernière intervention 22 juin 2011
10 juin 2011 à 14:02
Bonjour,

Pour le moment je traite un exemple ou la colonne E a 350 lignes et la K 60.

Cells(16,12) car h doit être égal a la valeur placée dans la cellule L16. Idéalement il faudrait que ça soit la cellule Li qui correspond au Ki identique a la date en E, (mais je commence par le cas ou tous les Li sont égaux ).

Est-ce possible que la seule variable de la fonction soit le numéro de ligne?

J'ai essayé de modifier mon code pour qu'il soit sous forme de fonction. Le pas-à-pas détaillé se déroule sans problème, et les variables locales sont correctes dans l'éditeur vba. Néanmoins, quand je tape =vep() dans la cellule ou je souhaite obtenir mon calcul l'erreur #valeur apparaît.

Function vep()

Dim i As Integer
i = ActiveCell.Row


Dim e As Date
e = Cells(i, 5)

v = Cells(16, 12).Value

Set k = Range("K16", Range("K16").End(xlDown)).Find(What:=e, LookIn:=xlValues)

If k Is Nothing Then vep(i, k) = 0 Else vep(i, k) = v

End Function



Merci de votre aide!
0
michel_m Messages postés 16602 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 313
10 juin 2011 à 14:08
et pourtant

Si la date en E# correspond a une des dates en K j'aimerais mettre en H#, le chiffre de la colonne L qui correspond à la date en K.

mais je commence par le cas ou tous les Li sont égaux

Pourquoi, il faudra recommencer le code après?

J'avoue que...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
amdbg Messages postés 17 Date d'inscription lundi 27 juillet 2009 Statut Membre Dernière intervention 22 juin 2011
10 juin 2011 à 14:13
En fait dans le cas général ils sont égaux, donc ça m'avance déjà bien de le faire dans ce cas. Après c'est claire que si tu sais comment programmer cette fonction avec des Li qui varient, je suis ouverte a tes propositions
0
michel_m Messages postés 16602 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 313
10 juin 2011 à 14:21
OK, je regarde tout à l'heure (des trucs à faire hier)

remarque amicale:
dans un problème, indique bien toutes les conditions dès le départ.. une nouvelle condition indiquée après peut obliger à tout refaire et tu risque une fin de non recevoir de ce type:
Il faut bien te rendre compte que ce que tu demandes n'est pas forcément facile et que personne ne veut passer parfois plusieurs heures à essayer de résoudre un problème bénévolement pour se voir dire après coup « non vous n'avez pas compris mon problème (rarement, je n'ai pas bien expliqué) il faut en plus que.... »
:o)
0
amdbg Messages postés 17 Date d'inscription lundi 27 juillet 2009 Statut Membre Dernière intervention 22 juin 2011
10 juin 2011 à 14:28
Oui désolé, je n'ai pas l'habitude de poster des messages, j'ai essayée d'être la plus claire possible mais si il manque des précisions n'hésitez pas à me demander!

Alors Michel, une idée?
0
michel_m Messages postés 16602 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 313
Modifié par michel_m le 10/06/2011 à 19:05
re,

excuse le retard involontaire + souci avec la fonction find n'aimant pas des dates (si qqn connait la méthode, j'achète) et j'ai fini par me résoudre à passer par une matricielle

la fonction doit ^tre dans la colonne H où tu veux la valeur sous condition, tu ase le n° de ligne à saisir en parametre comme tu l'avais demandé

Function chercher_m_date(ligne As Long) As Double 
     lig_fin = Range("K10000").End(xlUp).Row 
     Set plage = Range("K16:K" & lig_fin) 
     If Intersect(ActiveCell, Range("H16:H10000")) Is Nothing Then Exit Function 
     jour = Cells(ligne, "E") * 1 
     lig = Evaluate("Max(IF(" & [plage].Address & "=" & jour & ",Row(" & [plage].Address & "),0))") 
     'lig = plage.Find(jour, xlValues).Row 
     If lig = 0 Then 
          chercher_m_date = 0 
     Else 
          chercher_m_date = Cells(lig, "L") 
     End If 
End Function 


maquette
https://www.cjoint.com/?3Fks35lNfay

suggestion:
peut-^tre que le mieux serait de passer par une événementielle: quand tu clique sur une date dans la colonne E, tu as la réponse en col H; la modif est facile à faire puisque le traitement est le m^me...

Michel
0
amdbg Messages postés 17 Date d'inscription lundi 27 juillet 2009 Statut Membre Dernière intervention 22 juin 2011
14 juin 2011 à 10:52
Super Merci beaucoup
0
amdbg Messages postés 17 Date d'inscription lundi 27 juillet 2009 Statut Membre Dernière intervention 22 juin 2011
14 juin 2011 à 15:26
Comme mon jeu de données est grand il n'est pas très pratique d'avoir le numéro de ligne comme variable a compléter à chaque ligne. De plus pour pouvoir facilement réutiliser cette fonction, j'aimerais que les variables de la fonction soient la plage de données et les colonnes. Il est primordiale que fonction soit adaptable à d'autres programmes.
A partir de ton programme j'ai fait ce programme (qui ne fonctionne pas).

Function isinornot(X As Range, m As Long, n As Long)
'X, plage de données
'm, colonne ou sont toutes nos données E
'n, colonne ou sont les valeurs que l'on veut rentré L

i = ActiveCell.Row

If Intersect(Cells(i, m), X) Is Nothing Then Exit Function
jour = Cells(i, m) * 1
lig = Evaluate("Max(IF(" & [X].Address & "=" & jour & ",Row(" & [X].Address & "),0))")
'lig = plage.Find(jour, xlValues).Row
If lig = 0 Then
isinornot = 0
Else
isinornot = Cells(lig, n)
End If


End Function

Pour l'utiliser sur ta maquette il faudrait taper =isinornot(K16:K31;5;12).
Vois tu l'erreur?

Merci beaucoup de ton aide, et excuse moi pour mon manque de précision. J'ai du mal a être claire, alors n'hésite pas a me demander les points a éclairer.
0
michel_m Messages postés 16602 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 313
14 juin 2011 à 16:39
bonjour,

10 juin:
Est-ce possible que la seule variable de la fonction soit le numéro de ligne?
Aujourd'hui:
il n'est pas très pratique d'avoir le numéro de ligne comme variable a compléter à chaque ligne
+tard:
??????


en programmation, les variables à une lettre sont à éviter (mini:3) sauf i, j,k pour des compteurs de boucles dans des procédures encapsulées où elles sont tolérées
ces variables doivent ^tre explicites pour faciliter la maintenance qui représente 80% de la vie de l'application

ta fonction plante d'accord mais il serait intéressant de savoir où elle plante. pour cela tu cliques sur la 1°ligne de code et tu fais un point d'arret (F9) et tu avances en pas à pas avec F8 et tu dis le résultat
0
amdbg Messages postés 17 Date d'inscription lundi 27 juillet 2009 Statut Membre Dernière intervention 22 juin 2011
14 juin 2011 à 17:23
Je me suis mal exprimée, je souhaite que la fonction dépende du numéro de ligne mais le détermine toute seule. Est-ce qu'il vaut mieux mettre ActiveCell.Row au lieu de i?

Lorsque je fais le pas à pas détaillé, ça ne fonctionne pas (alors que lorsque j'avais fait une macro ça fonctionnait). Etant donnée que les variables ne sont pas définies dans le programme je ne suis pas sure que le programme puisse tourner.
0