Finition tableau formulaire

Bonjour à tous,

J'arrive au terme de la création de mon tableau de gestion du courrier. Cependant je n'arrive pas à résoudre un petit problème.

En effet afin de ne pas avoir à faire défiler le tableau à chaque nouvel enregistrement, j'ai appliqué dans une cellule la formule suivante :

=RECHERCHEV(MAX(A2:A2000);A2:B2000;2;VRAI)+1

Celle-ci doit me communiquer le numéro d'enregistrement libre.

Cependant je suis obligée à chaque fois que j'ajoute un enregistrement dans le formulaire d'aller ensuite cliquer et faire entrer sur la dernière date renseignée pour que le numéro du prochain numéro d'enregistrement libre s'affiche ce qui rend inutile ma formule.

Je vous joins le tableau pour que ce soit plus claire.

Merci pour votre aide et vos propositions.

Kahina.

Bonjour,

Remplace ta formule par celle-ci :

=DECALER(B1;NBVAL(A:A);)

RECHERCHEV n'ira pas te chercher la dernière ligne utilisée en A mais trouvera la première où se trouve la date la plus récente... et tu auras vraisemblement la même date sur plusieurs lignes.

Par ailleurs, il serait bon que tu ne laisses pas envahir l'éditeur par des modules vides, il est préférable d'éliminer sans délai ce qui ne sert pas. Et un module Standard n'est pas fait pour n'accueillir qu'une seule procédure ! Un seul module pourra accueillir considérablement plus de procédures que tu n'en auras dans ton fichier.

Je préconiserais de rassembler tes quelques macros dans un seul module, tu t'y retrouveras plus facilement à l'usage. L'ajout de module Standard (en nombre toutefois limité) ne se justifie que par des rôles distincts (pan de programme exportable par exemple, ou protection particulière d'une partie du code, etc.)

Je ne comprends d'ailleurs pas bien que ton numéro (départ ou arrivée) figurant dans ton formulaire tu le prémentionnes à l'avance sur la feuille. Il devrait n'apparaître qu'avec l'affectation des données de ton formulaire, et la seule question devrait être de servir ce numéro automatiquement dans le formulaire...

En outre, formulaires identiques arrivée et départ : un seul aurait pu jouer les deux fonctions... mais au stade où ça en est il faudrait tout reprendre...

Cordialement.

Hommage à Kahina !

Bonsoir MFerrand,

Je vais faire tout cela ! merci beaucoup pour ces connaissances supplémentaires comme tu peux t'en douter je débute. En ce qui concerne l'affectation du numéro d'enregistrement c'est vrai je ne sais pas pourquoi je pré-mentionne les numéros je viens à l'instant de les supprimer pour les renseigner au fur et à mesure ce qui en plus réglerait mon problème pour savoir quel est le prochains numéro de libre mais après un premier enregistrement ca me créer une erreur 381. Saurais tu d'où cela provient ?

Merci pour ça et pour l'hommage

J'en profite également si tu sais ou je peux trouver une aide ou une fiche explicative pour créer une cellule de recherche sur mon tableau,afin que je puisse par exemple retrouver un courrier en fonction de son objet ou de son expéditeur.

Encore merciiii.

Kahina.

Ton erreur se produit sur quelle ligne ?

Private Sub CommandButton1_Click()

'double click bouton Ajouter

If ComboBox1.Value = "" Then

MsgBox "Veuillez renseigner le champ 'Date d'arrivée' "

Else

Dim ligne As Integer

If MsgBox("confirmez-vous l'ajout des données?", vbYesNo, "confirmation") = vbYes Then

Worksheets("Départs").Select

ligne = Sheets("Départs").Range("A456541").End(xlUp).Row + 1

Cells(ligne, 1) = TextBox1.Value

Cells(ligne, 2) = ComboBox1.Value

Cells(ligne, 3) = TextBox2.Value

Cells(ligne, 4) = TextBox3.Value

Cells(ligne, 5) = TextBox4.Value

Cells(ligne, 6) = TextBox5.Value

Cells(ligne, 7) = TextBox6.Value

Unload UserForm2

UserForm2.Show (CETTE LIGNE SE MET EN JAUNE)

Else

End If

End If

End Sub

Sub Bouton2_Cliquer()

Unload UserForm1

UserForm2.Show (Celle-ci également)

End Sub

Bonjour !! pardon et merci encore.

Kahina.

Bonjour,

Si l'erreur apparaît sur Show, c'est parce qu'elle a empêché le formulaire de s'ouvrir, et se produit donc dans la procédure Initialize, exécutée avant ouverture. Vu le contenu de cette proc. je ne vois pas ce qui pourrait provoquer une erreur, à plus forte raison une erreur 381 !

Ah ! Si ! Si tu as effacé ta colonne B, la ligne alimentant la Combo ne va trouver qu'un Item dans la colonne, or la propriété List exige une liste d'au-moins 2 éléments...

[Je n'étais pas arrivé à la reproduire, mais je n'avais pas effacé la colonne.]

D'un côté, la méthode de réinitialisation consistant à décharger le formulaire pour le rappeler immédiatement, n'est pas la plus élégante... Et d'un autre côté, si on fournit le numéro automatiquement, plus besoin de cette liste dans la Combo. Mais tu auras éventuellement une Combo de recherche pouvant poser le même problème , il faudra donc en tenir compte pour affecter une liste (tester si plusieurs éléments, sinon on affecte le seul élément par AddItem...)

Mais tes autres questions réclament que je regarde ta construction de plus près, ce que je n'ai pas encore eu le temps de faire.

Cordialement. A+

Bonsoir MFERRAND,

C'est bon j'ai réussi à faire tout ce que je voulais sur le tableau et j'ai fais du ménage dans les modules comme tu me l'as conseillé.

Pour parfaire juste le tableau je voudrais que le formulaire ne s'ouvre pas automatiquement à l'ouverture du classeur mais exclusivement à la demande via mes boutons formulaire. Peux tu voir ca et me dire comment procéder quelle modification apporter.

Je tiens vraiment à te remercier pour le temps que tu m'as accordé.

Voici le tableau abouti.

Kahina.

Bonjour

merci à MFerrand

ci-joint

crdlt,

André

Bonsoir,

Dans la procédure Initialize, il faut supprimer la ligne concernant la Combo.

Et dans le formulaire, supprimer la Combo elle-même et la remplacer par une TextBox.

Il faudra ajouter une ligne dans Initialize pour servir automatiquement le numéro. Il y a plusieurs façons pour l'obtenir mais cela dépend de différents choix...

Si tu as supprimé les numéros de la colonne, il convient de supprimer tous ceux qui ne sont pas encore utilisés, soit tous tant qu'il n'y a pas d'inscription.

Ce que je suggèrerais volontiers (parce que c'est devenu ma façon habituelle de procéder, et que cela simplifie beaucoup de manipulations par la suite... ) c'est de mettre un nom sur chacune de tes feuille Arrivée et Départ.

Exemple :

Je nomme CArr une plage de la feuille Arrivée, définie ainsi dans la zone Fait référence à :

=DECALER(Arrivées!$A$2;;;NBVAL(Arrivées!$A:$A))

Cela nomme de façon dynamique la première colonne de tes données arrivée. Le nom s'adaptera à l'extension des données. Et la plage inclut une ligne vide (tu vas en voir l'intérêt plus loin).

Je nomme pareillement pour la feuille Départ, la première colonne CDép définie ainsi :

=DECALER(Départs!$A$2;;;NBVAL(Départs!$A:$A))

Pour la formule mise en L1 (qui affiche 0 s'il n'y a plus de numéro, et pas le suivant de toute façon car s'ils ne sont plus mis à l'avance, elle ne le trouvera pas), si tu penses utile de la conserver tu remplaces alors par :

=LIGNES(CArr)  'pour l'Arrivée
ou
=LIGNES(CDép)  'pour le Départ

Comme on a inclu une ligne vide dans la plage nommée, elle contient une ligne de plus que le nombre utilisé, le nombre de lignes fourni donc le prochain numéro.

Sans plages nommées, tu aurais eu le même résultat avec :

=NBVAL(A:A)

C'est l'en-tête de colonne qui fait ajouter un au nombre de données...

(Note que c'est de la même façon qu'on l'obtient en nommant les plages).

Le fait d'ajouter une ligne aux plages nommées fait en sorte que la plage soit toujours définie au démarrage, quand aucune données n'a encore été insérée (sinon elle renverrait une erreur dans ce cas).

Mettre automatiquement le numéro par ta proc. Initialize :

    TextBoxN.Value = [CArr].Rows.Count

Même chose en changeant le nom pour le départ.

Si cela ne servait qu'à cela, ce ne serait pas énorme.

Les noms permettent de te passer de toute référence aux feuilles. Tu peux addresser n'importe quelle cellule à partir de la plage nommée, les lignes s'ajustent aux lignes de données (et donc les numéros de lignes de la plage correspondront à tes numéros d'inscription). A2 c'est [CArr].Cells(1, 1). La plage nommée étant en A, les indications de colonnes continuent de correspondre à celles de la feuille. H2 sera [CArr].Cells(1, 8). Tu disposes donc de tous les éléments pour affectation des données sans aucune recherche, en faisant exclusivement référence à la plage.

Je te laisse déjà méditer ces éléments...

Bonne soirée.

superrrrrrr !!

HELPPP par contre ma direction m'a demandé d'ajouter une colonne "numéro d'arrivée DG" dans le tableau arrivées mais je ne trouve pas la manip pour relier le userform 1 à cette nouvelle colonne ?

s'il vous plait j'en vois le bout.

Merci beaucoup.

M. Ferrand,

Je tiens vraiment à te faire part de ma reconnaissance pour tout ca.

Andre13 ravie de te revoir et de recevoir une nouvelle fois ton aide.

Kahina.

Bonjour,

Il correspond à quoi ton numéro d'arrivée DG ? Je vois que tu y mets ton nom !

On retombe sur le problème récurrent de modifications introduites après coup... Je n'ai pas poursuivi hier mes propositions éventuelles mais elles passeraient par renommer tes contrôles (de façon à assurer un parcours en boucle de ces derniers dans l'ordre de tes colonnes), utiliser un tableau pour l'affectation et adresser exclusivement à partir de plages nommées, unifier modification (tu as un bouton Modifier...) et ajout sur une procédure unique de validation, si recherche préalable à modification introduire une Combo permettant recherche sur les critères souhaités (le numéro n'est pas très parlant...)...

Cela peut se maîtriser sans trop d'effort, et une vue bien ordonnée des contrôles permettra d'introduire plus aisément des modifications sans perdre le fil.

J'ai laissé de côté (pour plus tard !? ) ma proposition de fusionner les deux Userforms car ils ne sont pas rigoureusement identiques et dans les rapprochements que l'on fera naturellement des contrôles de l'un et l'autre, de petits décalages s'introduisent... Cela se gère mais mieux vaut déjà avoir une petite pratique de ce genre de gymnastique pour ne pas être déstabilisé...

J'ai noté aussi qu'une colonne devant accueillir un lien hypertexte échappait à la saisie par Userform, ce ne devrait pas être le cas...

Cordialement.

En faite la direction général reçoit en premier les courriers ensuite les redispatches aux services je veux donc pouvoir affecter un numéro d'arrivée propre à mon service mais aussi indiqué le numéro de DG quand il y'en a un pour ensuite pouvoir leur faire un retour sur leur courrier grâce à leur référence. en ce qui concerne le lien hypertexte on les fera manuellement je me suis déjà battue pour essayer d'en arriver là je ne comprends pas grand chose et n'ai jamais fais de VBA auparavant j'ai peur de me noyer c'est déjà un peu le cas. Et je dois rendre ce projet ce soir.

Ce soir c'est un peu court ! Si tu voudras reprendre... à ta disposition !

Bonne journée.

Peux tu m'expliquer avec des terme un peu plus simplifier s'il te plait les modifications que je dois apporter pour relier ma nouvelle textbox (numéro arrivée DG) à la colonne du tableau du même nom.

Merci, Merci.

Kahina.

Tu affectes tes cellules individuellement, sous la forme :

Cells(ligne, 3) = TextBox2.Value

Tu as introduit TextBox7, il te faut l'affecter de la même façon à sa colonne (C)

Cells(ligne, 3) = TextBox7.Value

Mais tu dois évidemment réviser toutes tes commandes car tu as introduit un décalage des colonnes.

Ta TextBox2 doit maintenant aller en D, donc la commande cité au début doit devenir :

Cells(ligne, 4) = TextBox2.Value

Comme je l'ai dit, on peut utiliser quantité de méthodes pour affecter, on choisit logiquement pour s'économiser de l'écriture et du temps d'exécution, mais aussi selon le contexte et les évolutions prévisibles faciliter les réadaptations en ayant à réinitervenir le moins possible sur le code...

Mais si tu dois rendre ta copie ce soir, tu fais comme j'ai indiqué, ça consiste en quelque sorte à mettre une rustine...

Pour utiliser d'autres méthodes, il faut repartir de la conception et introduire pas mal de modifications, et il faut un délai un peu plus long...

Cordialement.

Rechercher des sujets similaires à "finition tableau formulaire"