IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Incrémentation d'une date à partir d'un calendrier


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2012
    Messages : 23
    Par défaut Incrémentation d'une date à partir d'un calendrier
    Bonjour le forum,

    Après avoir consulter les nombreux posts traitant sur ce sujet, je n'ai pas trouvé de quoi répondre à ma problématique

    Je m'explique:

    Je souhaite incrémenter une date se trouvant dans une cellule par l'intermédiaire d'une autre cellule contenant simplement un nombre. La date issue de cette "somme" sera inscrite dans une autre cellule.

    Mais cette incrémentation doit tenir compte des week ends et jours fériés. Autrement dit uniquement les jours ouvrables (donc d'un calendrier ?)

    Par exemple:

    Aujourd hui nous sommes le Mercredi 27 juin. Je souhaite incrémenter cette date de 3 jours. La simple somme des 2 cellules va me projeter au Samedi 30 juin. Or, je souhaite que le résultat affiché dans la cellule soit le Lundi 2 juillet.


    Ce que je souhaite voir apparaitre sur ma page excel:
    Cellule "A1" Cellule"A2" Cellule"A3"
    27-06-2012 3 02-07-2012


    Je possède déjà dans mon programme un calendrier me servant à simplement sélectionner une date qui reste fixée sur une feuille.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    Dim mois_courant
    Dim témoin, Début, Fin
     
    Private Sub UserForm_Initialize()
      Dim décal
      If ActiveCell = "" Then
        mois_courant = Date
      Else
        mois_courant = ActiveCell
      End If
      affiche_calendrier (mois_courant)
      décal = Weekday(DateSerial(Year(mois_courant), Month(mois_courant), 1), vbMonday) - 1
    End Sub
    Sub affiche_calendrier(dt)
      Dim premier_jour_mois, premier_jour_mois_suiv, décal, nb_jours, I
      premier_jour_mois = DateSerial(Year(dt), Month(dt), 1)
      premier_jour_mois_suiv = DateAdd("m", 1, premier_jour_mois)
      nb_jours = premier_jour_mois_suiv - premier_jour_mois + 1
      décal = Weekday(premier_jour_mois, vbMonday) - 1
      I = 1
      Do While I < nb_jours
         Me("texte" & I + décal).Caption = I
         If EstFérié(DateSerial(Year(dt), Month(dt), I)) = True Then Me("texte" & I + décal).BackColor = vbGreen
         sem = NoSemaine(DateSerial(Year(dt), Month(dt), I))
         K = (I + décal - 1) \ 7 + 1
         Me("Label" & K) = " " & sem
         I = I + 1
      Loop
      Me("texte" & Day(dt) + décal).BackColor = 255
      Me.Caption = Format(dt, "mmmm yy")
      'Me DateSerial(Year(dt), Month(dt), Day(dt))
    End Sub
    Private Sub raz_tot()
      Dim I
      For I = 1 To 37
        Me("texte" & I).BackColor = vbWhite
        Me("texte" & I).Caption = ""
     Next I
     For I = 1 To 35 Step 7
       Me("texte" & I + 5).BackColor = vbGreen
       Me("texte" & I + 6).BackColor = vbGreen
     Next I
     For K = 1 To 6: Me("label" & K) = "": Next K
    End Sub
    Private Sub raz()
       Dim I
       For I = 1 To 37
         If Me("texte" & I).BackColor = 65535 Then
           Me("texte" & I).BackColor = vbWhite
         End If
       Next I
       For I = 1 To 35 Step 7
       Me("texte" & I + 5).BackColor = vbGreen
       Me("texte" & I + 6).BackColor = vbGreen
     Next I
     For K = 1 To 6: Me("label" & K) = "": Next K
    End Sub
    Private Sub moins_Click()
      mois_courant = DateAdd("m", -1, mois_courant)
      raz_tot
      'Me.Date_début = mois_courant
      témoin = 0
      affiche_calendrier (mois_courant)
    End Sub
    Private Sub plus_Click()
      mois_courant = DateAdd("m", 1, mois_courant)
      raz_tot
      affiche_calendrier (mois_courant)
    End Sub
    Function pression(no_cellule)
     Dim K, décal
     décal = Weekday(DateSerial(Year(mois_courant), Month(mois_courant), 1), vbMonday) - 1
     raz_tot
     affiche_calendrier (mois_courant)
     Me("texte" & no_cellule).BackColor = 65535
     Début = no_cellule
     'Me.Date_début = DateSerial(Year(mois_courant), Month(mois_courant), Début - décal)
     ActiveCell.Value = DateSerial(Year(mois_courant), Month(mois_courant), Début - décal)
     Unload Me
    End Function
    Private Sub texte1_Click()
     pression (1)
    End Sub
    Private Sub texte2_Click()
     pression (2)
    End Sub
    Private Sub texte3_Click()
     pression (3)
    End Sub
    Private Sub texte4_Click()
     pression (4)
    End Sub
    Private Sub texte5_Click()
     pression (5)
    End Sub
    Private Sub texte6_Click()
     pression (6)
    End Sub
    Private Sub texte7_Click()
     pression (7)
    End Sub
    Private Sub texte8_Click()
     pression (8)
    End Sub
    Private Sub texte9_Click()
     pression (9)
    End Sub
    Private Sub texte10_Click()
     pression (10)
    End Sub
    Private Sub texte11_Click()
     pression (11)
    End Sub
    Private Sub texte12_Click()
     pression (12)
    End Sub
    Private Sub texte13_Click()
     pression (13)
    End Sub
    Private Sub texte14_Click()
     pression (14)
    End Sub
    Private Sub texte15_Click()
     pression (15)
    End Sub
    Private Sub texte16_Click()
     pression (16)
    End Sub
    Private Sub texte17_Click()
     pression (17)
    End Sub
    Private Sub texte18_Click()
     pression (18)
    End Sub
    Private Sub texte19_Click()
     pression (19)
    End Sub
    Private Sub texte20_Click()
     pression (20)
    End Sub
    Private Sub texte21_Click()
     pression (21)
    End Sub
    Private Sub texte22_Click()
     pression (22)
    End Sub
    Private Sub texte23_Click()
     pression (23)
    End Sub
    Private Sub texte24_Click()
     pression (24)
    End Sub
    Private Sub texte25_Click()
     pression (25)
    End Sub
    Private Sub texte26_Click()
     pression (26)
    End Sub
    Private Sub texte27_Click()
     pression (27)
    End Sub
    Private Sub texte28_Click()
     pression (28)
    End Sub
    Private Sub texte29_Click()
     pression (29)
    End Sub
    Private Sub texte30_Click()
     pression (30)
    End Sub
    Private Sub texte31_Click()
     pression (31)
    End Sub
    Private Sub texte32_Click()
     pression (32)
    End Sub
    Private Sub texte33_Click()
     pression (33)
    End Sub
    Private Sub texte34_Click()
     pression (34)
    End Sub
    Private Sub texte35_Click()
     pression (35)
    End Sub
    Private Sub texte36_Click()
     pression (36)
    End Sub
    Private Sub texte37_Click()
     pression (37)
    End Sub
    Function EstFérié(dt)
    Static j(11), m(11), témoinjf, pâques, I
    j(1) = 1: m(1) = 1
    j(2) = 1: m(2) = 5
    j(3) = 8: m(3) = 5
    j(4) = 14: m(4) = 7
    j(5) = 15: m(5) = 8
    j(6) = 1: m(6) = 11
    j(7) = 11: m(7) = 11
    j(8) = 25: m(8) = 12
    pâques = Round(DateSerial(Year(dt), 4, (234 - 11 * (Year(dt) Mod 19)) Mod 30) / 7, 0) * 7 - 6
    j(9) = Day(pâques + 1): m(9) = Month(pâques + 1)
    j(10) = Day(pâques + 39): m(10) = Month(pâques + 39)
    j(11) = Day(pâques + 50): m(11) = Month(pâques + 50)
    témoinjf = False
    For I = 1 To 11
      If Day(dt) = j(I) And Month(dt) = m(I) Then
        témoinjf = True
      End If
    Next
    EstFérié = témoinjf
    End Function
    Function NoSemaine(MyDate As Date) As Integer
      NoSemaine = Format(MyDate, "ww", vbMonday, vbFirstFourDays)
      If NoSemaine > 52 Then
        If Format(MyDate + 7, "ww", vbMonday, vbFirstFourDays) = 2 Then NoSemaine = 1
      End If
    End Function
    Est-il possible de repartir de ce calendrier pour effectuer ce que je souhaite faire ou faut-il partir sur une autre programmation ?

    Merci d'avance pour vos réponses

  2. #2
    Expert confirmé
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Par défaut
    Salut, à voir ici

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2012
    Messages : 23
    Par défaut
    Salut, merci bien

    Je viens de faire la procédure expliquée dans le post (ajouter l'utilitaire d'analyse, activer atpvbaen.xls) et insérer le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub JoursOuvresAjouterVBA()
    Dim LaDate As Double, NewDate As Date
        LaDate = CDbl(CDate("16/03/2007"))
        'ou
        LaDate = CDbl(Cells(2, 1))
        'ou
        LaDate = CDbl(Date)
        NewDate = Format(Workday(LaDate, 3), "dd/mm/yyyy")
        MsgBox NewDate
    End Sub
    Mais deja, ou insérer ce code ? Dans le worksheet concerné ?

    Le compilateur ne reconnait pas "Workday". Je suppose qu'il devrait lereconnaitre avec l'installation du module complémentaire non ?

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2012
    Messages : 23
    Par défaut
    Bonjour à tous,

    J'ai continué à creuser le sujet et j'ai decouvert la fonction chronologique d'excel.
    La fonction se situe dans home/editing/fill/series puis on selectionne les critères que l'on souhaite. Dans mon cas: chronologique et jours ouvrés

    Utiliser simplement cette fonction qui incrémente la date en sautant les week end me conviendrait deja tres bien (tant pis pour les jours fériés)

    Sauf que je suis bloqué pour la programmation

    Après avoir fait une macro utilisant la fonction et après l'avoir retravaillée,

    j'obtiens le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With WshC
    .Range("AL2:AM2").DataSeries Rowcol:=xlRows, Type:=xlChronological, Date:=xlWeekday, Step:=.Range("AK2"), Trend:=False 
    End With
    Ce code fonctionne. La date cible se trouve dans la cellule "AL2" et la destination se trouve en "AM2" sachant que la valeur de l'incrément se trouve en "AK2".

    Ce qui donne sur ma feuille:

    "AK2"------"AL2"--------"AM2"
    --5-----13-06-2012---22-06-2012

    Excel tiens bien compte du week end et m'incrémente bien la date de 7 jours et non simplement de 5.

    Maintenant je souhaite effectuer cette opération pour les colonnes entières.

    Voici le code que j'essaye d'utiliser:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With WshC
    .Range("AL2:AM" & WshC.Range("AM" & Rows.Count).End(xlUp).Row).DataSeries Rowcol:=xlRows, Type:=xlChronological, Date:=xlWeekday, Step:=.Range("AK2:AK" & WshC.Range("AK" & Rows.Count).End(xlUp).Row), Trend:=False
    End With
    Celui-ci ne fonctionne pas. Pourtant, Excel ne m'affiche aucune erreur de compilation, le code est lu mais sans aucune incidence sur ma feuille.

    J'ai essayé plusieurs combinaisons differentes mais rien ne fonctionne.
    Je sents que j'y suis presque

    Si quelqu'un peut m'apporter un peu d'aide...

    Merci bien !

Discussions similaires

  1. insertion d'une date dans une cellule à partir d'un calendrier
    Par Bouom771 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 08/12/2007, 23h45
  2. Réponses: 6
    Dernier message: 25/09/2006, 14h51
  3. trouver une date à partir d'un nombre de jours
    Par charlene44 dans le forum Delphi
    Réponses: 4
    Dernier message: 21/08/2006, 14h27
  4. [VB6]récupération d'une date à partir d'une calendrier
    Par fahmichebaane dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 03/04/2006, 16h40
  5. [ORACLE 10G]Incrémentation d'une date d'un jour
    Par titanblanc dans le forum Oracle
    Réponses: 2
    Dernier message: 05/01/2006, 11h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo