Excel Macro constituer une date

Résolu/Fermé
informatifien Messages postés 741 Date d'inscription lundi 18 mai 2009 Statut Membre Dernière intervention 10 janvier 2016 - 17 déc. 2009 à 08:56
informatifien Messages postés 741 Date d'inscription lundi 18 mai 2009 Statut Membre Dernière intervention 10 janvier 2016 - 31 déc. 2009 à 11:18
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. . .

A voir également:

38 réponses

informatifien Messages postés 741 Date d'inscription lundi 18 mai 2009 Statut Membre Dernière intervention 10 janvier 2016 92
24 déc. 2009 à 11:55
ben je pourrai mais que ce soir cjoint est bloqué :s
je vais voir à nettoyer le fichier pour le poster ce sera plus facile pour vous tous de m'aider

Merci à tous ceux qui planche là dessus ;)
1
kirius14 Messages postés 61 Date d'inscription vendredi 21 novembre 2008 Statut Membre Dernière intervention 12 août 2010 4
17 déc. 2009 à 09:36
Il te faut tout de même une boucle je pense:
Pour coder cela: "If ma cellule est dans la zone Janvier Then
Mois = Janvier "

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

For i = 2 to 36 step 3
For j = 3 to 33
If (j>3 and j< 33) then
mois = "janvier")
end if
next j
next i


Voilà après ça dépend vraiment de ce que tu veux faire.
Puis pour la deuxième chose:

valeurconge = mois & jour & annee
Si tu veux ajouter du texte, il faut le mettre entre guillemets puis ajouter une virgule après

Voilà voilà
0
informatifien Messages postés 741 Date d'inscription lundi 18 mai 2009 Statut Membre Dernière intervention 10 janvier 2016 92
17 déc. 2009 à 09:53
Merci pour ta réponse kirius14,

ah ok la concaténation est la meme qu'en formule excel quoi. . . .je pensai que ce serait différent :)

Ben avec ta boucle certe ça va marcher, mais utiliser de la memoire et de plus je dois faire autant de If que de mois. . . . je pensais qu'on pouvais trouver en macro la valeur d'une plage d'ailleurs je suis sur une piste avec ActiveCell.Address ou AddressLocal mais . . .

Jour = ActiveCell.Offset(0, -2).Value 'là ca marche
Mois = ActiveCell.Address ' là ca dit qualificateur incorrecte
0
kirius14 Messages postés 61 Date d'inscription vendredi 21 novembre 2008 Statut Membre Dernière intervention 12 août 2010 4
17 déc. 2009 à 10:20
Tu n'est pas obligé de faire plusieurs if, tu peux inclure des elseif aussi, c'est mieux!
Les fonctions que tu utilise je ne les connais pas, je ne suis pas un expert en VBA non plus^^
Enfin si tu veux d'autres renseignements n'hésite pas!
0

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

Posez votre question
informatifien Messages postés 741 Date d'inscription lundi 18 mai 2009 Statut Membre Dernière intervention 10 janvier 2016 92
17 déc. 2009 à 10:38
oui oui je connais le elseif c'est juste que je voulais essayer de simplifier le code au maximum ;) euuh par contre ton for next ça ne vas pas pour ce que je veux faire car il ne trouve pas la valeur du mois. . . . .je veux dire que ça marche quand je clic dans la colonne qui correspond à janvier mais si je modifie une cellule de fevrier ça ne marchera pas tel qu'il est là . . .je sais pas si tu me suis là. . .lol
0
kirius14 Messages postés 61 Date d'inscription vendredi 21 novembre 2008 Statut Membre Dernière intervention 12 août 2010 4
17 déc. 2009 à 14:12
C'est parce que il faut que tu continus le if avec les elseif et que tu lui affecte les bonnes conditions.
Mais sinon si tu veux je peux essayer de la faire mais il me faut vraiment ce que tu veux, ce que ta déjà fait, et concrètement comment ton calendrier se fait.
0
informatifien Messages postés 741 Date d'inscription lundi 18 mai 2009 Statut Membre Dernière intervention 10 janvier 2016 92
17 déc. 2009 à 14:20
je te remerci, je vais voir comment je vais faire, j'ai trouvé une autre solution qui marche mais j'aimerai vraiment pouvoir gérer les noms de plage en macros car ca faciliterai pas mal de choses. . . .

mais par curiosité parlons de ton idée, on a du mal se comprendre par ce que je vois pas comment adapter ton for next .. . .. .car pour le For i on se deplace à l'horizontale ok mais si par exemple je met une valeur dans la colonne du mois d'avril comment ton For next vas savoir que c'est la bonne colonne, car en faite il faut que quelque soit la colonne ou je rntre une valeur il me trouve si c'est celle de fevrier, mars ou avril, le For next que tu as ecrit il vas tourner toutes les 3 cellules jusqu'à 36 mais sans jamais s'aréter. . . ..
0
kirius14 Messages postés 61 Date d'inscription vendredi 21 novembre 2008 Statut Membre Dernière intervention 12 août 2010 4
17 déc. 2009 à 14:39
En fait c'est une maccro qui tourne en tâche de fond dans excel, dès que tu va ouvrir ta feuille, ta maccro se met directement en route, il faut la placer dans un module.
Et donc à chaque fois que tu va écrire dans un cellule, ta maccro va vérifier si elle doit faire quelque chose en fonction de la cellule.
je sais pas si tu comprends; je suis pas très claire..
J'ai fais ce genre de chose il n'y a pas lontemps pour le travail, il a fallu que je fasse une feuille excel dans laquelle j'ai eu recours à une maccro de ce type.
La boucle for, s'arrète, elle a obligatoirement un début et une fin.
Est-ce-que tu peux m'envoyer ce que ta déjà fais s'il te plait?
Mais la si je comprends bien ce que tu veux faire, c 'est que ta un calendrier avec pour chaque jours 3 colonne dont une pour le jour, une pour le nom du jour de la semaine, et la troisième pour indiquer une tâche à faire ?
0
informatifien Messages postés 741 Date d'inscription lundi 18 mai 2009 Statut Membre Dernière intervention 10 janvier 2016 92
17 déc. 2009 à 16:21
Non je peux pas envoyer le fichier, oui tu as bien compris l'histoire des colone mais je pense que tu as raté le but initiale de ma macro, donc quand je remplis la cellule pour la tache, il faut que la macro reconstitue la date donc pour le jour c'est bon mais pas pour le mois donc en nommant un eplage de cellule "janvier" je pensai pouvoir dire à la macro si cellule active et dans la plage "janvier" alors la valeur mois est "janvier" . . .
0
kirius14 Messages postés 61 Date d'inscription vendredi 21 novembre 2008 Statut Membre Dernière intervention 12 août 2010 4
17 déc. 2009 à 16:28
Donc c'est bien ce que j'avais compris,
Je vais essayer de faire un tableau de ce genre là ce soir ou demain matin, puis je vais t'envoyer ça si tu veux!
Mais par contre, tu veux qu'il renvoi la date de la tâche a quel endroit?
Tu la veux dans la même cellule?
0
informatifien Messages postés 741 Date d'inscription lundi 18 mai 2009 Statut Membre Dernière intervention 10 janvier 2016 92
24 déc. 2009 à 08:53
Salut kirus14 désolé j'étais parti en vacance, euuh non la date je la veux en variable, pour ensuite l'utiliser dans un autre tableau ou je chercherai le nom de la personne qui a rempli son calendrier et le jour correspondant à la date en question, ouula dure de s'expliquer un lendemain de retour de vacance à l'embauche :s
0
tompols Messages postés 1273 Date d'inscription jeudi 29 juillet 2004 Statut Contributeur Dernière intervention 25 novembre 2013 435
24 déc. 2009 à 09:34
Bonjour,
je pensai pouvoir dire à la macro si cellule active et dans la plage "janvier" alors la valeur mois est "janvier"
No pb :) :
If Not Intersect(ActiveCell, Range("janvier")) Is Nothing Then MsgBox "janvier"

Joyeux noel ! :D


0
informatifien Messages postés 741 Date d'inscription lundi 18 mai 2009 Statut Membre Dernière intervention 10 janvier 2016 92
24 déc. 2009 à 10:54
Salut tompols,

ta macro va pas mal merci, mais du coup puis je dire un truc dans le genre "ma variable Mois est = au nom de la plage où est la cellule active" puisque dans mon tableau j'ai 12 plages correspondant aux 12 mois ce qui m'eviterai de faire 12 if si tu vois où je veux en venir ;)
???

et question à 2 cents peut tu "traduire" ta macro enfin la commenter stp,

Merci
0
tompols Messages postés 1273 Date d'inscription jeudi 29 juillet 2004 Statut Contributeur Dernière intervention 25 novembre 2013 435
24 déc. 2009 à 11:18
'alut :)
jvais commencer par l'explication : l'idée est d'utiliser la méthode intersect qui renvoi un objet range représentant l'intersection de plusieurs plages, si cette méthode ne renvoie rien, alors tes plages n'ont pas d'intersection => tester que intersect(tacellule, taplage) n'est pas vide revient à tester que ta cellule et ta plage ont une bien une intersection (zone commune) et donc ta cellule appartient à ta plage (j'espere etre clair dis moi si ça ne l'est pas)...
ensuite, pour ton pb, on va recuperer les noms de plages nommés via la collection activeworkbook.names puis boucler sur ces noms pour tester l'intersection avec ta cellule :
For Each n In ActiveWorkbook.Names
If Not Intersect(Range(n.Name), ActiveCell) Is Nothing Then MsgBox n.Name
Next n

EDIT : ne fonctionnera que si les noms sont sur une seule feuille et la cellule active est sur cette meme feuille (intersect() renvoi une erreur si les plages ne sont pas sur la meme feuille)
0
informatifien Messages postés 741 Date d'inscription lundi 18 mai 2009 Statut Membre Dernière intervention 10 janvier 2016 92
24 déc. 2009 à 11:45
ok j'ai compris ton explication merci bien je préfère comprendre ce que j'utilise plutot que de l'utiliser betement,
par contre, problème, mes plages se répétent dans plusieurs feuilles j'ai autant de feuilles que d'agents, chaque feuille est un calendrier complet, mon but étant que l'agent X rempli son calendrier(feuilX) avec par exemple le 1er janvier un congé, de là je reconstruis ma date(voir post 1 pour les details),je vais dans une autre feuille (calendrier du chef avec liste de tous les agents, là je cherche le nom de l'agent donc le nom de la feuil qui a ete modifiée, puis la date et colle le congé.

Donc ta réponse à ma question souléve plein d'autres questions et problèmes, je vais utiliser des variables qui seront valables (Mois,Jour) pour plusieurs feuilles mais de valeur différentes selon la feuille modifiée,donc comment je déclare mes variables (public,dim...???) où? (workbook, chaque feuille...???) et donc là du coup je me rend compte que ça va être coton tous ça mais à l'impossible nul n'est tenu . . .je sais pas si tu me suis mais moi je me suis lol mais pas toujours sans mal lol
0
tompols Messages postés 1273 Date d'inscription jeudi 29 juillet 2004 Statut Contributeur Dernière intervention 25 novembre 2013 435
24 déc. 2009 à 11:53
OK, jusqu'ici je répondais juste à la question "récuperer le nom de la plage"....C'est ptet pas la meilleure piste pour ton pb..... J'ai qd meme un peu de mal à me représenter ta feuille "calendrier", pourrais tu mettre juste une feuille "calendrier" ou meme un scheenshot sur cjoint.com ? Jfile en pause déjeuner, jregarde ça en début d'aprem....
A+
0
tompols Messages postés 1273 Date d'inscription jeudi 29 juillet 2004 Statut Contributeur Dernière intervention 25 novembre 2013 435
24 déc. 2009 à 14:15
Re,
Bon ce soir ça va être compliqué pour moi, si je passe par là ce sera pour souhaiter un joyeux noël aux CCMistes ;)...Après ça vacances, pas sur de pouvoir repasser par le forum ....
Sinon j'ai ajouté un test sur le nom de la feuille pour gérer les erreurs, ça devrait fonctionner :
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
0
informatifien Messages postés 741 Date d'inscription lundi 18 mai 2009 Statut Membre Dernière intervention 10 janvier 2016 92
24 déc. 2009 à 14:27
ola oui j'avai zapé c'est noel lol ben on vera plus tard alors par ce que moi aussi j'aurai pas trop le temps de faire mumuse sur CCM lol je le colle dans ma feuil ce code c'est ça?
0
tompols Messages postés 1273 Date d'inscription jeudi 29 juillet 2004 Statut Contributeur Dernière intervention 25 novembre 2013 435
24 déc. 2009 à 14:33
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
informatifien Messages postés 741 Date d'inscription lundi 18 mai 2009 Statut Membre Dernière intervention 10 janvier 2016 92
24 déc. 2009 à 15:04
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