VBA, recherche parmis un rang de dates

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

  1. 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
    1. Contributeur
      Bonjour,

      pourquoi cells(16,12) ?
      Combien as tu de lignes (environ) ?
      0
      1. 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
        1. Contributeur
          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
          1. 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
            1. Contributeur
              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
              1. 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
                1. Contributeur
                  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
                  1. 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
                    1. Contributeur
                      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
                      1. 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