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

  • Votes
  • Date
  • Date décroissante
  1. 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
  2. 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 ??
  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
      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
    2. 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
    3. 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