Proposer une valeur approchante après une recherche infructueuse

Fermé
Fedaykin7 Messages postés 4 Date d'inscription mercredi 2 janvier 2013 Statut Membre Dernière intervention 3 janvier 2013 - 2 janv. 2013 à 16:46
Fedaykin7 Messages postés 4 Date d'inscription mercredi 2 janvier 2013 Statut Membre Dernière intervention 3 janvier 2013 - 3 janv. 2013 à 16:03
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

A voir également:

6 réponses

Heliotte Messages postés 1491 Date d'inscription vendredi 26 octobre 2012 Statut Membre Dernière intervention 28 janvier 2013 92
2 janv. 2013 à 16:55
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
Fedaykin7 Messages postés 4 Date d'inscription mercredi 2 janvier 2013 Statut Membre Dernière intervention 3 janvier 2013
2 janv. 2013 à 17:09
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
Heliotte Messages postés 1491 Date d'inscription vendredi 26 octobre 2012 Statut Membre Dernière intervention 28 janvier 2013 92
2 janv. 2013 à 20:19
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
Fedaykin7 Messages postés 4 Date d'inscription mercredi 2 janvier 2013 Statut Membre Dernière intervention 3 janvier 2013
3 janv. 2013 à 06:55
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

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

Posez votre question
Heliotte Messages postés 1491 Date d'inscription vendredi 26 octobre 2012 Statut Membre Dernière intervention 28 janvier 2013 92
3 janv. 2013 à 12:38
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
Fedaykin7 Messages postés 4 Date d'inscription mercredi 2 janvier 2013 Statut Membre Dernière intervention 3 janvier 2013
3 janv. 2013 à 16:03
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