Souhaiter anniversaire (Excel 2003)

Résolu
jean300 Messages postés 382 Statut Membre -  
via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
Je souhaiterai souhaiter les anniversaires qui auront peut-être lieu durant la semaine qui suit leur détection.
Le fichier contient plus ou moins de 300 noms.

Exemple : Semaine détection du 20/08 au 26/08 : (toujours du dimanche au samedi)
Déterminer qui aura son anniversaire dans la semaine suivante.
Soit : Semaine du 27/08 au 02/09 (toujours du dimanche au samedi)
Les semaines se décalant pour suivre le calendrier.

Afficher une Msgbox :
Je souhaite un bon anniversaire à :
Le Nom
Le prénom
La Date de naissance
Indiquant l'âge
Éventuellement :
Aucun anniversaire.

Je souhaiterai de préférence si c'est réalisable une solution par Vba.
En vous remerciant.
ps : je suis débutant en vba

https://www.cjoint.com/c/GHxmFg0Ct1U

6 réponses

  1. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    Bonjour Jean

    Ton fichier avec une macro qui se déclenche à l'ouverture du classeur
    https://mon-partage.fr/f/lIZxINID/

    Cdlmnt
    Via

    "L'imagination est plus importante que le savoir."    A. Einstein
    0
    1. Utilisateur anonyme
       
      Bonjour,
      Pourriez vous publier une version de votre tableau en XLS ?
      Merci d'avance,
      Cordialement,
      Alain
      0
      1. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759 > Utilisateur anonyme
         
        Bonjour Alain,

        Voilà : https://mon-partage.fr/f/QTt64fXd/

        Cdlmnt
        Via
        0
      2. Utilisateur anonyme > via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention  
         
        Merci bien !
        Cordialement,
        Alain
        0
    2. jean300 Messages postés 382 Statut Membre 14
       
      Re,
      Peux-tu commenter le code stp
      Merci
      0
  2. jean300 Messages postés 382 Statut Membre 14
     
    Bonjour via55
    Est-il possible d'afficher dans la Msgbox du plus âgé au plus jeune ?
    En te remerciant.
    0
  3. jean300 Messages postés 382 Statut Membre 14
     
    Re,
    Je te remercie via55, accepte-tu de commenter le code stp car je débute avec vba.
    Merci
    0
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    Re,

    Bien volontiers
    1) Dans ThisWorkbook ces lignes lance la macro anniv à l'ouverture du classeur :
    Private Sub Workbook_Open()
    anniv
    End Sub

    2) La macro commentée :
    Sub anniv()
    Dim Ligne As Long, tablo(10) As Variant, age(10) As Integer, tri(10) As Integer
    ' derniere ligne remplie 2eme colonne
    Ligne = Sheets("Liste").Columns(2).Find("*", , , , xlByColumns, xlPrevious).Row
    ' n° de la semaine actuelle
    cettesemaine = Val(Format(Date, "ww", vbMonday, vbFirstFourDays))
    'Boucle sur les lignes de la base
    For n = 1 To Ligne
    'n° de la semaine de la date de naissance
    semaine = Val(Format(Range("C" & n), "ww", vbMonday, vbFirstFourDays))
    ' si ce n° de semaine est celui de la semaine actuelle augmenté de 1
        If semaine = (cettesemaine + 1) Then
        'variable x incrémentée
        x = x + 1
        'variable tablo prend valeur n(donc n° de la ligne)
        tablo(x) = n
        'variable age prend la valeur de la différence années entre aujourd'hui et date de naissance
        age(x) = Year(Date) - Year(Range("C" & n))
        ' classement dans tablo par ordre décroissant
        ' boucle de x à 2 en revenant en arrière
            For t = x To 2 Step -1
            ' si variable age(t) est plus grande que sa précedente on inverse les valeurs des 2 variables de même que celles des 2 variables tablo
                If age(t) > age(t - 1) Then
                f = age(t - 1)
                g = tablo(t - 1)
                age(t - 1) = age(t)
                age(t) = f
                tablo(t - 1) = tablo(t)
                tablo(t) = g
                End If
            Next t
        End If
    Next n
    ' boucle sur toutes les valeurs du tablo
    For d = 1 To x
    ' on rajoute au message à afficher après saut de ligne ,les nom, prénom, date de naissance et âge
    mes = mes & Chr(10) & Range("A" & tablo(d)) & " " & Range("B" & tablo(d)) & " né(e) le  " & Range("C" & tablo(d)) & "  :  " & age(d) & " ans"
    Next d
    ' si message est vide alors le message sera Aucun anniversaire sinon ce sera BON anniversaire à suivi du message
    If mes = "" Then mes = "Aucun anniversaire" Else mes = "BON ANNIVERSAIRE à : " & Chr(10) & mes
    'affichage message
    MsgBox mes
    End Sub


    N’hésites pas à me redemander si il y a encore quelque chose d'obscur

    Cdlmnt
    Via
    0
    1. jean300 Messages postés 382 Statut Membre 14
       
      Bonjour via55,
      Désolé de t'ennuyer de nouveau, je souhaiterai une modification su tu me permet.
      A savoir que le code s'exécute lors de la demande d'impression du document et non lors de saisie en colonne S, T, ou U
      En te remerciant.
      0
      1. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759 > jean300 Messages postés 382 Statut Membre
         
        Bonjour jean

        Le code ne s’exécute pas lors de la saisie en colonne S T ou U (dans lesquelles il n'y a rien d'ailleurs) mais à l'ouverture du classeur
        Si tu veux qu'elle s'exécute avant impression dans ThisWorkbook tu remplaces

        Private Sub Workbook_Open()
        anniv
        End Sub

        par

        Private Sub Workbook_BeforePrint(Cancel As Boolean)
        anniv
        End Sub

        Cdlmnt
        Via
        0
  6. jean300 Messages postés 382 Statut Membre 14
     
    Tous mes remerciements via55 pour autant de gentillesse
    0