Macro calendrier de saisie

Résolu
Bonjour,
j ai trouvé une macro d'eric que je voudrais adapter si possible de sélectionner des plages au lieu de colonnes car iil me la faudrait sur plusieurs colonnes et lignes de la même page si quelqu'un pourrait la modifier pour cela
.............................................................................................................................................
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
' si la sélection sur la feuille change (target est la référence de la sélection)
If Target.Column <> 1 Or Target.Row < 9 Or Target.Cells.Count > 1 Then
'si la colonne <>3 (C) ou la ligne <2 ou la sélection fait plus d'1 cellule
Calendar1.Visible = False
'alors on cache le calendrier
Exit Sub
Else
'sinon
Calendar1.Top = Target.Offset(1, 0).Top + 2
' aligner le calendrier avec le haut de la cellule en dessous
Calendar1.Left = Target.Left + 10
' l'aligner à gauche de la cellule
'Calendar1.LinkedCell = Target.Address
' mettre la cellule liée au contrôle sur la cellule sélectionnée
If IsDate(Target.Value) Then
'si la cellule sélectionnée contient une date
Calendar1.Value = Target.Value
' la récupérer
Else
' sinon mettre la date du jour
Calendar1.Value = Date
End If
Calendar1.Visible = True
'afficher le calendrier
End If
End Sub

merci

7 réponses

  1. Contributeur
    Bonjour,

    pour 3 plages définies dans cette ligne :
    If Intersect(Target, Union([B6:C10], [F6:H10], [B15:B20]))...

    Private Sub Calendar1_Click() 
        ActiveCell = Calendar1 
    End Sub 
    
    Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    ' si la sélection sur la feuille change (target est la référence de la sélection) 
        If Intersect(Target, Union([B6:C10], [F6:H10], [B15:B20])) Is Nothing Or Target.Cells.Count > 1 Then 
            'alors on cache le calendrier 
            Calendar1.Visible = False 
            Exit Sub 
        Else 
            'sinon 
            Calendar1.Top = Target.Offset(1, 0).Top + 2 
            ' aligner le calendrier avec le haut de la cellule en dessous 
            Calendar1.Left = Target.Left + 1 
            ' l'aligner à gauche de la cellule 
            'Calendar1.LinkedCell = Target.Address 
            ' mettre la cellule liée au contrôle sur la cellule sélectionnée 
            If IsDate(Target.Value) Then 
                'si la cellule sélectionnée contient une date 
                Calendar1.Value = Target.Value 
                ' la récupérer 
            Else 
                ' sinon mettre la date du jour 
                Calendar1.Value = Date 
            End If 
            Calendar1.Visible = True 
            'afficher le calendrier 
        End If 
    End Sub


    Quand tu colles un code mets-le en entier pour qu'il soit fonctionnel pour les lecteurs suivants...

    Jette un oeil aussi à la très belle réalisation de mDF proposée par Le Pingou

    eric
    1. bonjour
      il faut faire clic droit + G pour entrer la date c'est plus court clic sur cellule et que le calendrier apparaisse j'ai déjà cet utilitaire il ne convient pas a mon projet
      toujours en attente d'autres solutions
      merci
      1. Contributeur
        Ben, si tu sais lire, j'ai mis la modification demandée dans mon post précédent...
        eric
    2. bonjour
      merci de ta réponse mais le code manquant je pensais qu'il est destiné au bouton appelant le calendrier ou je me trompe?
      merci
      a bientôt
      1. Contributeur
        Il y a le code qui manquait pour que ce soit fonctionnel, et le code Worksheet_SelectionChange modifié pour gérer une ou plusieurs plages suite à ta demande.
        eric
    3. bonjour
      la macro fonctionne pas il me dit
      erreur de compilation
      argument non facultatif
      et il met Union en bleue
      je travaille avec excel 2007 si cela peut varier
      merci
      1. Bonjour,
        Je viens de contrôler la procédure d'eriiic (salutations) qui fonctionne parfaitement.
        Contrôler que la ligne d'instruction soit identique à celle du message d'eriiic !
        If Intersect(Target, Union([B6:C10], [F6:H10], [B15:B20])) Is Nothing Or Target.Cells.Count > 1 Then

        Petite remarque sur la fonction de MDF, si vous regardez bien les options, cocher la case [Auto détect] et ainsi dès que vous cliquez la cellule au format date le calendrier s'active pas besoin du clic droit + G.

        Salutations.
        Le Pingou
        1. bonsoir
          autant pour moi le copier coller ne fonctionnait pas bien j'ai saisi les cellules a la main et c'est ok
          par contre un autre soucis se présente sur mon calendrier fait avec excel pas autre la saisie me donne 1 jour de moins que sélectionné et année 2016 au lieu de 12
          j ai eu beau generer un autre calendrier voir les options elles paraissent bonnes
          une solution?
          merci
        2. Contributeur
          tu parles à le pingou de mdf ??
      2. Contributeur
        Re,

        argument non facultatif : tu ne mets pas ce qu'il faut dans les parenthèses.
        Qui dit union, dit 2 plages au moins. Si tu n'en as qu'une ne pas faire union mais :
        If Intersect(Target, [B6:C10]) Is Nothing Or Target.Cells.Count > 1 Then
        ....

        le classeur de test : https://www.cjoint.com/?BEAxCmH5AOj

        eric

        PS: regarde aussi la remarque interessante de le pingou au dessus
        1. re
          excuse je voulais m'adresser a toi je connais pas bien le systeme du forum
          j ai vu mon soucis c'est qu'en fait je n'ai que la place de 30 plages a mettre alors qu'il m'en faudrait 36 jusqu'à 30 ça marche a 31 ça coince
          et pour le calendrier qui me donne pas la bonne date
          une idée?
          ou je dois ouvrir un autre post?
          merci
        2. re
          le calendrier réglé j'ai décoché le calendrier depuis 1904 et c est rentré dans l'ordre
          il ne me manque que les 6 plages restantes j'ai essayé de faire un deuxième calendrier pour mes plages restantes en le renommant calend2 mais il veut pas se lancer
          a bientot
        3. Contributeur
          Bonjour,

          il faut changer un peu la structure.

          Private Sub Calendar1_Click()
              ActiveCell = Calendar1
          End Sub
          
          Private Sub Worksheet_SelectionChange(ByVal Target As Range)
              Dim ok As Boolean
              ' si la sélection sur la feuille change (target est la référence de la sélection)
              ok = Not Intersect(Target, Union([B6:C10], [F6:H10], [B15:B20])) Is Nothing
              ' si plus de 30 plages
              ok = ok Or Not Intersect(Target, Union([E6:E10], [K6:K10])) Is Nothing
              ok = ok And Target.Cells.Count = 1
              '
              If Not ok Then
                  'alors on cache le calendrier
                  Calendar1.Visible = False
                  Exit Sub
              Else
                  'sinon
                  Calendar1.Top = Target.Offset(1, 0).Top + 2
                  ' aligner le calendrier avec le haut de la cellule en dessous
                  Calendar1.Left = Target.Left + 1
                  ' l'aligner à gauche de la cellule
                  'Calendar1.LinkedCell = Target.Address
                  ' mettre la cellule liée au contrôle sur la cellule sélectionnée
                  If IsDate(Target.Value) Then
                      'si la cellule sélectionnée contient une date
                      Calendar1.Value = Target.Value
                      ' la récupérer
                  Else
                      ' sinon mettre la date du jour
                      Calendar1.Value = Date
                  End If
                  Calendar1.Visible = True
                  'afficher le calendrier
              End If
          End Sub

          ou bien tester si on a affaire à une date et réagir à toutes les dates sans lister les plages.

          eric
        4. bonjour
          ça marche super merci de ta science
          pour ma connaissance
          faut il utiliser le calendrier 1904 ou pas?
          j ai commencé un classeur avec si je le décoche j ai une différence de 4 ans avec le calend1 je dois refaire toutes mes dates ou une autre solution?
          merci de ton aide précieuse sur ce coup
          a bientot
        5. Contributeur
          Le calendrier 1904 est à éviter tant que possible sur windows.
          Son seul intérêt est de ne pas bugger sur l'affichage d'heures négatives, et ce n'est pas forcément toujours la meilleure solution.

          C'est la valeur par défaut pour les mac et a été ajouté dans les options pour la compatibilité avec eux.

          Ceci dit si tu as beaucoup de dates ça parait délicat de les reprendre sans erreur...
          et jongler sur les 2 options est à coup à faire des cagades dont on se rend compte que trop tard.

          eric