Excel Macro constituer une date

Résolu
Salut à tous les CCMistes,

bon petit défi:

je ne peux envoyer le fichier donc je vais donner un max de details, j'ai un calendrier, les mois sont en ligne et les jours en colonne, il y a des cellules fusionnées. Exemple pour janvier A2-B2-C2 fusionnées c'est le champs "Janvier" (ainsi de suite pour les autres mois) en dessous en A3 j'ai '1' pour premier janvier, en B3 j'ai V pour vendredi et en C3 une cellule vide(ainsi de suite pour les autres jours) .
je voudrai que, quand je remplisse une des cellule vide du mois, reconstituer la date donc trouver le jour et le mois, pour le jour c'est facile je fais un ActiveCell.OffSet(0,-2) pour le mois je peux pas faire un offset car selon le jour, le nombre de cellule pour remonté jusqu'à la cellule du mois peux varier, vous me direz il faut faire une boucle mais j'ai eu une autre idée j'ai nommé la plage de cellule de chaque mois exemple A3:C33 s'appelle donc Janvier.

Mes variables sont:

Dim Mois as Integer,Jour as Integer, Annee as Integer
Dim ValeurConge as date
Annee = 2010


Donc 2 questions la première comment je code ça:

If ma cellule est dans la zone Janvier Then
Mois = Janvier


la 2° comment je concatène ça:

ValeurConge = Jour + Mois + Annee

Voilà je pense que ça doit pas être bien sorcier mais bon je ne sais comment coder ça merci d'avance pour le coup de main, si vous avez des questions n'hésitez pas. . .

--
MERCI A CCM à déclarer source d'intéret public . .. .. pensez à marquer vos topic résolus quand c'est le cas .. . . .Merci
Configuration: asus P5V800 / P4 2,8 Ghz / 1,5 Go Windows XP FireFox / IE 7

38 réponses

Résumé de la discussion

La problématique porte sur l’automatisation de reconstituer une date dans un calendrier Excel où les mois sont des en-têtes fusionnés et les jours en grille. Plusieurs préconisent d’utiliser des plages nommées pour chaque mois (par exemple Janvier), puis de détecter le mois via Intersect avec la cellule modifiée et de former la date par DateSerial. La solution évoquée combine l’extraction du jour par offset et déduction du mois par une vérification des zones nommées, avec une boucle pour couvrir les feuilles et éviter les échecs lorsque le mois change. En parallèle, des échanges portent sur la gestion des variables (public, dim) et l’architecture entre feuilles, avec des scripts Worksheet_Change et exemples utilisant des noms de plage et des tests d’appartenance.

Bobot (l’IA à votre service)
  1. bon pour ma question je viens d'avoir la réponse j'ai testé et ça marhce impeccable, vraiment je te remerçi Le pingou . . .c'est exactement ce que je désirais merci beaucoup
    0
    1. Bon j'ai finalement réussi à adapter votre macro à mon calendrier déjà paramétré avec les mise en forme conditionnel ça à l'air de marcher il faut voir à l'utilisation je vais donc créer le reste des feuilles par simple copie et adapter les 2 seule ligne de code à adapter ... je suis impressionné par ce petit bout de code qui fait ce que je voulais avoir comme résultat. . .

      une petite question par contre si dans tableau du chef 1° ou 2° semestre peut importe je met le nom des agent une ligne sur 2 celà risue-t'il de poser problème? je ne pense pas mais préfére demander quand meme .. . ?
      0
      1. oki, par contre finalement j'essaye adapter votre calendrier, mais j'ai des soucis au niveau des couleurs. . . .la mise en forme automatique ne marche pas mais pas du tout. . .de plus j'ai voulu remettre mars et avril en blanc comme le reste(car là c'est violet) enfin les collones jour et date, ça marche sauf sur 2 ou 3 cellule ou là bizarement IMPOSSIBLE de changer la couleur ,ca devient bleue et quelque soit la methode utilisée(pinceau,clic droit/format,outil pot de peinture) ca reste bleue . . .etrange n'est ce pas. . . .
        0
        1. Bonjour,
          Concernant la procédure, c’est correct de l’insérer dans chaque module de feuille car elle est réalisé dans se sens et non pas comme procédure indépendante.
          Note : il est nécessaire d’avoir une feuille par semestre pour le chef.
          0
          1. oups mille excuses le pingou j'ai rien dis pour les demi congés. .. . pardon pardon
            0
            1. Bonjour le pingou,

              Bon alors votre exemple donne le résultat souhaité c'est genial ! ! Merci beau travail

              mais . . .et oui il fallait bien un mais, est ce que je vais pouvoir adapter votre macro sur mon fichier? car, je dois garder la présentation que j'ai, maintenant je peux effectivement changer et mettre la date complète dans les cellules qui indique le jour (1,2,3 . . ) de plus j'avais des mise en formes conditionnelles, et j'ai vu vos modifications quand au calcule des congés c'est plus "intuitif" que mes formules mais pour le coup ne gère plus les 1/2 congés mais je dois pouvoir adapter j'ai compris votre methode et euuh lol vous avez de la chance dans votre entreprise plus vous posez des RTT plus vous en avez ? :) (juste que vous avez ajoutez les jours au lieu de les decompter pas grave du tout mais ca fait rever)

              Et donc pour le faire marcher je dois donc coller le code dans chaque feuille et adapter les ligne qui utilise le nom de la feuille c'est bien ça?

              Celà ne risque pas de poser problème avec les variables?

              Merci.
              0
              1. Bonjour,
                Je vous ai créé un petit exemple directement sur votre classeur.
                Voir les feuilles [Du Chef_Sem_1], [Du Chef_Sem_2] et [Feuil1].
                Sur la feuille [Feuil1] vous entrez les données désirées qui seront reportées sur les feuilles du chef.
                L’exemple : https://www.cjoint.com/?mEsLXnsZ7V
                0
                1. Bonjour,
                  Note: la base est la date et l'on affiche que la partie désirée.
                  Le fichier du poste 22 concerne l'année 2010, seul les 4 premiers mois sont réalisés.
                  Le fichier du poste 26 est automatique selon le choix de l'année.
                  0
                  1. arrf là n'ayant pas votre fichier joint sous les yeux je ne peut rien dire lol mais vous avez surement raison je regarde ça ce soir et vous dis quoi . . .je pense comprendre que vous voulez en faite que en cellule A3 par exemple que j'inscrive la date complete?
                    0
                    1. Bonjour,
                      Merci pour l'information.
                      Dans se cas avec ma proposition il vous suffit de prendre la date correspondante dans la colonne des numéros du jour et d'enregistrer la valeur concernée dans le tableau du chef en recherchant la ligne de l'employé et la date correspondante. C'est quand même plus simple de cette manière.
                      0
                      1. ah si ça y est je viens de comprendre, oui donc la cellule vide elle sert pour le decompte automatique des congés et RTT (par formule dans les petit tableau à droite) selon si on met 1C , 1/2C , RU ou RP celà decompte des jours . . .
                        le but de tous ça si celà peut vous etre utile, est que chaque agent se "connecte" au fichier puis rempli sa feuille perso et de là automatiquement s'affiche les jours posés dans l'onglet tableau du chef ce qui lui donnera une vue d'ensemble.
                        0
                        1. Re bonjour le pingou euuh je n'ai pas saisi votre question là :s, et ne peux voir le fichier ce matin pffff c'est vraiment pas facile le VBA quand cjoint est bloqué :(
                          0
                          1. Bonjour,
                            Un petit encas qui pourrait vous servir : https://www.cjoint.com/?mDwlvRKyF5

                            En supplément pouvez-vous donner une réponse à ceci :
                            Je reviens au départ, selon la description que voulez-vous mettre dans la cellule vide qui suit (le A =numéro du jour et B = le premier caractère du nom du jour) ??

                            Et à quoi doit servir la valeur de cette cellule ?
                            0
                            1. Contributeur
                              Bonsoir,

                              Jour = Target.Offset(0, -3).Value
                              Mois = (Target.Column - 4) / 4 + 1
                              Tu ne peux pas utiliser activecell qui sera la cellule active après la validation...

                              Ceci dit si toutes tes cellules étaient des dates (et n'afficher que la partie voulue) comme dans l'exemple du pingou ça serait plus simple pour tout le monde...

                              eric
                              0
                              1. et re bonsoir messieurs,

                                voilà mon fichier pour les questions je n'y répondrai que demain car je suis HS :s et m'en vais au lit mais remerci encore les gents qui participe ;)

                                https://www.cjoint.com/?mDu1WqgbcC

                                Bonne nuit
                                0
                                1. Bonjour à vous tous,

                                  j'espere que le père noel vous a gaté .. .

                                  avec l'euphorie du réveillon j'ai oublié de poster mon fichier que j'ai nettoyé donc je regarde votre fichier ce soir Le Pingou et posterai le mien qui je l'espere vous eclairera tous.. . .

                                  Merci
                                  0
                                  1. Bonsoir,
                                    Voici pour Noël : si votre calendrier ressemble à la pièce jointe alors pour chaque case vide (en orange) vos avez les données correspondantes directement par référence au numéro du jour.
                                    Le fichier : https://www.cjoint.com/?mza0EsHqYG
                                    0
                                    1. Bonjour,
                                      Je reviens au départ, selon la description que voulez-vous mettre dans la cellule vide qui suit (le A =numéro du jour et B = le premier carractère du nom du jour ) ??

                                      Et à quoi doit servir la valeur de cette cellule ?
                                      0
                                      1. Voilà le code que j'ai pour l'instant dans une de mes feuilles:

                                        Private Sub Worksheet_Change(ByVal Target As Range)

                                        Dim Jour As Integer, Mois As Integer, Annee As Integer
                                        Dim ValConge As Date

                                        Annee = 2010

                                        Jour = ActiveCell.Offset(-1, -3).Value
                                        Mois = ActiveCell.Offset(-1, -1).Value
                                        'If Not Intersect(ActiveCell, Range("janvier")) Is Nothing Then MsgBox "janvier"
                                        For Each n In ActiveWorkbook.Names
                                        If InStr(n.RefersTo, ActiveCell.Worksheet.Name) > 0 Then
                                        If Not Intersect(Range(n.Name), ActiveCell) Is Nothing Then MsgBox n.Name
                                        End If
                                        Next n

                                        ValConge = Jour & "/" & Mois & "/" & Annee
                                        ValConge.NumberFormat = "ddd-dd/mm/yy"
                                        MsgBox ValConge

                                        End Sub


                                        Il ne se passe rien quand je met une valeur dans une cellule. . . . mais bon je ne suis pas du tout sûr de mon code là . . .
                                        0
                                        1. Contributeur
                                          J'imagine que ton code est dans un module ? en fait tu colles ce passage dans ta procédure à l'endroit ou tu voulais récuperer le nom de la plage.....on verra avec le fichier pour une solution complète, je maitrise pas tout là, faudrait voir ton classeur, ton code etc....
                                          0
                                          • 1
                                          • 2