|
| patval35 | Posté le 17/04/2008 @ 21:26 |
Petit astucien
37 Messages
| Bonjour , débutant en Vba ,j'ai créé un formulaire pour saisir des fiches mais j'ai quelques soucis. dans ma textbox1, je voudrais que cela inscrive un N° sous la forme 2008-0001et que cela l'incrémente a chaque fois (2008-0002 ,ect)et que le résultat soit ecrit dans la colonne a Dans ma textbox2, je voudrais inscrire une date (pas celle du jour ,mais celle mise sur la fiche) sous la forme jj/mm/aa dans la colonne b est il possible de mettre les / dans la texbox pour que tous le monde saisissent la date de la meme façon? j'ai creer une feuille liste en colonne A(processus), 4 items Management.Amélioration.Realisationet Support et en colonne B.C.D.E (sous processus) différents choix pour chaque processus. j'aimerais lier 2 textbox de façon a ce que suivant l'item choisit en colonne A dans la 1ere la 2eme affiche les choix possibles . j'espere que j'ai ete suffisament clair pour que vous puissiez m'aider.
|
| |
| |
| Publicité |
|
|
| ferrand | Posté le 18/04/2008 à 01:23 |
Astucien
1600 Messages
| Bonsoir, Embryon de réponse : pas de pb en principe pour ta première question, il suffit de récupérer le dernier numéro utilisé et de l'incrémenter à l'ouverture du formulaire. Pour la 2e : je conseillerais plutôt la saisie séparée de jour, mois, année pour les dates ; récupération au moyen de la fonction DateSerial et mise au format souhaité. Beaucoup plus fiable. La 3e : je ne saisis pas bien si on est sur une feuille de calcul ou un autre formulaire. Il y a diverses solutions pour afficher des choix successifs à opérer. Un fichier modèle permettrait de matérialiser... |
| |
|
| patval35 | Posté le 18/04/2008 à 09:57 |
Petit astucien
37 Messages
| bonjour, merci ferrand pour ta réponse pour le numéro ma macro est la suivante Me.N° = Format(WorksheetFunction.Max(Range([A1], [A65536].End(xlUp))) + 1, "2008-0000") mais cela ne fonctionne pas le numéro inscrit reste toujours le meme. pour la date.je suis vraiment debutant et je ne comprend pas ta reponse,peut tu develloper merci? pour la 3eme il sagit du meme formulaire ,dans mon classeur, j'ai une feuille pour la saise des info et une autre(liste)qui contient les items de mes différentes box je voudrai quand saissisant le processus l'autre box me preselectionne les sous processus concerné par le processus selectionné .les mettrent tous dans le meme menu déroulant ferait un menu trop long et serait source d'erreur comment joindre mon fichier pour que tu comprenne mieux ?j'ai fait une capture d'écran de ma feuille de saisie avec le useform mais je n'arrive pas a l'inserer dans le message (cest qoui l'url de l'image) merci de ton aide |
| |
|
| Bérylion | Posté le 18/04/2008 à 10:05 |
Astucien
2342 Messages
| patval35 a écrit :
bonjour, merci ferrand pour ta réponse pour le numéro ma macro est la suivante Me.N° = Format(WorksheetFunction.Max(Range([A1], [A65536].End(xlUp))) + 1, "2008-0000") mais cela ne fonctionne pas le numéro inscrit reste toujours le meme. pour la date.je suis vraiment debutant et je ne comprend pas ta reponse,peut tu develloper merci? pour la 3eme il sagit du meme formulaire ,dans mon classeur, j'ai une feuille pour la saise des info et une autre(liste)qui contient les items de mes différentes box je voudrai quand saissisant le processus l'autre box me preselectionne les sous processus concerné par le processus selectionné .les mettrent tous dans le meme menu déroulant ferait un menu trop long et serait source d'erreur comment joindre mon fichier pour que tu comprenne mieux ?j'ai fait une capture d'écran de ma feuille de saisie avec le useform mais je n'arrive pas a l'inserer dans le message (cest qoui l'url de l'image) merci de ton aide
Salut, et bienvenue à toi.
tu peux nous mettre un exemple sur http://cjoint.com/
ça à pas l'air bien compliqué, faut que je regarde dans le détail.
|
| |
|
| Bérylion | Posté le 18/04/2008 à 12:43 |
Astucien
2342 Messages
| Salut pour le n° tu peux essayer un truc dans ce style : VBA excel :
With Range("A65536").End(xlUp) If Left(.Value, 4) = Format(Date, "yyyy") Then .Offset(1, 0).Range("A1").Value = Right(.Value, 4) + 1 .Offset(1, 0).Range("A1").NumberFormat = "0000" .Offset(1, 0).Range("A1").Value = Format(Date, "yyyy") & "-" & .Offset(1, 0).Range("A1").Text Else .Offset(1, 0).Range("A1").Value = 1 .Offset(1, 0).Range("A1").NumberFormat = "0000" .Offset(1, 0).Range("A1").Value = Format(Date, "yyyy") & "-" & .Offset(1, 0).Range("A1").Text End If End With
je regarde pour la date suivant l'idée de ferrand ( ), mais je serais plutôt d'avis de passer par un dtpicker...
pour la 3°Q y'a plusieurs pistes possibles, avant de commencer à taper dans le dur y faudrait voir comment c'est fait à la base...
|
| |
|
| patval35 | Posté le 18/04/2008 à 19:13 |
Petit astucien
37 Messages
| bonsoir, merci pour vos reponse , j'ai essaye la methode de bérylion mais cela m'inscrit 0001 en a1 et 2008-0001 en a2. voici mon fichier la colonne b de la feuille liste correspond au sous processus lier au management et s'arretera a la cellule b6 inclus la colonne c de la feuille liste correspond au sous processus lier a amelioration la colonne d de la feuille liste correspond au sous processus lier a realisation la colonne e de la feuille liste correspond au sous processus lier au support merci de votre aide a tous |
| |
|
| ferrand | Posté le 18/04/2008 à 20:25 |
Astucien
1600 Messages
| Bonsoir, Récupéré ton fichier, mais pas le temps de plonger dedans d'ici quelques jours. J'ai même pas eu le temps de lire sérieusement la macro de Bérylion , un comble!! Juste quelques remarques sur ton post précédent : WorksheetFunction exige l'objet Application si je me souviens bien, tu dois donc écrire Application.WorksheetFunction. ... pour que ça puisse fonctionner. D'autre part, ton n° n'est pas une valeur numérique (difficile à incrémenter ). Tu incrémentes la partie numérique et tu reconstitue la chaîne pour former le nouveau n°. Mais je trouve ta méthode un peu compliquée : je conserverais volontiers le numéro suivant à utiliser (la partie numérique) en A1 par exemple de façon invisible, je constituerais le nouveau numéro à l'initialisation du formulaire et j'incrémenterais le n° en A1 à la validation (utilisation effective du n°) Pour la date, ma proposition consistait à remplacer ton textbox par 3 combobox (jour, mois, année): tu obtiens 3 valeurs qui te permettent de constituer une date avec la fonction DateSerial(année,mois,jour). J'ajoute que le format texte pour constituer une date m'a parfois joué quelques tours (VBA l'appliquant à l'anglosaxonne en inversant jour et mois, ce qui est gênant) Le reste, pas encor vu. A plus |
| |
|
| patval35 | Posté le 21/04/2008 à 09:47 |
Petit astucien
37 Messages
| bonjour a tous Mon sujet à ete mis résolu par erreur Avec la macro de bérylion J'arrive a inscrire le numero en A mais en ne tapant seulement un chifrre ou lettre.à chaque nouvelle frappe cela me rajoute un numéro en A. En fermant mon useform si je demande de vider la box N° cela ne redonne un nouveau numero.en fait a chaque action sur la box ( la vider, effacer une frappe ) cela me redonne un N°. pour les autres points ,rien de nouveau, je seche . |
| |
|
| Bérylion | Posté le 21/04/2008 à 10:00 |
Astucien
2342 Messages
| patval35 a écrit :
J'arrive a inscrire le numero en A mais en ne tapant seulement un chifrre ou lettre.à chaque nouvelle frappe cela me rajoute un numéro en A. c'est normal... !! tu as mis ce code sur l'évenement "change" du txtbox !!! à chaque fois que tu change le N°, ça impléménte une nvelle ligne... mets le plutôt sur "initialize" avec 2 ligne de plus : VBA Private Sub UserForm_Initialize() With Range("A65536").End(xlUp) If Left(.Value, 4) = Format(Date, "yyyy") Then .Offset(1, 0).Range("A1").Value = Right(.Value, 4) + 1 .Offset(1, 0).Range("A1").NumberFormat = "0000" .Offset(1, 0).Range("A1").Value = Format(Date, "yyyy") & "-" & .Offset(1, 0).Range("A1").Text Else .Offset(1, 0).Range("A1").Value = 1 .Offset(1, 0).Range("A1").NumberFormat = "0000" .Offset(1, 0).Range("A1").Value = Format(Date, "yyyy") & "-" & .Offset(1, 0).Range("A1").Text End If Me.N°.Text = .Offset(1, 0).Range("A1").Value Me.N°.Enabled = False End With End Sub
à chaque ouverture du form, le N° se met automatiquement.
|
| |
|
| patval35 | Posté le 21/04/2008 à 11:59 |
Petit astucien
37 Messages
| merci bérylion de ta reponse cela fonctionne,mais quand je clique sur valider(jai mis useform hide)cela cache le useformmais en cliquand sur saisie le useform s'ouvre mais il faut le fermer avex la croix deans le coin sup droit et le r'ouvrir pour que le N° s'affiche dans la box, quel est le code pour fermer le useform(close ne marche pas) plutott que le cacher (hide). pour la date je la ferais saisir manuellement se sera plus simple et j'attend que ferrand est un peu de temps pour voir s'il trouve une solution pour lier les box.a plus |
| |
|
| ferrand | Posté le 21/04/2008 à 20:50 |
Astucien
1600 Messages
| Juste ta dernière question pour le moment (en passant) : Load Userform1 ----- le charge sans l'afficher (permet d'intervenir avant affichage indépendamment de la procédure Initialize Userform1.Show----- l'affiche Userform1.Hide------ le masque (on peut toujours récupérer les valeurs des contrôles car il reste en mémoire) Unload Userform1---- le décharge (il n'est plus en mémoire, si les valeurs des contrôles n'ont pas été récupérées avant, elles sont perdues) A+ |
| |
|
| ferrand | Posté le 22/04/2008 à 11:58 |
Astucien
1600 Messages
| Salut, 2 petites suggestions : réglage liste sous-processus selon processus choisi initialisation du numéro : reste à supprimer l'inscription immédiate sur la feuille (avant validation, pour le moment ça permet de voir que ça marche) et à ajuster l'initialisation du 1er numéro (quand il n'y en a pas encore un précédent): est-ce qu'il peut être généré automatiquement ou non ? [nb: le textbox N° est verrouillé pour que l'utilisateur ne le modifie pas manuellement] J'ai aussi commencé un peu de ménage pour y voir plus clair. Suite selon mes loisirs... J'oubliais : http://cjoint.com/?ewlZ7msMPo Modifié par ferrand le 22/04/2008 11:59 |
| |
|
| ferrand | Posté le 22/04/2008 à 12:55 |
Astucien
1600 Messages
| Le même avec une proposition pour la date : http://cjoint.com/?ewmZ0ETJyi Un peu différent de mon conseil précédent mais me semble plus adapté à ton système. nb: je poursuis le nettoyage par la même occasion. Phase suivante : simplifier un peu ta validation mais pas le temps tout de suite, je dois quitter mon clavier... A+ |
| |
|
| patval35 | Posté le 22/04/2008 à 13:01 |
Petit astucien
37 Messages
| Merci Ferrand de ta réponse pour le réglage liste sous processus en fonction du processus ,c'est exactement ce que je cherchai .merci beaucoup. pour le N° jai utilisé le code de Bérylion mais il reste effectivement le Probleme de l'inscription immédiate sur la feuille J'ai modifié un peu mon useform en supprimant le bouton annuler et en modifiant la fermeture du useform avec unload plutot que delete ci joint mon nouveau useform http://cjoint.com/?ewm1MUuwLn merci beaucoup et a bientot |
| |
|
| Bérylion | Posté le 22/04/2008 à 13:08 |
Astucien
2342 Messages
| patval35 a écrit :
pour le N° jai utilisé le code de Bérylion mais il reste effectivement le Probleme de l'inscription immédiate sur la feuille ci joint mon nouveau useform http://cjoint.com/?ewm1MUuwLn VBA Private Sub UserForm_Initialize() With Range("A65536").End(xlUp) If Left(.Value, 4) = Format(Date, "yyyy") Then .Offset(1, 0).Range("A1").Value = Right(.Value, 4) + 1 .Offset(1, 0).Range("A1").NumberFormat = "0000" .Offset(1, 0).Range("A1").Value = Format(Date, "yyyy") & "-" & .Offset(1, 0).Range("A1").Text Else .Offset(1, 0).Range("A1").Value = 1 .Offset(1, 0).Range("A1").NumberFormat = "0000" .Offset(1, 0).Range("A1").Value = Format(Date, "yyyy") & "-" & .Offset(1, 0).Range("A1").Text End If Me.N°.Text = .Offset(1, 0).Range("A1").Value .Offset(1, 0).Range("A1").ClearContents Me.N°.Enabled = False End With End Sub
|
| |
|
| patval35 | Posté le 22/04/2008 à 13:27 |
Petit astucien
37 Messages
| un grand merci a Bérylion et à ferrand. tout marche comme je le voulais: |
| |
|
| Bérylion | Posté le 22/04/2008 à 14:04 |
Astucien
2342 Messages
| ma contribution : http://cjoint.com/?ewocM2h1nBj'ai fait ça un peu rapide ; c'est une adaptation de ton adaptation de l'adaptation de ferrand !!! avec tout ça si ça marche pas... Modifié par Bérylion le 22/04/2008 14:05 |
| |
|
| ferrand | Posté le 22/04/2008 à 17:09 |
Astucien
1600 Messages
| Désolé, j'ai opéré indépendamment avant de revenir sur le sujet, je n'ai donc pas pris connaissance de vos évolutions depuis mon dernier passage. Quoi qu'il en soit, je livre ma contribution (en principe définitive) : http://cjoint.com/?ewqZlnYxfn Elle répond (je crois) aux spécifications. Un petit subterfuge pour amorcer la numérotation, validation révisée (il a fallu quelques petits changements pour ça), toilette achevée (au moins pour l'essentiel). Par contre j'ai pas complètement testé... Si besoin d'explications, me demander. Un conseil toutefois (par rapport à ce que j'ai vu): les noms (ce qui suit Private Sub...) de certaines procédures évènementielles de contrôles semblent avoir été tapées directement, c'est à éviter, utiliser les listes déroulantes en haut du module, ça peut éviter pas mal d'erreurs. Précision par rapport aux questions que j'avais entraperçues : je décharge le formulaire à partir de la procédure qui l'appelle (lorsqu'elle reprend la main, une habitude chez moi...), cela te permet le cas échéant de masquer le formulaire pendant la validation (introduire Hide après les vérifications) et de le réafficher si poursuite (introduire Show après réinitialisation). A+ |
| |
|
| ferrand | Posté le 22/04/2008 à 17:29 |
Astucien
1600 Messages
| Re, Vu un point que je voulais vérifier. Les vérifications : j'ai rectifié un aspect esthétique, et aussi ajusté les propriétés de tes deux combo processus pour que l'utilisateur ne puisse taper en dehors de la liste. Il reste que tu devrais revoir de plus près les vérifs : on vérifie la présence d'un contenu mais pas sa cohérence... http://cjoint.com/?ewrCTZgFPa (avec rectifs indiquées ci-dessus) A+ et bonne soirée |
| |
|
| patval35 | Posté le 22/04/2008 à 20:12 |
Petit astucien
37 Messages
| Bonsoir , Merci Ferrand pour tes modif ,je vais les étudier une derniere question mes box description et proposition sont relativement grande pour pouvoir saisir du texte (mes collegues se lachent parfois)mais comment faire pour aller à la ligne dans les box?l la saisie de mon texte reste sur une seule ligne et mes box ne sont parfois pas assez longues ,pas de pb pour l'inscription dans la feuille,cela s'inscrit sur plusieurs lignes a+ |
| |
|
| ferrand | Posté le 22/04/2008 à 21:19 |
Astucien
1600 Messages
| Pour les 2 contrôles concernés, mettre les propriétés : Multiline sur True ScrollBars sur fmScrollBarsVertical A+ nb: as-tu noté que j'ai modifié les noms de tes box, pour pouvoir les défiler dans des boucles (ça simplifie l'écriture du code). |
| |
|
| ferrand | Posté le 23/04/2008 à 07:20 |
Astucien
1600 Messages
| salut, cela te permet le cas échéant de masquer le formulaire pendant la validation (introduire Hide après les vérifications) et de le réafficher si poursuite (introduire Show après réinitialisation). Faux conseil que j'ai écrit là  . ne pas appliquer, ça donnerait pas tout à fait le résultat. a+ |
| |
|
|
| Haut de la page |