Macro calendrier de saisie

Résolu
surplus Messages postés 673 Date d'inscription   Statut Membre Dernière intervention   -  
surplus Messages postés 673 Date d'inscription   Statut Membre Dernière intervention   -
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
A voir également:

7 réponses


 
Bonjour,
Une autre solution, faites donc un petit crochet chez mDF : http://www.mdf-xlpages.com/modules/publisher/item.php?itemid=28
0
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 276
 
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
0
surplus Messages postés 673 Date d'inscription   Statut Membre Dernière intervention   4
 
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
0
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 276
 
Ben, si tu sais lire, j'ai mis la modification demandée dans mon post précédent...
eric
0
surplus Messages postés 673 Date d'inscription   Statut Membre Dernière intervention   4
 
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
0
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 276
 
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
surplus Messages postés 673 Date d'inscription   Statut Membre Dernière intervention   4
 
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
0

 
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
0
surplus Messages postés 673 Date d'inscription   Statut Membre Dernière intervention   4
 
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
0
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 276
 
tu parles à le pingou de mdf ??
0
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 276
 
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
0
surplus Messages postés 673 Date d'inscription   Statut Membre Dernière intervention   4
 
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
0
surplus Messages postés 673 Date d'inscription   Statut Membre Dernière intervention   4
 
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
0
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 276
 
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
0
surplus Messages postés 673 Date d'inscription   Statut Membre Dernière intervention   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
0
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 276
 
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
0