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 :

Macro VBA et mauvaises années


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
    Technicien Help Desk
    Inscrit en
    Mars 2020
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Mars 2020
    Messages : 36
    Par défaut Macro VBA et mauvaises années
    Bonjour à tous,

    Dans une feuille de calcul sous Excel 2021, j'ai créé 5 tableaux l'un en dessous de l'autre, qui comportent chacun une colonne "Semaine du ... au ... 20.." avec les jours correspondants du lundi au dimanche (par ex lundi 02 janv mardi 03 janv mercredi 04 janv etc).

    J'ai créé 2 boites déroulantes, l'une pour sélectionner l'année (cellule A4), l'autre une "plage" de mois (cellule A2).

    J'ai créé un macro VBA avec lequel je rencontre le problème suivant : quel que soit l'année que je sélectionne, prenons par exemple l'année 2023, ma colonne "Semaine du ... au ... 20.." devient "Semaine du ... au ... 2001" et se met par conséquent à afficher les jours de l'année 2001 au lieu de l'année 2023.

    Idem pour les années qui suivent, je me retrouve à chaque fois avec une année de 12 ans d'ancienneté (2024 devient 2002, 2025 devient 2003, etc).

    Le problème semble venir de cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    year = ws.Range("A2").Value
    en la remplaçant par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    year = ws.Range("A2").Value +22
    cela corrige partiellement le problème car, par exemple, pour la semaine 5 de la plage Avril/Mai, ma colonne devient "Semaine du 29 avril au 5 mai 2024" alors que j'ai sélectionné l'année 2023.

    J'ai tenté de remplacer la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    year = ws.Range("A2").Value
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    year = 2000 + ws.Range("A2").Value
    Et essayer de convertir explicitement le contenu de ma cellule "A2" en entier avec les fonctions "Int" et "CInt" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    year = Int(ws.Range("A2").Value)
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    year = CInt(ws.Range("A2").Value)
    Mais je me résous toujours au même problème

    Voici d'autres trucs que j'ai aussi tenté, comme stocker la valeur comme une date, plutôt que dans une variable entière "year" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim year As Date
    year = CDate(2000 + ws.Range("A2").Value)
    Dim startYear As Date
    startYear = DateSerial(Year(year), 1, 1)
    ================================

    Je vous partage mon fichier Excel ici => et l'intégralité de mon macro VBA :

    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
    Sub ShowAllWeeks()
     
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Feuil1")
     
    Dim year As Integer
    year = ws.Range("A2").Value
     
    Dim month As Integer
    month = ws.Range("A4").Value
     
    Dim startDate As Date
    startDate = DateSerial(year, month, 1)
     
    Dim endDate As Date
    endDate = DateSerial(year, month + 1, 0)
     
    Dim currentWeek As Integer
    currentWeek = 1
     
    Dim row As Integer
    row = 12
     
    Do Until startDate > endDate
     
    ' Find the first Monday of the week
    If Weekday(startDate) = 1 Then
    startDate = startDate + 1
    ElseIf Weekday(startDate) = 7 Then
    startDate = startDate + 2
    Else
    startDate = startDate - Weekday(startDate) + 2
    End If
     
    ws.Range("A" & row).Value = "SEMAINE " & vbNewLine & " DU " & UCase(Format(startDate, "dd mmmm yyyy")) & vbNewLine & " AU " & UCase(Format(startDate + 6, "dd mmmm yyyy"))
     
    ' Check if the cell is merged
    If ws.Range("A" & row).MergeCells Then
    row = row + ws.Range("A" & row).MergeArea.Rows.Count - 1
    End If
     
    ws.Range("A" & row + 1).Value = UCase(Format(startDate, "dddd dd mmm."))
    ws.Range("A" & row + 2).Value = UCase(Format(startDate + 1, "dddd dd mmm"))
    ws.Range("A" & row + 3).Value = UCase(Format(startDate + 2, "dddd dd mmm"))
    ws.Range("A" & row + 4).Value = UCase(Format(startDate + 3, "dddd dd mmm"))
    ws.Range("A" & row + 5).Value = UCase(Format(startDate + 4, "dddd dd mmm"))
    ws.Range("A" & row + 6).Value = UCase(Format(startDate + 5, "dddd dd mmm"))
    ws.Range("A" & row + 7).Value = UCase(Format(startDate + 6, "dddd dd mmm"))
     
    row = row + 8
    currentWeek = currentWeek + 1
    startDate = startDate + 7
     
    Loop
     
    End Sub
    Merci d'avance pour vos retours éclairés

  2. #2
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 588
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 588
    Par défaut
    Bonjour,
    Je ne sais pas ce qu'il y a dans A2!

    Je t'invites à utiliser des variable qui ne sont pas des noms réservés Year,Month,Day sont de mots réservés VBA !

    Year=Year(date) ' ça donne quoi?

  3. #3
    Membre averti
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Mars 2020
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Mars 2020
    Messages : 36
    Par défaut
    Citation Envoyé par Thumb down Voir le message
    Bonjour,
    Je ne sais pas ce qu'il y a dans A2!

    Je t'invites à utiliser des variable qui ne sont pas des noms réservés Year,Month,Day sont de mots réservés VBA !

    Year=Year(date) ' ça donne quoi?
    Ça donne "Erreur de compilation: Tableau attendu". Dans A2, il y a la valeur de l'année sélectionnée. Par exemple 1 pour l'année 2023.

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 183
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    La fonction native d'excel nommée DATE, permet de reconstruire une date en fonction des trois paramètres (Année, Mois, Jour) donc je ne vois pas trop quel est le problème et pourquoi passer par un code VBA pour construire une phrase qui peut également être faite avec les fonctions native d'excel..

    Y a t'il un impératif à passer par VBA ?

    [EDIT]

    Petit exemple avec illustration plus bas

    Dans la feuille nommée [Parameter], il y a deux tableaux structurés.
    L'un nommé t_Year contient des années à l'aide le la formule =ANNEE(AUJOURDHUI())-(LIGNE()-@LIGNE(t_Year)) et l'autre nommée t_Month contient 12 dates (du 1er janvier au 1er décembre d'une année quelconque) avec un format personnalisé "mmm"

    Dans la feuille nommée [Exemple 1]
    La cellule B2 fait référence à la plage de données de la table t_Year et la cellule B3 (au format "mmm") fait référence à la plage des données de la table t_Month.
    On peut voir en cellule
    B4, le 1er jour du mois de l'année et du mois sélectionné en B2 et B3
    B5, le lundi qui précède ce qui permet de construire la phrase se trouvant en cellule A8

    Les formules des cellules B4, B5 et A8 sont affichées à droite de celles-ci.

    Ce n'est bien entendu qu'un exemple, toutes autres combinaisons sont évidemment possibles

    Nom : 230211 dvp Date Dynamique.png
Affichages : 73
Taille : 36,5 Ko
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Par défaut
    Salut,

    Si au lieux de manipuler des entiers, tu manipulais des dates ?
    VBA offre toute une plétore de fonctionnalités et type de données pour cela:
    - Year()
    - Month()
    - Day()
    - DateSerial()
    - DateAdd()
    - ect ...

  6. #6
    Membre averti
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Mars 2020
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Mars 2020
    Messages : 36
    Par défaut
    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour,
    La fonction native d'excel nommée DATE, permet de reconstruire une date en fonction des trois paramètres (Année, Mois, Jour) donc je ne vois pas trop quel est le problème et pourquoi passer par un code VBA pour construire une phrase qui peut également être faite avec les fonctions native d'excel..

    Y a t'il un impératif à passer par VBA ?

    [EDIT]

    Petit exemple avec illustration plus bas

    Dans la feuille nommée [Parameter], il y a deux tableaux structurés.
    L'un nommé t_Year contient des années à l'aide le la formule =ANNEE(AUJOURDHUI())-(LIGNE()-@LIGNE(t_Year)) et l'autre nommée t_Month contient 12 dates (du 1er janvier au 1er décembre d'une année quelconque) avec un format personnalisé "mmm"

    Dans la feuille nommée [Exemple 1]
    La cellule B2 fait référence à la plage de données de la table t_Year et la cellule B3 (au format "mmm") fait référence à la plage des données de la table t_Month.
    On peut voir en cellule
    B4, le 1er jour du mois de l'année et du mois sélectionné en B2 et B3
    B5, le lundi qui précède ce qui permet de construire la phrase se trouvant en cellule A8

    Les formules des cellules B4, B5 et A8 sont affichées à droite de celles-ci.

    Ce n'est bien entendu qu'un exemple, toutes autres combinaisons sont évidemment possibles

    Nom : 230211 dvp Date Dynamique.png
Affichages : 73
Taille : 36,5 Ko
    Avec cet exemple, étant donné que j'affiche 5 semaines à la fois, comment gérer le cas particulier pour éviter qu'un mois commence par la même semaine que la dernière semaine du mois qui le précède ?

  7. #7
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 183
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Avec cet exemple, étant donné que j'affiche 5 semaines à la fois, comment gérer le cas particulier pour éviter qu'un mois commence par la même semaine que la dernière semaine du mois qui le précède ?
    Etant donné que les dates sont des nombres, il suffit d'additionner le premier jour de la semaine 1 avec le chiffre 7 pour obtenir le 1er jour de la semaine 2 et ainsi de suite pour les autres semaines.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme d'enregistrement sur Macro/VBA de Excel
    Par life is magic dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 28/11/2005, 18h23
  2. Connaître la taille d'un module avec une macro VBA ou autre
    Par beegees dans le forum Général VBA
    Réponses: 15
    Dernier message: 22/11/2005, 10h47
  3. probleme de selection aleatoire sur excel avec macro vba
    Par guillaume sors dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 21/10/2005, 11h51
  4. Macro VBA sur Access
    Par beurnoir dans le forum Access
    Réponses: 3
    Dernier message: 12/10/2005, 17h46
  5. [SQL][MACRO VBA]Pb de syntaxe
    Par Stef.proxi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 11/08/2004, 10h11

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