Proposer une valeur approchante après une recherche infructueuse

Fedaykin7 Messages postés 4 Date d'inscription   Statut Membre Dernière intervention   -  
Fedaykin7 Messages postés 4 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

Je souhaite réaliser des statistiques sur un tableau excel
Pour cela j'ai créé une macro dans laquelle je propose à l'utilisateur une plage de dates (je fournis à l'utilisateur la date de début et de fin de la plage mais pas les intermédiaires) à partir de laquelle commencer les stats
L'utilisateur saisit la date de début désirée et la macro vérifie si la date appartient à la plage. Si elle n'appartient pas à la plage, la macro calcule des valeurs inférieures et supérieures à la date demandée, teste si ces valeurs font partie de la plage et les propose comme nouvelle saisie à l'utilisateur.
Mon problème est le suivant :
Une des dates supérieures ou inférieures proposées par la macro n'est pas la date immédiatement inférieure/supérieure mais pas les 2.
ex
en A1 j'ai 8/12/11
en A2 j'ai 9/12/11
en A3 j'ai 12/12/11
en A4 j'ai 13/12/11
Si l'utilisateur choisit le 10/12/11 (absent du tableau), la macro lui proposera de choisir soit le 8/12/11 soit le 12/12/11 alors que je voudrais que la macro propose le 9/12/11
Si au contraire l'utilisateur choisit le 11/12/11 (absent du tableau également), la macro lui proposera de choisir soit le 9/12/11 soit le 13/12/11 alors que je voudrais que la macro propose le 12/12/11

Mon code :

DateDebut = InputBox("Quelle date de début de calcul des statistiques désirez-vous?")     
For Each e In [A1:A4]
If e Like DateDebut Then
       e.Select
       Excel.Run ("Autre Macro")
       
       Else
       ValSup = DateDebut + 1
       ValInf = DateDebut - 1
       End If
       
       If Not e Like ValSup Then
       ValSup = ValSup + 1
       End If
      
       If Not e Like ValInf Then
       ValInf = ValInf - 1
       End If
       
       
    Next
          
                                                    
    TexteAfficher2 = "Veuillez choisir une autre date de début" & vbCr & "Les dates les plus proches de la date désirées sont " & ValInf & "et " & ValSup & "."
    DateDebut = InputBox(TexteAfficher2)


Je ne comprends pas où est l'erreur dans mon code
Merci de votre aide

6 réponses

  1. Heliotte Messages postés 1561 Statut Membre 92
     
    Bonsoir Fedaykin7,

    Ne serait-il pas plus judicieux de ne faire choisir par l'utilisateur qu'une date existante ?

    Plus simple et sans surprise.
    1
  2. Fedaykin7 Messages postés 4 Date d'inscription   Statut Membre Dernière intervention  
     
    Merci de votre réponse

    Le problème étant qu'actuellement ma plage fait déjà plus de 500 lignes

    De plus j'aimerai que les utilisateurs n'aient pas accès à la plage de données mais juste aux statistiques qu'ils désirent analyser
    0
  3. Heliotte Messages postés 1561 Statut Membre 92
     
    Bonsoir Fedaykin7,

    Scénario:
    - Les données (dates et autres) se trouve sur l'onglet "FeuilleCachee" qui est .. cachée,
    - L'utilisateur ouvre le fichier Excel, sur l'onglet "Feuil2",
    - A l'activation de cette feuille, un formulaire s'ouvre,
    - Sur ce formulaire se trouve une ListBox qui reprend toutes les dates se trouvant sur la feuille cachée.
    - L'utilisateur choisi la date, clique sur le bouton "ok" et la suite comme vous l'entendez.

    Ceci en VBA (Visual Basic pour Application).
    Qu'en pensez-vous?
    0
  4. Fedaykin7 Messages postés 4 Date d'inscription   Statut Membre Dernière intervention  
     
    Bonjour
    Cette solution me parait moins ergonomique mais surtout j'aimerais comprendre ce qui cloche dans mon code sinon je ne progresserai pas :)
    Merci pour le temps que vous prenez à me répondre
    Cordialement
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Heliotte Messages postés 1561 Statut Membre 92
     
    Bonjour Fedaykin7,

    Comme je n'ai pas le fichier ..
    Les dates dans le fichier, sont-elles considérées comme Date ou comme String ?

    Car dans ce code : DateDebut = InputBox("Quelle date de début de calcul des statistiques désirez-vous?") , la valeur retournée par Input est de type String !
    0
  7. Fedaykin7 Messages postés 4 Date d'inscription   Statut Membre Dernière intervention  
     
    Les dates sont considérées en Date
    Finalement j'ai trouvé comment faire, c'est un peu tarabiscoté mais ça fonctionne :

    D'abord je crée 2 mini macro qui vont tester chacune la présence de la valeur inférieure et supérieure dans la plage de données
    Sub ValeurInferieure()
    CptLigne = 4
        SJour = Worksheets("Annuel").Cells(CptLigne, 1).Value
    
        Do Until CptLigne = CptLignePleine
            'ValInf2 est définie comme égale à 0 dans la macro principale, elle change de valeur si la valeur inférieure de la fourchette existe dans la plage de données
            If ValInf = SJour Then ValInf2 = ValInf
            CptLigne = CptLigne + 1
            SJour = Worksheets("Annuel").Cells(CptLigne, 1).Value
            
        Loop
        
    End Sub

    Sub ValeurSuperieure()
    CptLigne = 4
        SJour = Worksheets("Annuel").Cells(CptLigne, 1).Value
    
        Do Until CptLigne = CptLignePleine
            'ValSup2 est définie comme égale à 0 dans la macro principale, elle change de valeur si la valeur supérieure de la fourchette existe dans la plage de données
            If ValSup = SJour Then ValSup2 = ValSup
            CptLigne = CptLigne + 1
            SJour = Worksheets("Annuel").Cells(CptLigne, 1).Value
            
        Loop
        
    End Sub


    Ensuite la macro complète qui va tester la présence de la date désirée dans la plage de données. Si la date désirée est présente, la macro continue son exécution normale, si elle est absente j'aurai tout ce qu'il faut en variables pour lancer mes deux minimacro pour qu'elle trouve une fourchette de dates qui existent dans la plage de données

    La macro principale :

    Sub Debut()
        ValInf2 = 0
        ValSup2 = 0
    'trouve la première ligne vide
        CptLigne = 4
        SJour = Worksheets("Annuel").Cells(CptLigne, 1).Value
    
        Do Until SJour = ""
            CptLigne = CptLigne + 1
            SJour = Worksheets("Annuel").Cells(CptLigne, 1).Value
        Loop
            CptligneVide = CptLigne
            CptLignePleine = CptLigne - 1
            
            'CptLignePleine est donc la dernière ligne pleine
            Adresse = "A" & CptLignePleine
            Set Plage = Range("A4:" & Adresse)
    
    'Enoncé de la fourchette de dates disponibles et récupération de la date de début de calcul des stats
    TexteAfficher1 = "Les stats peuvent être calculées à partir du 05/12/2011 jusqu'au " & Worksheets("Annuel").Cells(CptLignePleine, 1).Value & "." & vbCr & "Quelle date de début de calcul des statistiques désirez-vous?"
    DateDebut = InputBox(TexteAfficher1)
    'teste si la valeur de DateDebut dans la plage des dates
    For Each e In [Plage]
         If e Like DateDebut Then
           e.Select
          'si oui ça lance la macro qui demande la date de fin de calcul des stats
           Excel.Run ("Fin")
           'si non délimite une fourchette de date encadrant la date désirée
           Else
           ValSup = DateDebut + 1
           ValInf = DateDebut - 1
           End If
           
        Next
        'teste si la fourchette inférieure existe dans la plage de données
          Excel.Run ("ValeurInferieure")
          'si elle existe pas on élargit la fourchette et on reteste sa présence dans la plage de données (et ce 5 fois car jamais 5 jours d'affilé sans stats)
           If ValInf2 = 0 Then ValInf = ValInf - 1
           Excel.Run ("ValeurInferieure")
           If ValInf2 = 0 Then ValInf = ValInf - 1
           Excel.Run ("ValeurInferieure")
           If ValInf2 = 0 Then ValInf = ValInf - 1
           Excel.Run ("ValeurInferieure")
           If ValInf2 = 0 Then ValInf = ValInf - 1
           Excel.Run ("ValeurInferieure")
           
           'teste si la fourchette inférieure existe dans la plage de données
           Excel.Run ("ValeurSuperieure")
           'si elle existe pas on élargit la fourchette et on reteste sa présence dans la plage de données (et ce 5 fois car jamais 5 jours d'affilé sans stats)
           If ValSup2 = 0 Then ValSup = ValSup + 1
           Excel.Run ("ValeurSuperieure")
           If ValSup2 = 0 Then ValSup = ValSup + 1
           Excel.Run ("ValeurSuperieure")
           If ValSup2 = 0 Then ValSup = ValSup + 1
           Excel.Run ("ValeurSuperieure")
           If ValSup2 = 0 Then ValSup = ValSup + 1
           Excel.Run ("ValeurSuperieure")
           
        TexteAfficher2 = "Veuillez choisir une autre date de début" & vbCr & "Les dates les plus proches de la date désirées sont " & ValInf2 & "et " & ValSup2 & "."
        DateDebut = InputBox(TexteAfficher2)
           
                                   
        
           End Sub


    Après il reste plein de petites choses à régler, mais ça, ça marche
    Merci
    0