Dates avec Excel
Résoluj'ai fait une impression écran de ce que j'ai au départ et de ce que j'aimerais obtenir à la fin.
http://www.cijoint.fr/cjlink.php?file=cj201003/cijuTLBxYg.jpg
pour expliquer un peu :
j'aimerai trier les dates. mais la fonction "trier" trie par année.
moi, j'aimerais que cela se fasse par mois et par jour, c'est-à-dire que ça devrait les classer dans l'ordre chronologique des jours dans l'année, comme un calendrier.
sur la feuille 2, je reprend les données de la feuille 1 dans laquelle des lignes ont été en partie fusionnées.
le problème c'est que lorsque je récupère les données de la feuille 1 dans la 2, où je ne veux plus de cellules fusionnées, j'ai des "0" qui apparaissent.
j'espère avoir été clair.
merci pour votre aide.
--
Comme l'a dit le grand philosophe Mick Jagger : "Tu ne peux pas toujours avoir ce que tu veux"
Help me to help you!
29 réponses
Problème rencontré : trier des dates par jour et par mois plutôt que par année dans Excel, afin d'obtenir un ordre chronologique quotidien sur une feuille, sans considération explicite de l'année. Des éléments de réponse évoquent le formatage personnalisé des dates en jj mmmm pour activer le tri jour/mois, et la correction des références A2/D2 en A1/D1 pour tenir compte des entêtes. Des conseils techniques indiquent aussi d'utiliser l'AutoFilter et un tri croissant sur la colonne D, tout en gérant les données fusionnées afin d'éviter les zéros en A2. En cas de difficultés, certaines réponses proposent d'automatiser l'activation des macros via signature numérique et d'adapter le code selon les versions d'Excel, tout en évoquant une méthode pour récupérer la valeur au-dessus.
-
Re,
Il faut selectionner ta feuille dans le code, parce que si tu ferme ton classeur sur la feuille 1, c'est elle qui sera soumise au filtre et en colonne D de la feuille 1 il ne doit pas y avoir des valeurs numériques
il fau mettre en début de code
Worksheets(2). Select
ou
Worksheets(2). Activate
Private Sub Workbook_Open()
'on recherche avec une boucle la dernière ligne non vide de la colonne F
Worksheets(2). Select
Range("F35").Select-
p***** j'étais pas loin!
j'avais utilisé "Worksheets" et "Select" ou "Activate".
mais je l'avais mis sur la même ligne que "Range("F35").Select"
et j'avais toujours un message d'erreur.
je pensais que ça pouvait tout prendre d'un coup, mais non!
merci Mike.
j'espère que j'en ai fini avec ce classeur et que je vais enfin te laisser tranquille! ^^
ciao ;-)
-
-
re,
j'ai retiré la protection donc je n'ai plus Worksheets(1).
mon code est le suivant :
Private Sub Workbook_Open()
'on recherche avec une boucle la dernière ligne non vide de la colonne F
Range("F35").Select
Do While ActiveCell.Value = ""
ActiveCell.Offset(-1, 0).Select
Loop
'à partir de la dernière ligne non vide
'on sélectionne jusqu'à la cellule A2
Range("A2", ActiveCell).Select
'on installe le filtre et on trie en ordre croissant la colonne D
Selection.AutoFilter
Selection.Sort Key1:=Range("D2"), Order1:=xlAscending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
'on sélectionne la cellule A2 pour désactiver la sélection
Range("A2").Select
'on désactive le filtre
Selection.AutoFilter
End Sub -
Re,
Ouvre le fichier, puis le visual basic editor soit avec Alt et la touche F11 soit clic droit sur un onglet de feuille. Normalement j'avais protégé cette feuille avec le code OPEN en majuscule
doucle clic sur Thisworkbook, tu auras accès au code, et tu trouveras trois fois
Worksheets(1)
il suffit de changer la valeur de la feuille
Worksheets(2) -
Salut Mike,
je viens de rencontrer un petit problème toujours avec le même classeur Excel.
j'ai 2 feuilles, l'une pour ranger les personnes selon leur nom (feuille 1) et l'autre selon leur date de naissance (feuille 2) avec ton programme.
le problème c'est qu'après avoir enregistré le fichier en étant sur la feuille 1, à la réouverture, j'ai une erreur avec le prog. forcément puisqu'il n'est plus sur la bonne feuille.
c'est un problème mineur parce qu'il suffirait que je pense à sauvegarder en étant sur la feuille 2 pour ne plus avoir ce problème.
mais si c'était possible, en modifiant le code, de régler ça, ça serait encore mieux!
donc merci pour ton aide. -
Re,
Commences par créer un raccourci de ton fichier que tu places sur le bureau pour des raisons de facilité.
Regardes dans tous les programmes/Démarrage si un fichier s'y trouve déjà et relève son nom et fait une recherche de ce fichier (c'est plus facile pour ouvrir directement le menu)
Clic droit sur le fichier/Ouvrir le dossier contenant ce qui va t'ouvrir directement le menu démarrage
Ou
Disque dur (C:)/Documents And Settings/All Users/Menu Démarrer/Programmes/Démarrage
Une fois la fenêtre Démarrage ouverte colles y dedans le raccourci de ton fichier. A chaque allumage de l'ordi le fichier s'ouvrira automatiquement
-
J'ai Windows XP Pro SP3
-
Re,
Pour le lancement automatique du fichier au démarrage de l'ordi, donnes moi ta version Windows -
Salut Mike,
pour le tri du tableau, je crois que je vais laisser comme ça. ça fonctionne!
j'essayerais de revenir dessus pour corriger cette "bizarrerie".
j'ai utilisé ta procédure pour signer la macro. ça marche nickel.
il faudrait juste préciser qu'à la prochaine utilisation du fichier, il y a encore le message d'avertissement et qu'il suffit d'autoriser toutes les macros de cet éditeur pour ne plus être embêté.
ma prochaine étape, c'était justement de faire que ce fichier se lance automatiquement au démarrage!
en y réfléchissant, je verrais si je le ferais parce que ça pourra devenir énervant à la longue, surtout si le prochain anni est dans 2 mois!
merci encore pour ton aide ^^
ciao -
Re,
Pour compléter ton fichier et gérer au quotidien les fichiers dates ou anniversaire comme celui que j'ai mis sur le forum, il est possible de créer un raccourci du fichier et de placer ce raccourci dans le menu demarrage, ce qui t'ouvriera automatiquement le fichier a chaque démarrage de Windows -
Re,
j'ai changé dans le code les "A2" et le "D2" en "A1" et "D1"
Oui dans mon code le tri commence sur la ligne 2 pour ne pas toucher aux entêtes de colonne
Pour l'activation automatique des macros tu trouveras sur ce lien la procédure que j'ai rédigée dans les astuces du forum qui va te permettre de signer numériquement tes macros et donc ces macros et uniquement ces macros s'activeront automatiquement, si tu as un soucis fais signe
https://www.commentcamarche.net/faq/21009-excel-signature-numerique
Sans voir ton fichier il est difficile de voir ce qui cloche dans l'autofilter, je te conseille de te servir de l'assistant macro et de refaire cette partie du code.
Note bien point par point toute la manip
Mettre en surbrillance le tableau
Données/Filtrer/Filtre automatique etc ...
Filtre la colonne D2 en sélectionnant l'ordre croissant (colonne de mon fichier)
Refais Données/Filtrer/Filtre automatique etc ...pour désactiver l'autofilter et compares les codes que tu trouveras dans la Thisborkbook
La persévérance même à tout, souvent le résultat est le fruit de l'obstination
-
Salut Mike,
le fonctionnement du fichier est bon maintenant.
comme je l'ai mis j'ai juste dû faire des modifs
j'ai changé dans le code les "A2" et le "D2" en "A1" et "D1"
j'ai testé avec ta version et ça marche sans faire de modifs. j'ai dû faire un changement de trop qui n'a pas plu à Excel et qui le dérangeait pour faire le tri correctement. lequel je n'en sais rien! mais ça marche comme ça. donc c'est OK.
pour l'activation auto, j'ai cherché et les gens dans des discussions disaient d'autoriser toutes les macros. mais ça j'ai pas trop envie de le faire! donc je crois que je vais devoir l'autoriser à chaque fois, tant pis! si je trouve une solution dans l'avenir, je viendrais la poster ici.
et pour les explications de l'autofilter, laisse tomber. je comprendrai ça plus tard. je chercherai. comme ça je progresserai encore mieux sur Excel. ^^
sans ton fichier j'y serais jamais arrivé tout seul.
mille fois merci pour tout Mike.
ciao ;-) -
Re,
Comme je te l'ai déjà dit, c'est un vieux fichier, actuellement j'ai peu de temps, mais je réactualiserais ce fichier surtout au niveau de la formule en H ou effectivement on n'a pas à totaliser les années. En fait à l'époque j'ai du prendre la formule en F et simplement changer les adresses de cellules.
Pour les mots de passe sur fichier, on n'y accède pas de la même façon suivant les versions Excel, mais tu l'as trouvé.
Pour le tri, je l'ai testé, que ce soit sur Excel 2000, 2003 ou 2007 il fonctionne parfaitement, du moins chez moi !
Testes le fichier initial et tiens-moi au courant
-
re,
bon j'ai progressé en trouvant une solution pour le tri par date.
en fait, j'ai changé dans le code les "A2" et le "D2" en "A1" et "D1".
je sais pas pourquoi ça marche pas avec le 2 en indice (ça me paraissait juste pourtant?!).
j'ai effectué toutes les simplifications de formules dont j'ai parlé précédemment. et tout fonctionne bien apparemment.
il ne reste donc plus que la partie activation automatique de la macro et savoir ce que Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, DataOption1:=xlSortNormal signifie.
merci encore une fois. -
re-moi,
Le problème du tri dit venir du fait que tu as supprimer des colonnes et sans en tenir compte dans le code
ben j'ai regardé dans le code. si je le comprends bien, la seule chose à changer est Range("H36").Select, que j'ai changé en Range("F30").Select. tu avais mis H à cause des 2 colonnes de séparation E et G. donc je ne vois vraiment pas d'où vient le problème.
dans la colonne D, je comprends pas non plus un calcul dans ta formule.
pour rappel :
=SI(C2<>"";SI(DATE(ANNEE(C2)+ANNEE(AUJOURDHUI())-ANNEE(C2);MOIS(C2);JOUR(C2))<AUJOURDHUI();DATE(ANNEE(C2)+ANNEE(AUJOURDHUI())-ANNEE(C2)+1;MOIS(C2);JOUR(C2));DATE(ANNEE(C2)+ANNEE(AUJOURDHUI())-ANNEE(C2);MOIS(C2);JOUR(C2)));"")
le calcul ANNEE(C2)+ANNEE(AUJOURDHUI())-ANNEE(C2)
donnera forcément et toujours l'année en cours?! donc pourquoi ce calcul? on pourrait écrire plus simplement ANNEE(AUJOURDHUI()).
il en est de même pour ANNEE(C2)+ANNEE(AUJOURDHUI())-ANNEE(C2)+1 qu'on pourrait simplifier en ANNEE(AUJOURDHUI())+1.
pour revenir à la formule de la colonne H, à la toute fin, il faut remplacer le "D" par "MD" pour ne pas avoir de bug qui pourrait indiquer 0 jours.
et aussi, en remplaçant tous les "D" par "MD", cela évite d'avoir écrit Anniversaire de tibouuh dans 6 mois, 0 jour. mais seulement Anniversaire de tibouuh dans 6 mois, .
tu peux m'expliquer aussi Selection.Sort Key1:=Range("D2"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal, stp Mike.
Order1:=xlAscending et Orientation:=xlTopToBottom je comprends, mais le reste non.
et pour l'activation?
je ne veux pas que toutes les macros de n'importe qui soient activées d'office, mais seulement les miennes (dans un futur plus ou moins proche...) et celle de ton fichier.
désolé de t'embêter avec toutes mes questions, mais ça me permet de mieux comprendre ton fichier, d'essayer de le simplifier au maximum et de le faire à ma sauce.
merci encore pour ton aide précieuse. ;-) -
Salut,
ouais je suis bête! j'ai oublié de le préciser. je travaille sur Excel 2007.
en fait pour supprimer le mot de passe, dans Microsoft Visual Basic, il faut aller dans le menu "Outils", puis "Propriétés de VBAProject...".
dans la fenêtre qui s'ouvre, dans l'onglet "Protection", il faut décocher la ligne "Verrouiller le projet pour l'affichage" et supprimer le mot de passe.
Pour "Y" représente le nombre d'année compléte, "M" les mois , "D" les jours , "YM" le nombre de mois dans l'année incompléte, "MD" le nombre de jour d'un mois incomplé
donc Excel comprend "Y" comme étant le nombre d'année complète?
j'ai cherché la fonction datedif() et je ne la trouve pas! Excel l'affiche en tant que fonction sans argument. c'est pour ça que je capte pas les "Y" et consorts.
je ne comprends pas ce que peut faire la nuance entre "M" et "YM", de même entre "D" et "MD"?
regarde ce que tu as mis dans la formule de la colonne H :
=SI(C2<>"";SI(D2-AUJOURDHUI()=0;"C'est l' Anniversaire de "&B2;"Anniversaire de "&B2&" dans "&SI(DATEDIF(AUJOURDHUI();D2;"M")=0;"";DATEDIF(AUJOURDHUI();D2;"M")&" mois, ")&SI(DATEDIF(AUJOURDHUI();D2;"D")=0;" ";(DATEDIF(AUJOURDHUI();D2;"MD")&SI(DATEDIF(AUJOURDHUI();D2;"D")>1;" jours ";" jour "))));"")
tu mets "Y", "M" et ensuite "MD". pourquoi ne pas avoir mis à la place "D" tout simplement?!
les parenthèses en gras ne sont pas nécessaires ils me semblent?!
merci pour tes explications. -
Re,
C'est bien mon fichier, je l'ai créé sur Excel 2000 il y a quelques année, il est possible qu'à l'époque j'ai écrit des formules avec des lignes inutiles que je contrôlerai, effectivement en H on n'a pas a rechercher les année vu que l'anniversaire sera dans l'année à venir.
Pour supprimer le mot de passe, tu ne me donnes pas ta version Excel ? il faut enregistrer sous et dans les options Excel supprimer le mot de passe
Pour "Y" représente le nombre d'année compléte, "M" les mois , "D" les jours , "YM" le nombre de mois dans l'année incompléte, "MD" le nombre de jour d'un mois incomplé
Le problème du tri dit venir du fait que tu as supprimer des colonnes et sans en tenir compte dans le code
A+
Mike-31
Une période d'échec est un moment rêvé pour semer les graines du savoir. -
re,
j'ai avancé sur ton fichier Mike.
j'ai réussi à retirer la protection par mot de passe sur la feuille et j'ai simplifié le code (la vérif s'il y a moins de ligne n'est pas nécessaire vu que mon tableau sera toujours rempli; je garde néanmoins le code parce qu'il pourra m'être utile). et j'ai supprimé les 2 colonnes que tu avais mises, pour faire office de séparation je suppose.
voilà ce que j'ai maintenant :
Private Sub Workbook_Open()
'on recherche avec une boucle la dernière ligne non vide de la colonne F
Range("F30").Select
Do While ActiveCell.Value = ""
ActiveCell.Offset(-1, 0).Select
Loop
'à partir de la dernière ligne non vide
'on sélectionne jusqu'à la cellule A2
Range("A2", ActiveCell).Select
'on installe le filtre et on trie en ordre croissant la colonne D
Selection.AutoFilter
Selection.Sort Key1:=Range("D2"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
'on sélectionne la cellule A2 pour désactiver la sélection
Range("A2").Select
'on désactive le filtre
Selection.AutoFilter
End Sub
la cellule H36 que tu avais choisie est purement arbitraire, je parle du numéro de ligne? je l'ai changé pour qu'Excel ait moins de calcul à faire!
je comprends le code mais pas la partie en gras. tu peux me dire ce que chaque fonction fait stp.
autre chose :
j'ai modifié aussi la formule que tu avais mise dans la colonne H.
pour rappel :
=SI(C2<>"";SI(D2-AUJOURDHUI()=0;"C'est l' Anniversaire de "&B2;"Anniversaire de "&B2&" dans "&SI(DATEDIF(AUJOURDHUI();D2;"Y")=0;" ";(DATEDIF(AUJOURDHUI();D2;"Y")&SI(DATEDIF(AUJOURDHUI();D2;"Y")>1;" ans, ";" an, ")))&SI(DATEDIF(AUJOURDHUI();D2;"M")=0;"";DATEDIF(AUJOURDHUI();D2;"M")&" mois, ")&SI(DATEDIF(AUJOURDHUI();D2;"D")=0;" ";(DATEDIF(AUJOURDHUI();D2;"MD")&SI(DATEDIF(AUJOURDHUI();D2;"D")>1;" jours ";" jour "))));"")
j'ai supprimé la partie en gras. si je ne me suis pas trompé, elle ne sert à rien parce que jamais elle n'affiche le nombre d'années. et elle n'a pas à l'afficher d'ailleurs.
dans cette formule (et dans celle de la colonne F), je ne comprends pas ce que viennent faire les "Y", "M", "D" (et "Y", "YM", "MD" pour la F)?
je comprends que ça représente l'année, le mois et le jour.
en revanche, Excel demande toujours le mot de passe avant de dévoiler le code VBA. comment faire pour ne plus l'avoir?
et aussi, je dois toujours activer la macro. ça n'est pas possible qu'elle s'active d'office. mais juste pour ce classeur.
et enfin, j'ai un petit problème dans l'ordre des anniversaires à venir. j'ai fait un test avec plusieurs anniversaires dont un est aujourd'hui, l'autre dans 6 jours et d'autres dans longtemps. et celui dans 6 jours est positionné avant celui d'aujourd'hui. j'ai peut-être trop supprimé, mais je ne vois pas ce qui peut avoir une influence là-dessus.
je crois que je n'ai rien oublié.
merci encore pour ton aide parce que j'en ai bien besoin. -
Salut,
Pour trier tu ne dois pas fusionner les cellules dans le haut de ta feuille le nom Dupond est inscrit 1 fois ou si tu tries par prénom car tu n'a que ça a trié ça ira.
Ce que tu as sur la feuille 2 tu as copié la feuille 1 il faut sélectionner la colonne C Format Date et tu choisi ton format jj mmmm
Ensuite pour trier données trier
si tu as des noms différents 2 lé de trie par colonne a et puis colonne B
Si tu as mis des titres a tes colonnes et que tu as sélectionné les titres n'oublies pas de dire oui a "Ma plage de donnée a une ligne de titre
J'espère avoir été clair
salut-
-
Salut maya02,
J'espère avoir été clair
désolé, j'ai pas vraiment compris tout ce que tu as dit.
mais là tu parles d'un fichier Excel simple, sans macro?
en fait j'aime bien le fichier de Mike, dont je suis plutôt parti sur celui-ci maintenant. et je vais l'arranger à ma sauce.
il faut juste qu'on m'explique pour que je comprenne et que je puisse faire des modifs sans faire de bêtises! ^^
-
-
Re,
Es ce que tu travailles sur mon fichier Anniversaire
A+
Mike-31
Une période d'échec est un moment rêvé pour semer les graines du savoir.-
je travaille sur le fichier fourni par hubertaaz
il y a le lien dans le message 5
-
-
Salut,
Je connais bien ce code pour l'avoir écrit dans un fichier Anniversaire.
chaque partie du code est expliqué après une apostrophe
Private Sub Workbook_Open()
'Déprotection du fichier avec mot de passe OPEN à l'ouverture pour permettre le filtrage
Worksheets(1).Unprotect Password:="OPEN"
'contrôle le nombre de ligne à filtrer
If Range("D3") = "" Then
's'il y a moins de deux lignes on reprotége le fichier
'et on sort de la procédure
Worksheets(1).Protect Password:="OPEN"
Exit Sub
'sinon
Else
'on recherche avec une boucle la dernière ligne non vide colonne H
'il est possible d'écrire cette partie par ce code
'Cells(16384, 8).End(xlUp).Select
'ou celui ci
'Range("H16384").End(xlUp).Select
Range("H36").Select
Do While ActiveCell.Value = ""
ActiveCell.Offset(-1, 0).Select
Loop
'a partir de la dernière ligne non vide on sélectionne jusqu'a la cellule A2
Range("A2", ActiveCell).Select
'on installe le filtre et on trie en ordre croissant la colonne D
Selection.AutoFilter
Selection.Sort Key1:=Range("D2"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
'on sélectionne la cellule A2 pour désactiver la sélection
Range("A2").Select
'on désactive le filtre
Selection.AutoFilter
'on reprotége le fichier avec mot de passe OPEN
Worksheets(1).Protect Password:="OPEN"
End If
End Sub
-
Salut Mike,
j'ai la version sans les explications, donc je comprenais pas tout ou j'interprétais mal!
je vais regarder ce code de plus près pour bien le comprendre.
j'ai déjà une question concernant la protection de la feuille.
j'ai essayé de la retirer en supprimant les lignes relatives à la protection mais j'ai eu un message d'erreur à l'ouverture suivante du fichier.
j'ai dû trop en retirer ou pas assez!
tu peux me dire ce que je dois faire pour ne pas avoir à taper le mot de passe à chaque fois pour déprotéger la feuille stp?!
je pourrais toujours la remettre par la suite de toute façon.
merci.
-
- 1
- 2