Determiner la date la plus proche de la fin de l'annee

tonton33650 Messages postés 23 Date d'inscription vendredi 11 mai 2007 Statut Membre Dernière intervention 3 décembre 2008 - 12 juin 2007 à 11:43
tonton33650 Messages postés 23 Date d'inscription vendredi 11 mai 2007 Statut Membre Dernière intervention 3 décembre 2008 - 12 juin 2007 à 17:08
Bonjour a tous,

J'ai un petit (ou plutot gros) souci avec la manipulation des dates avec VBA.
Dans une feuille, j'ai dans une colonne une serie de dates, correspondant a des dates d'amortissement d'un actif. Suivant le profil d'amortissement de ma valeur, je peux donc me trouver avec 12, 4 ou 2 dates pour une meme annee. Ce que je cherche a faire, c'est renvoyer dans une autre feuille la valeur de mon actif a la fin de chaque annee ou du moins a la date la plus proche de la fin de chaque annee. Ainsi, si pour l'annee 2007, mes dates sont le 16/02/2007, 16/05/2007, 16/08/2007, 16/11/2007, je souhaiterais donc trouver la valeur de mon actif au 16/11/2007 et faire une boucle sur toutes les annees d'amortissement. Mais apres m'etre casse la tete sur les fonctions relatives a la manipulation des dates, je ne parviens pas du tout a determiner les dates dont j'ai besoin.

Je ne vous demande certainement pas de me taper le code, mais simplement de m'aiguiller un peu.
Quelqu'un aurait-il une idee de la methode a employer, ou vers quel chemin il faut que je me dirige?

Merci pour votre aide

7 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
12 juin 2007 à 11:54
Max de ta date avec test sur l'annee en cours

SELECT Max(MaDate) FROM MaTable WHERE Year(MaDate) = 2007

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
tonton33650 Messages postés 23 Date d'inscription vendredi 11 mai 2007 Statut Membre Dernière intervention 3 décembre 2008
12 juin 2007 à 12:28
Merci Renfield

J'aurai besoin d'une petite precision suite a ce que tu m'a donne. Si je defini la plage dans laquelle se trouve mes valeurs et que je lui demande pour chaque Year dans cette table de me selectionner Max(Madate), est ce que je m'approche de ce que tu me proposes ou je suis enocre loin?

code:

Sub max_date()


Dim LastDate As Date
Dim Amort_Schedule As Range




Set Amort_Schedule = Range(Sheet2.Cells(6, 2), Sheet2.Cells(122, 2))


For Each Year(LastDate) In Amort_Schedule
   
    Max(LastDate).Select

........

End Sub

Je n'arrive pas trop a voir comment lui traduire WHERE dans ce que tu m'as propose?

Merci pour ta reponse et ton aide
0
jrivet Messages postés 7393 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
12 juin 2007 à 12:47
Salut,
Je ne suis pas sur d'avoir tout saisi mais regarde ceci

Function max_date() As Date

Dim LastDate As Date
Dim Amort_Schedule As Range
Dim Ra As Range

   Set Amort_Schedule = Range(Sheet2.Cells(6, 2), Sheet2.Cells(122, 2))
   For Each Ra In Amort_Schedule
       If Year(CDate(Ra.Value)) = 2007 And CDate(Ra.Value) > LastDate Then
           LastDate = CDate(Ra.Value)
       End If
   Next
   max_date = LastDate

End Function<hr />, ----
[code.aspx?ID=41455 By Renfield]

@+: Ju£i?n
Pensez: Réponse acceptée
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
12 juin 2007 à 12:50
pardon ^^

j'ai cru que tu etais en SQL...

en gros, il te faut :

Dim MaxDate As Date
Dim MaxCellule As Range
MaxDate = #01/01/2007#

tu parcoure chaque cellule
si Year(TaCellule) = 2007 And TaCellule > DateMax Then
    DateMax = TaCellule
    Set MaxCellule = TaCellule

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0

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

Posez votre question
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
12 juin 2007 à 12:52
pris de vitesse, et en couleur, que dire de plus ?? ^^

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
tonton33650 Messages postés 23 Date d'inscription vendredi 11 mai 2007 Statut Membre Dernière intervention 3 décembre 2008
12 juin 2007 à 16:02
merci pour vos reponses, c'est excatement ce qu'il ma fallait.
J'ai cependant encore une question sur le Year proposé dans vos exemples. Je ne sais pas si j'ai ete super clair lorsque j'ai decris ce que je voulais faire, mais ce que je voulais dire c'est qu'il me faut trouver la derniere date de chaque annee. De votre code j'ai essayé de faire une boucle sur les differentes valeurs que vont pouvoir prendre mes annees (chqaue actif qyqnt une maturite plus ou moins longue, le nombre d'annees sera differents d'un actif a l'autre) Bref, je voudrais juste savoir comment operer cette boucle,
Voici ce que j'ai fait mes je dois dire que mes debuts en VBA ne sont pas tres convaincants!!

code:

Function max_date() As Date


Dim LastDate As Date
Dim Amort_Schedule As Range
Dim Ra As Range
Dim All_years As Collection
Dim Nb_Annee As Variant


Set Amort_Schedule = Range(Sheet2.Cells(6, 2), Sheet2.Cells(122, 2))
  
For i = 6 To 122


Nb_Annee = Year(CDate(Cells(i, 2).Value))


Set All_years = All_years.Nb_Annee.Add


Next i
   
For Each Nb_Annee In All_years


    For Each Ra In Amort_Schedule
   
            If Year(CDate(Ra.Value)) = 2008 And CDate(Ra.Value) > LastDate Then
                LastDate = CDate(Ra.Value)
            End If
           
    Next
   
    max_date = LastDate


Next


End Function

Au cas ou mon code soit vraiment n'importe quoi, je prefere vous donnez mes intentions qui etaient de stocker dans une collection les differentes valeurs possibles de mes annees pour ensuite les reutiliser dans :

For each (valeur de Year) dans (nouvelle collection)

et placer ensuite le code que vous m'avez donne.

Suis-je loin du compte??

Merci pour votre aide
0
tonton33650 Messages postés 23 Date d'inscription vendredi 11 mai 2007 Statut Membre Dernière intervention 3 décembre 2008
12 juin 2007 à 17:08
Bon apres de nouvelles reflexions voici ce que j'ai trouve pour faire ma boucle sur les annees.


Code:


Function max_date() As Date


Dim LastDate As Date
Dim Amort_Schedule As Range
Dim Ra, cells As Range
Dim All_years As New Collection




Set Amort_Schedule = Range(Sheet2.cells(6, 2), Sheet2.cells(122, 2))


    For Each cells In Amort_Schedule


        All_years.Add Year(CDate(cells.Value))
       
    Next


i = 1


For Each Item In All_years


    For Each Ra In Amort_Schedule
   
            If Year(CDate(Ra.Value)) = Item And CDate(Ra.Value) > LastDate Then
                LastDate = CDate(Ra.Value)
            End If
           
    Next
   
max_date = LastDate
   
Sheet2.cells(1, 1).Offset(i, 0).Value = max_date


i = i + 1
   
Next


End Function

La boucle se met bien en place MAIS ma collection All_years stocke les annees de chaque date en d'autres termes, lorsque j'ai 4 dates pour une meme annee elle me retient 4 fois cette annee. La methode .Add ne permet elle pas de stocker les valeurs mais de facon unique ???

Merci pour vos reponses
0