Correction Formule VBA

Bonjour,

Depuis longtemps lecteur de ce forum, je vous remercie déjà pour les centaines de fois ou vous m'avez aider sans le savoir

Complètement novice en VBA j'ai commencer une BDD modifiable à l'aide d'un formulaire que je suis sur le point de terminer.

Mais comme vous vous en doutez si vous lisez ce message c'est que je bloque. Pour cela je sollicite votre aide.

Je ne comprend pas pourquoi seule ma TextBox3 est pris en compte sur ce bouton modifier

Merci de votre attention

Private Sub CommandButton1_Click()
If Label55.Caption <> "" Then
Cells(Label55.Caption, 1).Value = UserForm2.TextBox3.Value
Cells(Label55.Caption, 2).Value = UserForm2.TextBox4.Value
Cells(Label55.Caption, 4).Value = UserForm2.TextBox1.Value
Cells(Label55.Caption, 5).Value = UserForm2.TextBox33.Value
Cells(Label55.Caption, 6).Value = UserForm2.TextBox5.Value
Cells(Label55.Caption, 7).Value = UserForm2.TextBox6.Value
Cells(Label55.Caption, 8).Value = UserForm2.TextBox7.Value
Cells(Label55.Caption, 9).Value = UserForm2.TextBox8.Value
Cells(Label55.Caption, 10).Value = UserForm2.TextBox9.Value
Cells(Label55.Caption, 11).Value = UserForm2.TextBox10.Value
Cells(Label55.Caption, 12).Value = UserForm2.TextBox11.Value
Cells(Label55.Caption, 13).Value = UserForm2.TextBox12.Value
Cells(Label55.Caption, 14).Value = UserForm2.TextBox31.Value
Cells(Label55.Caption, 15).Value = UserForm2.TextBox13.Value
Cells(Label55.Caption, 16).Value = UserForm2.TextBox14.Value
Cells(Label55.Caption, 17).Value = UserForm2.TextBox15.Value
Cells(Label55.Caption, 19).Value = UserForm2.TextBox16.Value
Cells(Label55.Caption, 21).Value = UserForm2.TextBox17.Value
Cells(Label55.Caption, 23).Value = UserForm2.TextBox18.Value
Cells(Label55.Caption, 25).Value = UserForm2.TextBox19.Value
Cells(Label55.Caption, 27).Value = UserForm2.TextBox20.Value
Cells(Label55.Caption, 29).Value = UserForm2.TextBox21.Value
Cells(Label55.Caption, 31).Value = UserForm2.TextBox22.Value
Cells(Label55.Caption, 33).Value = UserForm2.TextBox23.Value
Cells(Label55.Caption, 35).Value = UserForm2.TextBox24.Value
Cells(Label55.Caption, 37).Value = UserForm2.TextBox25.Value
Cells(Label55.Caption, 39).Value = UserForm2.TextBox26.Value
Cells(Label55.Caption, 41).Value = UserForm2.TextBox27.Value
Cells(Label55.Caption, 43).Value = UserForm2.TextBox28.Value
Cells(Label55.Caption, 44).Value = UserForm2.TextBox29.Value
Cells(Label55.Caption, 20).Value = UserForm2.TextBox30.Value
Cells(Label55.Caption, 22).Value = UserForm2.TextBox34.Value
Cells(Label55.Caption, 24).Value = UserForm2.TextBox35.Value
Cells(Label55.Caption, 26).Value = UserForm2.TextBox36.Value
Cells(Label55.Caption, 28).Value = UserForm2.TextBox37.Value
Cells(Label55.Caption, 30).Value = UserForm2.TextBox38.Value
UserForm2.ComboBox1.Value = ""
UserForm2.Label55.Caption = ""
Else
MsgBox "Veuillez renseigner le champ recherche"
End If
End Sub

Bonsoir,

Parce que c'est la seule remplie !

Comment veux-tu qu'on sache, le code ne dit pas tout !

Par contre, il montre que tu n'as pas vraiment choisi les bons exemples pour t'aider !

Tu fais le max pour qu'il s'exécute au ralenti.

On note :

Cells tout seul, non qualifiée, appartient pourtant à une feuille dont la mention n'est pas inutile,

un numéro de ligne en libellé d'étiquette (un peu tordu !) et même pas mis dans une variable,

répétition inutile de Userform2 (pour remplir !)

énumération qu'il est inconcevable de ne pas réduire à 3 lignes par une boucle !

et code non indenté.

Il conviendrait de repartir des conseils et préconisations de base pour écrire du code qui se tienne, soit parfaitement lisible et dont l'exécution soit optimisée.

Cordialement.

Merci pour ces informations.

J'aurais aimer un petit indice pour la direction à suivre mais j'ai bien compris que mon code était pourri et qu'il fallait tout reprendre depuis le début.

Au moin je ne vais pas chercher l'erreur dans ce code mais tout effacer et reprendre depuis le début.

Merci à toi d'avoir passer du temps sur ce message.

J'aurais aimer un petit indice pour la direction à suivre mais j'ai bien compris que mon code était pourri et qu'il fallait tout reprendre depuis le début.

Tu interprètes à tort !

J'ai dit que le code était mal écrit et peu optimal, pas "pourri" ! "Pourri", il n'aurait aucune chance de fonctionner, ce n'est pas du tout la même chose.

Et cette critique est de deux ordres distincts : le "peu optimal" est ce qui ne favorise pas une exécution rapide. Le "mal écrit" tient pour partie de la mise en forme pure, quand il s'agit d'une présentation ne favorisant pas une lecture rapide (ça pénalise l'intervenant sur le code, mais ça ne fait ni chaud ni froid à VBA...!), et pour partie des deux, lorsque cela allonge le volume de code écrit avec un code qui de plus ne répond pas à des critères d'optimisation.

J'ai en outre commencé par dire :

Comment veux-tu qu'on sache, le code ne dit pas tout !

Ce que tu aurais dû interpréter comme : le code tel qu'il est devrait tout de même fonctionner. Le dysfonctionnement ne provient pas du code, on ne peut donc en rechercher la source qu'en examinant dans le classeur le contexte dans lequel il est appelé à s'exécuter.

Les approximations du code pourraient être en cause si la proc. d'affectation des valeurs des TextBox n'avait strictement aucun effet ou déclenchait une erreur. Dès lors que tu dis qu'elle se déroule pour une TextBox et non pour celles qui suivent, on ne peut plus faire d'hypothèses plausibles, il faut regarder ce qui se passe alors dans le classeur.

Cordialement.

Voici donc le fichier

Attention ça va piquer les yeux !!

A base de multiple tuto. Et pas à pas pour l'ultra novice que je suis.

Si y'a moyen de ne pas seulement corriger ou faire fonctionner le bouton "valider modification".

Une explication jointe pour mon apprentissage personnel serais sympathique.

J'ai presque honte de vous montrer mes codes.

Bon !!! Mon problème est que ton Userform ne s'affiche pas en entier sur mon écran ! Pas très grave en soi, sauf que les boutons sont hors écran ! J'ai pu faire en sorte de pouvoir vérifier tout de même quelques trucs...

Il y a certes beaucoup de choses à revoir ! Et ça va pas se faire d'un seul coup ! Mais commençons par l'urgence :

Un tableau Excel doit être toujours laissé à la taille des données qu'il contient. Tu supprimes donc la ligne vide et tu détruis les formules de cette ligne. Lorsque tu ajouteras une ligne de données, elle sera automatiquement intégrée dans le tableau et les formules s'étendront...

(Je laisse de côté le problème de la première ligne pour l'instant. Ne pas avoir de lignes vides dans le bas du tableau stabilise sa taille à la taille des données...)

Tu effaces la propriété RowSource de ComboBox1.

Et tu substitues ceci :

Private Sub UserForm_Initialize()
    ComboBox1.List = Worksheets("Adhérents").Range("C12:C" & [Tableau1].Rows.Count + 10).Value
End Sub

Ce n'est pas un modèle de codage , mais c'est au moins une rustine pour régler ton dysfonctionnement immédiat.

Explication : La propriété RowSource est très bien adaptée lorsque tu ne modifies pas la liste au cours de l'opération, car un lien demeure entre la plage de donnée et la liste. En modifiant, tu ne touches certes pas à la colonne C mais celle-ci contenant une formule s'en trouve néammoins affectée, d'où un effet en retour sur la Combo qui bloque la suite...

Il convient en pareil cas de définir la liste soit par la méthode AddItem soit par la propriété List.

On la définit donc avec List par les valeurs de la plage (on lui envoie un tableau des valeurs de la plage) définie comme tu l'avais fait initialement à partir de C12, mais dimensionnée pour s'ajuster aux données. Pour dimensionner, on utilise le nom du Tableau, inséré automatiquement par Excel, pour en récupérer le nombre de lignes, en compensant le fait qu'il commence ligne 11 pour établir la ligne de fin des données. (ce sera à revoir par la suite...)

En attendant cela devrait régler ton problème immédiat.

Cordialement.

Je pouvais chercher encore un moment car j'étais loin de croire ce problème sur cette partie du code.

Effectivement tout fonctionne et je t'en remercie. Et je pense avoir compris après une bonne dizaine de relecture du code.

J'avais pourtant lu cette formule à plusieurs reprise sur le net mais j'ai jamais réussi à l'intégrer correctement.

Quand j'aurais fini mon tableau, je reviendrai pour avoir quelques conseils pour simplifier le code et promis j'essai de réduire la taille de mon formulaire

Je vois très bien que mon code n'est pas des plus délicat mais pour une première en vba et en autodidacte il y a comme une autosatisfaction lorsqu'on appui sur un bouton et que tous ce passe correctement

Je reviendrai donc rapidement sur ce forum.

Merci MFerrand

Bonjour,

Suite à dernière discussion : un petit remodelage de ton fichier :

  • Arrangement du tableau (suppression des deux premières lignes parasites, renvoi colonne Nom/Prénom (calculé) en dernière colonne du tableau, suppression colonne réf)
  • Suppression userform1, pour fusionner toutes les fonctions dans le même Userform (le 2 que j'ai rebaptisé 1 !)
  • Ajout d'un bouton Supprimer, renommage des contrôles : entre autres les TextBox sont renommés "tbA" suivi d'un numéro d'ordre correspondant au numéro de colonne du Tableau
  • Suppression de la procédure Initialize (initialisation opérée à partir de la procédure appelante)
  • Les deux boutons de la feuille ont été renommés et appellent la même procédure, laquelle détermine le bouton appelant, donc s'il s'agit d'un ajout ou d'une recherche-modification-suppression : les valeurs par défaut des contrôles étant établies pour ce dernier cas, dans ce cas elle initialise la liste de la ComboBox (cbxRech). Dans le cas Ajout, elle procède à quelques aménagements avant ouverture : l'intitulé du Userform ("Fichier adhérents : recherche et modifications" [NB: n'existait pas antérieurement]) est modifié en "Saisie nouvel adhérent", l'étiquette portant l'intitulé "Recherche" (lbRech) voit ce dernier modifié en ""Nouvel adhérent", sa couleur de fond est alignée sur la couleur de l'étiquette "Fiche adhérent" de façon à mieux attirer l'attention, la Combo de recherche (cbxRech) est masquée, le bouton Supprimer est masqué, et une variable publique lgn se voit affecter un numéro correspondant au nombre de lignes existantes du Tableau +1 (soit la ligne relative dans le Tableau d'enregistrement du nouvel adhérent saisi).
  • Les procédures associées aux boutons du Userform (dont certaines manquaient) détermineront si nécessaire si on se trouve dans le cas Ajout ou Modif par la propriété Visible de la Combo de recherche...
  • Le bouton Quitter décharge simplement l'Userform (dans tous les cas).
  • Le bouton Annuler efface l'ensemble des saisies dans les TextBox (cas Ajout) ou efface la sélection dans la Combo (cas Modif), ce qui déclenche l'effacement des TextBox... (Même résultat, mais le déclenchement est différent selon cas.)
  • Lors d'une sélection dans la Combo de recherche, la proc. associée affecte à la variable lgn la valeur de .ListIndex +1 (qui correspond donc à la ligne appelée dans le tableau. lgn aura donc toujours une valeur en cas Ajout (index dans Tableau première ligne vide, soit la ligne immédiatement au-dessous du Tableau existant) et en cas Modif si un adhérent est sélectionné (index ligne adhérent dans le Tableau) [si pas de sélection, valeur 0].
  • Le bouton Valider n'a plus alors à se préoccuper du cas pour affecter les valeurs nouvelles ou modifiées : si lgn >0, on affecte sur la ligne indiquée. Il s'en préoccupe pour l'effacement des TextBox (comme le bouton Annuler), afin de repasser à la main à l'utilisateur pour une nouvelle opération.
  • Comme il n'est pas de situation on l'on ne puisse faire des boucles pour éviter de fastidieuses énumérations... voici la particularité de celle utilisée ici : on parcourt en boucle tous les contrôles du Userform pour ne s'arrêter qu'à ceux dont le nom commence par tbA, dont on récupère alors le numéro d'ordre qui suit, lequel indique la colonne d'affectation dans le Tableau.

Je n'ai pas testé, et je n'ai pas le temps de le faire, j'espère donc qu'il n'y a que peu d'erreurs...

Ce compactage a surtout valeur de démonstration : le code est nettement plus réduit que celui qui était en place antérieurement, qui était incomplet, d'autant plus qu'il remplace le code des deux Userform fusionnés.

Ceci dit cela ne règle pas tout problème ultérieur : il y a d'abord que tes données fictives sont loin d'être exactement du type qui sera le leur dans le fichier final. Cela obligera très problablement à quelques traitements particuliers, dates à convertir pour éviter une inversion possible moi/jour, nombre décimaux formatés également à convertir...

D'autre part, je ne pense pas que tu as choisi la meilleure voie avec un tableau immense comportant une grande quantité de colonnes vides actuellement... La nature de tes données aurait plaidée en faveur d'un découpage : fiche adhérent proprement dire (données de base), gestion formation, et gestion trésorerie. Je pense que trois traitements séparés auraient été plus efficaces, mais tu verras à l'usage...

Cordialement.

Rechercher des sujets similaires à "correction formule vba"