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
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
A voir également:
- VBA, recherche parmis un rang de dates
- Recherche automatique des chaînes ne fonctionne pas - Guide
- Nombre de jours entre deux dates excel - Guide
- Comment ouvrir un fichier dat - Guide
- Recherche photo - Guide
- Fréquence tnt recherche manuelle - Forum Téléviseurs
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
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
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
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
Modifié par michel_m le 10/06/2011 à 12:14
Bonjour,
pourquoi cells(16,12) ?
Combien as tu de lignes (environ) ?
pourquoi cells(16,12) ?
Combien as tu de lignes (environ) ?
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
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!
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!
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
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...
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...
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
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
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
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)
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)
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
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?
Alors Michel, une idée?
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
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é
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
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
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
14 juin 2011 à 10:52
Super Merci beaucoup
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
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.
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.
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
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
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
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
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.
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.