Calendrier cellule

D

Deborah

Guest
Bonjour à tous et toutes,
Est ce que vous pouvez m'aidez sur la saisie d'une date dans une cellule
à l'aide d'un calandrier ?
Voir la pièce jointe.
Merci
 

Pièces jointes

  • Date.zip
    1.9 KB · Affichages: 397
  • Date.zip
    1.9 KB · Affichages: 399
  • Date.zip
    1.9 KB · Affichages: 403
B

besbes

Guest
Bonjour à tous et merci pour cette merveilleuse macro.
Cependant quand je fais appel à ce calendrier sous vba le logiciel me dit que je ne peux pas afficher une feuille non modale lorsqu'une feuille modale est affichée !!!
Je vous avoue ne pas très bien comprendre...

AUtre question est-il possible de faire appel à ce calendrier afin de compléter le contenu d'un textbox ?

Merci d'avance pour votre aide et vos réponses.

A plus

Seb
 
M

myDearFriend

Guest
Bonjour Besbes, le Forum.


Tout d'abord merci Besbes pour le compliment.


Pour ta 1ère question :
"Quand je fais appel à ce calendrier sous vba le logiciel me dit que je ne peux pas afficher une feuille non modale lorsqu'une feuille modale est affichée !!!"

Depuis VBA, tu essais de faire appel au mDF_Calendrier alors qu'un autre UserForm est déjà affiché en mode Modal. L'aide de VBA précise :"Lorsqu'un objet USF est modal, l'utilisateur doit fermer l'objet UserForm pour pouvoir utiliser toute autre partie de l'application.". A l'inverse, dans le cas du "Non Modal", il est permis de garder affiché l'USF au premier plan, tout en continuant à travailler sur la feuille au second plan.


Ton USF étant précédemment affiché en mode Modal, au lancement du Calendrier, il y a 2 cas de figure :

1/ Par le biais des options du Calendrier, l'affichage de ce dernier est prédéterminé en mode Non Modale : la situation n'est pas acceptée par VBA et tu as droit à un beau plantage car aucun objet Non Modal ne peut être affiché "par dessus" un autre objet qui, lui, est Modal.

2/ Toujours par le biais des options du Calendrier, son affichage est prédéterminé en mode Modale : cette situation est, par contre, tout à fait acceptée par VBA. Deux objets, chacun en affichage Modal, peuvent très bien se trouver sur 2 plans distincts ("l'un en dessous de l'autre"). Dans ce cas, celui au premier plan devra être fermé avant toute action sur le second.

Ton problème peu donc être résolu si tu prédétermines dans les options du Calendrier (via le bouton ">>") un affichage en mode Modal (case décochée) pour les lancements futurs.

Une autre solution (la meilleures à mon avis) consiste à forcer le mode Modal du Calendrier directement depuis ton code en utlisant les lignes suivantes :
Workbooks("mDF_Calendrier.xla").Sheets(1).Cells(2, 1) = False
Application.Run ("mDFcalShow")



Pour ta 2ème question (conséquence directe de la 1ère je suppose) :
"Est-il possible de faire appel à ce calendrier afin de compléter le contenu d'un textbox ?"
La réponse est NON pour l'instant. Cette version du Calendrier ne permet d'insérer une date que dans une cellule de feuille Excel.
Toutefois, je compte bien apporter quelques améliorations à cette macro complémentaire et cette question fait déjà partie des objectifs du "mDF_Calendrier Version 2"...


Cordialement,
Didier_mDF
 
Z

zesuila

Guest
Bonjour MydearFriend !
Merci d'avoir répondu à mon mail.
Et j'ai bien compris le message !
Une petite question : ma connaissance en vba s'améliore mais j'ai bien évidemment encore pas mal de problèmes avec ce "langage".
Lorsque tu écris :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Application.Intersect(Target, Range("C10")) Is Nothing Then
Application.Run "mDFcalShow"
End If
End Sub
comment puis je faire pour mettre aussi la colonne H en action pour le calendrier.
Encore merci pour ta réponse , ta disponibilité, et ta gentillesse.
Zesuila
 
Z

zesuila

Guest
Ca y est je réfléchis VBA maintenant !!! Bon il y a encore du boulot mais j'ai trouvé tout seul !!!
Ma formule :
If Not Application.Intersect(Target, Range("D:D", "H:H")) Is Nothing Then
Application.Run "mDFcalShow"
Parce quen fait c'est sur la colonne D et sur la colonne H ou le calendrier devait se mettre en action.
Cela fonctionne sauf un petit détail. Entre le passage de D et H, le calendrier reste en activité, ce qui fait que en arrivant à H j'ai un message d'erreur comme quoi le calendrier reste ouvert. La seule solution est de faire echap. entre les 2 cellules.
Mais quand même ! ça marche !!!
Encore merci MydearFriend
Zesuila
 
Z

zesuila

Guest
heu, hum, rahhhhhhh ! Eh bien non cela ne marche pas ma formule !
J'ai encore une fois été trop vite dans ma réponse positive, qui en fait ne l'est pas !!!
Parce qu'avec cette formule, le calendrier , même après avoir fait echap s'ouvre également en colonne E, en F, en G, et en H.
Bref cela ne va pas !! Greuuuh !
Hum, heu, MydearFriend, hum , heuu, tu peux m'aider stp ?
Encore merci
Hum, heu, zesuila, le fortiche du vba (Véritable Bille Actif)
 
C

CHti160

Guest
salut" zesuila"
bonjour le "FORUM"
coucou à Didier s'il passe par là
je pense que tu peux arriver à ce que tu veux en utilisant
un truc du genre
set Z1=Range("D:D") regarde dans l'aide VBA Union
set Z2=range("H:H")
If Not Application.Intersect(Target, Union(Z1,Z2))Is Nothing Then
car Range("D:D","H:H") défini la plage de D à H
A+++
Jean Marie
 
Z

zesuila

Guest
Bonjour Jean Marie
Ca marche
Il a fallu que je réflechisse un peu, pour savoir qu'il fallait mettre en option explicite :
Public Z1 As Range
Public Z2 As Range

et ensuite ta solution.

Encore merci
J'avance, doucement mais j'avance dans ce monde VBA
A bientôt
Zesuila
 
M

myDearFriend

Guest
Bonsoir Zesuila, Jean-Marie (Chti160), le Forum.

Il a fallu que je réflechisse un peu, pour savoir qu'il fallait mettre en option explicite :
Public Z1 As Range
Public Z2 As Range


Non Zesuila, en complément de la réponse (judicieuse) de Jean-Marie, je t'informe que tu n'as point besoin de déclarer "public" Z1 et Z2 au niveau module (c'est-à-dire juste en dessous d'Option Explicit). La déclaration de ces variables objets doit plutôt se faire ici, au niveau procédure comme suit :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Z1 as Range
Dim Z2 as Range
   set Z1=Range("D:D")
   set Z2=Range("H:H")
   If Not Application.Intersect(Target, Union(Z1,Z2))Is Nothing Then
      Application.Run "mDFcalShow"
   End If
End Sub

Tu aurais pu aussi écrire directement :
      If Not Application.Intersect(Target, Union(Range("D:D"), Range("H:H"))) Is Nothing Then...
ou (ce qui revient au même)
      If Not Application.Intersect(Target, Union(Columns(4), Columns(8))) Is Nothing Then...


Entre le passage de D et H, le calendrier reste en activité, ce qui fait que en arrivant à H j'ai un message d'erreur comme quoi le calendrier reste ouvert. La seule solution est de faire echap. entre les 2 cellules

Lorsqu'il est ouvert, en bas et à gauche du mDF_Calendrier, tu as la représentation d'un petit cadenas. Il s'agit d'une option "Verrou" permettant le maintien de l'affichage du Calendrier après sélection d'une date. Pour régler ton pb, il suffit simplement de désactiver cette option en cliquant sur ce cadenas (il se transforme en clé)... Ainsi, le calendrier se fermera à chaque sélection d'une date et tu n'auras donc cette erreur dans ton code.
Pour info, un clic sur l'icone ">>" (en bas à droite), te permet l'accès aux explications et autres options du Calendrier...


Cordialement,
Didier_mDF

myDearFriend-3.gif
 
Z

zesuila

Guest
Bonjour MyDearFriend
Merci pour la rectification du code.
En revanche, j'ai effectivement bien vu qu'il y avait une petite flèche pour les explications et j'ai usé et abusé également du petit cadenas. Mais rien à faire , le calendrier s'ouvrait aussi en E, F,G cadenas bloqué ou pas.
Mais je vais tout de suite essayer le nouveau code pour voir ce que cela fait.
En tout cas je te remercie et te tiens au courant.
Je tiens encore à dire que ce petit calendrier est un outil extra. A avoir absolument dans ses macros complémentaire. Bill devrait même te rétribuer pour cela !!!
A bientôt sur le forum
Zesuila
 
Z

zesuila

Guest
Re MyDearFriend

EH bien ça fonctionne. Super
Encore merci
Une petite question
si je veux que le calendrier disparaisse en sortant de la 1ere colonne ou il s'est activé et qu'il réapparaisse dans la 2e colonne ou il doit s'activer, quel est le code?
Pour info, mes colonnes sont D et H
Merci merci et merci
 
M

myDearFriend

Guest
soir Zesuila, le Forum.


Si j'ai bien compris Zesuila :

1/ tu souhaites que le mDF_Calendrier s'affiche dès que l'on clique dans une cellule quelconque d'une plage représentée par l'union des colonnes D et H, mais tu rencontres une erreur si l'utilisateur ne sélectionne pas de date mais clique à nouveau dans une autre cellule de cette plage.

      Effectivement, si on appelle le calendrier une deuxième fois alors que ce dernier est déjà ouvert, cela provoque une erreur...

2/ tu souhaites également que ce calendrier disparaisse si l'utilisateur choisit une date.

      La réponse est dans mon post précédent (utilisation de l'option "Cadenas").

3/ tu voudrais également qu'il disparaisse si l'utilisateur clique dans une autre cellule non comprise cette fois dans la plage précitée (sans même avoir sélectionné une date dans le calendrier).

      J'avais prévu la possibilité de charger le calendrier depuis le code VBA d'une autre appli en faisant Application.Run "mDFcalShow",
      mais je t'avoue ne pas avoir envisagé, à l'origine, la possibilité de le décharger d'une façon similaire (sans intervention de
      l'utilisateur)...


Pour trouver réponse à tes problèmes, j'ai donc revisé à nouveau le code du mDF_Calendrier et tu trouveras en pièce jointe la version 2.2. Cette nouvelle version corrige le problème exposé au point 1/ ci-dessus et te permettra le déclencher l'unload du Calendrier en faisant :

      Application.Run "mDFcalHide"


Pour ton appli, je te propose donc d'installer cette nouvelle version du calendrier et d'utiliser dans ton code la procédure suivante :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Z1 As Range
Dim Z2 As Range
   Set Z1 = Range("D:D")
   Set Z2 = Range("H:H")
   If Not Application.Intersect(Target, Union(Z1, Z2)) Is Nothing Then
      Application.Run "mDFcalShow"
   Else
      Application.Run "mDFcalHide"
   End If
End Sub


Cordialement,
Didier_mDF

myDearFriend-3.gif
 

Pièces jointes

  • mDF_Calendrier22.zip
    30.1 KB · Affichages: 93
Z

zesuila

Guest
Bonjour MyDearFriend

Tout fonctionne à merveille.

Il apparait , il disparait, et hop le calendrier réapparait !! David Copperfield n'aurait pas fait mieux !!
Les deux seuls petits trucs (mais je dis bien petits, voire même très petits).Et c'est surtout pour info car cela ne me gêne pas outre mesure

c'est d'abord qu'en sélectionnant la ligne entière (ce qui m'arrive souvent dans mon appli, le calendrier se charge (je pense que c'est normal, vu que les colonnes concernées par ce calendrier sont pris dans la ligne).

Et puis le fait que le calendrier ne puisse pas être paramétrable au niveau emplacement (que l'on puisse par exemple le placer en haut à droite, ou en haut à gauche selon ce qu'il pourrait cacher) et cela à l'ouverture du calendrier .
(car c'est vrai qu'ensuite lorsqu'il est ouvert on peut le déplacer à volonté)

Mais ce ne sont que des détails

Encore merci et je le re re re répète bravo pour ton boulot, tes conseils, ta disponibilité

Zesuila
 
M

myDearFriend

Guest
Bonsoir Zesuila, le Forum.


Pour ta première remarque, insère la ligne de code suivante :

   Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   Dim Z1 As Range
   Dim Z2 As Range
   If Target.Count > 1 Then Exit Sub
   Set Z1 = Range("D:D")
   Set Z2 = Range("H:H")
   If Not Application...
   ...

Pour la deuxième, je n'ai pas vraiment le temps de te trouver une solution car très occupé actuellement. Mais j'essaierai d'envisager la chose lors d'une éventuelle révision du mDF_Calendrier...


Cordialement,
Didier_mDF

myDearFriend-3.gif
 

Discussions similaires

Réponses
17
Affichages
677
Réponses
10
Affichages
534
Réponses
3
Affichages
123

Statistiques des forums

Discussions
312 330
Messages
2 087 349
Membres
103 526
dernier inscrit
HEC