Problème ajout bouton modifier

Bonjour

ceci est mon premier fichier donc je pense qu'il doit y avoir pas mal de choses à améliorer.

j'ai piqué pas mal de lignes de code sur le net et tenté de me débrouiller tout seul, sauf que là...je n'y arrive pas.

Tous les jours je dois contrôler la sécurité des quais avant de les utiliser.

Dans l'onglet menu je clique sur le carré vert et je renseigne l'etat des élements à controler

le mot de passe est okdemquai

si je constate un dysfonctionnement je ne coche pas la case correspondante et je valide

par contre je souhaiterais apres avoir eu une intervention maintenance pouvoir modifier l'etat de l'element remis en etat

pour cela je dois pouvoir rappeler la feuille correspondante et ré afficher l'etat

c'est donc pour cela que j'ai ajouté une combobox et un bouton modifier

mais la combobox seule ne suffira pas car dans la meme journée je dois faire jusqu'a 3 ok demarrage

il me faut donc 1 combobox pour la date et une pour l'équipe ???

je suis bien incapable de le gerer tout seul, pourriez vous m'aider svp

merci

Bonjour,

ceci est mon premier fichier donc je pense qu'il doit y avoir pas mal de choses à améliorer.

Certes ! Mais pour un début le résultat est déjà plutôt convaincant !

La recherche d'améliorations que je préconiserais :

  • Oublier l'enregistreur, et dans la foulée expurger le code des Select, Selection et autre Activate inutile, éliminer aussi le passage de paramètres à leur valeur par défaut (ce que fait l'enregistreur, qui occupe inutilement de la place, et du temps à définir des paramètres à la valeur qu'ils ont déjà !)
  • Passer préférentiellement les arguments par position (l'enregistreur ne connait pas...), c'est la méthode "normale" et on gagne en écriture, réserver le passage par noms aux cas où il s'avère plus pratique et peut éviter des erreurs.
  • Indenter un peu mieux le code (bon ! ça c'est un point sur lequel je suis maniaque ! ). Mais le temps gagné à la lecture d'un code indenté selon des règles strictes est considérable...
  • Se roder à l'utilisation de boucles et de tableaux, indispensables à une bonne utilisation de VBA.
  • Utiliser des noms (aussi bien Excel que VBA).

...

Je ne me suis occupé, suite à la question que d'un seul Userform : okdemquai...

L'amélioration que tu aurais à rechercher, une fois un peu plus rodé, c'est la fusion des 4 autres en un seul... Je conçois que cela aurait été difficile au départ mais je pense que tu pourras t'y attaquer assez vite avec un peu plus d'assurance dans la composition des Userforms...

Je n'ai pas insisté sur la limitation du nombre de modules standard... dans ta configuration cela te permettait de t'y retrouver, mais dans la foulée, un seul module se justifie.

Revenons à ton Userform : j'indique ci après les modification apportées mais tu vas devoir les étudier de plus près pour t'y retrouver.

La seul chose que je n'ai pas changé est le contenu de tes messages ! bien que... tu sois fâché avec les accents et que je trouve désagréable le non respect des règles typographiques, et nuisible à la lecture...

On commence par la feuille OK DEM QUAI :

  • en colonne A des dates ! Oui mais en fait du texte et non une valeur Date. Il est mieux qu'une date soit une Date, je rétablis donc...
  • en colonne B des heures : pas de difficultés, on affecte des valeurs texte que'Excel convertit naturellement
  • en colonne C, pas de problème
  • en colonne D il s'est avéré que le format des cellules était horaire ! Je m'étonne que tu n'aies pas eu de difficulté avec, j'ai rétabli le format Standard sur la colonne du tableau
  • pour les autres colonnes, les fusions compliquent un peu... Je ne fais pas partie de ceux qui proscrivent toute fusion de cellule, cependant quand rien ne le justifie comme ici, c'est se compliquer la vie inutilement... Je n'y ai pas touché, car trop lourd comme modification, et on peut s'en débrouiller sans mal, mais pour l'avenir...

autre aspect noté : tu fais un traitement texte de valeurs booléennes, il faut s'habituer à apprécier les types de données exactement pour leur assurer le traitement le plus adéquat. Cela s'est révélé sans conséquence : Excel a bien pris en compte des valeurs booléennes dans les cellules de ton tableau.

Pour en terminer avec la feuille, j'ai introduit un nom : QuaiDt qui nomme la colonne Date du tableau à partir de A7, en dynamique (formule qui fait que le nom s'adapte aux lignes utilisées, à voir dans le gestionnaire de noms).

En ce qui nous concerne, l'intérêt du nom, est que cette plage nommée est identifiable en tant que telle et sans ambiguïté partout dans le code. On sait à tout moment son nombre de lignes, donc le nombre de lignes du tableau, à partir d'elle on adresse n'importe quel point du tableau (on s'affranchit de toute référence à la feuille), dès lors qu'on l'utilise la ligne 7 de la feuille devient la ligne 1 de la plage, lorsqu'on ajoute un enregistrement on le place ligne nbdelignes+1 de la plage. C'est donc une grande simplification qu'elle apporte...

Passons au Userform :

1) J'ai renommé tous les contrôles : chbOK1 à 5 pour les CheckBox, les remettre dans l'ordre avec un numéro permet d'utiliser une boucle... chbIntervention pour la CheckBox dédiée, cbValid et cbModif (on identifie immédiatement...) txtD, txtH, txtI, txtE, pour les TextBox je n'ai pas opté pour un numéro d'ordre car on aura à convertir la date à la sortie, à mettre au format date et heure à l'entrée (n'en restait que deux donc...) cbxModif pour la ComboBox, et j'ai ajouté une étiquette lbModif, portant la mention Modification. Cette étiquette est non visible à l'ouverture, elle devient visible si on sélectionne un item à modifier dans la Combo, ce qui indique à l'utilisateur qu'il est en train de modifier un enregistrement existant et non d'en créer un nouveau...

2) Positionnement des procédures dans le module : j'applique la règle qui consiste à laisser VBA les placer, et il place les procédures évènementielles en ordre alphabétique, on s'y retrouve mieux à mon sens et l'on a toujours la liste déroulante pour accéder directement à un proc. Pour ce qui est des procédures hors évènements des contrôles, ajoutées, elles sont placées en tête de module (à la suite des déclarations lorsqu'il y en a) dans la zone dite "(Général)" (zone où il est prévu de les placer, lorsqu'on s'y trouve positionné, la liste déroulante de droite les affiche...)

3) Proc. Initialize : elle se substitue à l'Activate antérieure... La différence entre les deux est que Initialize se déclenche au chargement du Userform avant ouverture et une seule fois, Activate vient ensuite lors de l'ouverture mais se déclechera à chaque réaffichage du Userform (lorsqu'on le masque puis qu'on le réaffiche). N'usant pas de telle méthode, Initialize était logique.

Que fait-elle ? Elle met au format la date et l'heure affectées aux TextBox. Et elle doit alimenter la Combo, ce qu'elle fait en concaténant dans un tableau la date (col. A) suivie de " - Equ. " et du numéro d'équipe (col. D), tableau qui est affecté à la Combo (par la propriété List)

Ainsi, l'utilisateur peut soit saisir les éléments d'un ajout, soit opérer une sélection dans la Combo pour modification... Cependant, il peut se raviser après une sélection et l'effacer pour revenir à la saisie. Il fallait donc prévoir une procédure de réinitialisation, la proc. Init va donc servir les TextBox date et heure, effacer les autres, mettre les CheckBox à False et masquer l'étiquette Modification.

En conséquence, la proc. Initialize lance cette procédure, qui en fera un peu plus que nécessaireà l'ouverture, mais pas trop, et n'opère en propre que la constitution de la liste de la Combo.

4) La proc. Combo (cbxModif_Change) : si sélection, elle affecte les valeurs de la ligne (ListIndex+1) sélectionnée aux TextBox et CheckBox, et rend visible l'étiquette Modif. Si effacée, elle lance Init (retour au mode saisie).

5) La validation : elle résulte d'un appui sur le bouton Validation ou le bouton modifier. Chaque proc. bouton va tester si l'étiquette Modif est visible, si elle l'est Validation s'interrompra (et modifier se poursuivra), l'inverse si elle ne l'est pas.

Chaque bouton, si c'est à lui qu'il revient de valider, va déterminer le numéro de ligne : Validation par [QuaiDt].Rows.Count+1 et modifier par cbxModif.ListIndex+1. L'un ou l'autre lance alors une procédure Enreg en lui passant le numéro de ligne.

Enreg va servir un tableau de 21 éléments (il faut tenir compte des cellules fusionnées !).

Elément 1 la date : valeur de la TextBox convertie en date par la fonction DateValue (en effet la date est sous une forme littérale correspondant au format de date long des paramètres régionaux FR, l'utilisation de DateValue conduira VBA à se référer à ces paramètres pour identifier la date et la fonction renverra alors une valeur Date.

Eléments 2 à 4 : les valeurs des TextBox (pas de conversion à faire...)

Eléments 5, 9, 13, 17, 21 (boucle !) : les valeurs des CheckBox (booléennes).

Le tableau est affecté en une fois à la ligne. La cellule en A est mise au format de date requis.

La proc. lance une procédure Messages à la suite (il paraissait plus clair pour une meilleure supervision, et éventuellement pouvoir plus facilement modifier les modalités d'émission de ces messages, de dissocier Enregistrement et Messages). Voir le détail de la procédure pour ce qui est de la façon de la coder...

A la suite, Enreg fermera le Userform.

6) La proc. Intervention : je n'y ai pas touché, sauf à mettre à jour les noms des TextBox utilisés dans la procédure.

Problème (il me semble) : je n'ai pas perçu les modalités précises d'utilisation du tableau, ni s'il était destiné à couvrir une longue période. Logiquement, l'intervention en modification ne devrait pas revenir en arrière, ou trop en arrière... or on charge dans la Combo tout le tableau ! Il y aura donc peut-être inadéquation de la liste avec les éléments susceptibles d'être modifiés...

Il faudra dans ce cas revoir l'alimentation de la Combo avec des spécifications plus précises, de même que la définition de la ligne (le reste ne devrait pas bouger) : recherche à voir selon l'extension souhaitée de la liste (NB- je ne préconise pas Find !)

Cordialement.

Bonjour Mferrand,

à réception du mail qui m'indiquait une réponse sur le forum, j'ai foncé sur le forum pour lire la réponse....j'ai fait "waouhhh". Ca me semblait super long avant de me lancer dans le texte.

Et à la fin j'ai dit :"purée merci !" .

En toute franchise c'est clair, net et précis...de là à ce que j'arrive à tout refaire on y est pas encore mais au moins les conseils sont là et vous avez pris le temps pour m'expliquer les modifications à effectuer.

Je vais prendre le temps de relire cela lorsque j'attaquerais d'autres modifications.

Ce n'est pas très simple et évident de ce lancer dans VBA, on cafouille, on ose pas , on sait même pas trop par ou commencer.

Mon prochain fichier est bien plus compliqué.

En attendant un grand merci pour votre réponse, le temps accordé et la qualité de la réponse fournie.

MERCI et bonne journée

Bonjour

je viens de voir que j'avais un petit bug sur le fichier

Lorsque l'onglet OK DEM QUAI est vide (aucune saisie effectuée) je ne peux pas faire de première saisie

apres avoir tapé le mot de passe il met un message d'erreur

"erreur d'execution '424':

Objet requis"

en cliquant sur débogage il renvoit vers le module okdemquaijournalier et m'indique une erreur à la ligne

okdemquai.Show

en fait il n'arrive pas à charger les données qui doivent aller dans cbxModif de l'userform1 car l'onglet est vide de saisie.

comment puis je faire ?

merci

Bonjour,

Normal ! Dans ce cas la plage nommée n'existe plus...

Soit, le démarrage à vide ne se fait qu'une fois au démarrage, et on tape un caractère en A7 pour éviter l'erreur...

Soit le démarrage se fait régulièrement à vide (il semble que ce soit le cas), je vais regarder ça pour une petite modification qui le prenne en compte...

A+

Petites modifs à apporter :

1) Définition de la plage nommée : remplacer 7 par 6 et 6 par 5.

=DECALER('OK DEM QUAI'!$A$6;;;NBVAL('OK DEM QUAI'!$A:$A)-NBVAL('OK DEM QUAI'!$A$1:$A$5))

De cette façon on inclut l'en-tête, ce qui garantit que la plage ne cesse plus d'exister en étant vide.

Cela décale les données en ligne 2 de la plage, il convient d'en tenir compte...

2) Proc. Initialize :

Private Sub UserForm_Initialize()
    Dim Tbl(), i%
    Init
    With [QuaiDt]
        If .Rows.Count > 1 Then
            ReDim Tbl(2 To .Rows.Count)
            For i = 2 To .Rows.Count
                Tbl(i) = .Cells(i, 1).Text & " - Equ. " & .Cells(i, 4)
            Next i
        End If
    End With
    cbxModif.List = Tbl
End Sub

Au lieu de partir de 1 on part de 2 (on peut définir les indices du tableau comme on l'entend, en les définissant à partir de 2 on garde la correspondance lignes-indices, le tableau s'affecte de la même façon, avec le même résultat...)

On doit cependant tester s'il y a des données, soit si la plage contient plus d'une ligne...

3) Sélection dans la Combo :

Private Sub cbxModif_Change()
    Dim ln&, i%
    ln = cbxModif.ListIndex + 2
    If ln > 1 Then

On tient compte du décalage qu'on a introduit...

4) Répercussion sur la Modif :

Private Sub cbModif_Click()
    Dim ln&
    If Not lbModif.Visible Then Exit Sub
    ln = cbxModif.ListIndex + 2

Pas de répercussion sur les autres proc.

Cordialement.

bonjour

pas moyen de trouver la ligne ce matin je ne dois pas etre reveillé...

=DECALER('OK DEM QUAI'!$A$6;;;NBVAL('OK DEM QUAI'!$A:$A)-NBVAL('OK DEM QUAI'!$A$1:$A$5))

merci bcp pour la modif je vais chercher cette ligne

Bonjour,

La formule est dans le Gestionnaire de noms.

Bonjour MFerrand et bonjour à tout le monde

oh la tristesse...je n'arrive plus à rien.

Je n'ai pas réussi à trouver les lignes dont on parlait au dessus et en plus on me demande une modif mais je ne vois pas comment m'y prendre.

Dans le Userform1 (celui qui s'affiche dans l'onglet OK DEM QUAI) j'ai ajouté une Combobox afin de choisir le quai sur lequel le controle est fait.

j'ai ajouté la combobox et la liste qui doit apparaitre dans la combobox sur le Userform.

j'ai ajouté une colonne N° QUAi dans l'onglet OK DEM QUAI

Il faut que le résultat de la combobox s'affiche donc dans la colonne N° QUAI et toutes les réponses des cases à cocher soit décalées de 1, (ce qui correspond à la colonne insérée)

pourriez vous m'aider svp

merci

Tu n'avais pas fait les modifs du 01/04 7h47 ! Alors quand j'ajoute les décalages que tu as introduit sur une situation pas à jour...

Je pense que c'est réajusté.

NB- la liste des quais est nommée...

Salut grand chef

merci bcp je viens de mettre le fichier en place

par contre si j'enleve ma ligne exemple cela n'est pas ok/.

merci bcp pour ton aide en tout cas.

je le mets en place en attendant la validation de tout le monde

merci

par contre si j'enleve ma ligne exemple cela n'est pas ok/.

Rechercher des sujets similaires à "probleme ajout bouton modifier"