Userform - Problème de validation de saisie et ordre alpha

42acompte-test.zip (178.08 Ko)

Bonjour,

D'abord "Félicitations pour votre forum ! Il m'a beaucoup aidé"

Je suis novice en VBA, j'ai créé un formulaire qui me permet de faire des saisies très simples dans une feuille excel.

Vous pourrez constater dans le fichier joint que j'ai quelques problèmes de validation de données

Notamment sur le bouton Ajout ... si je complète l'ensemble des champs... aucun problème. Tout fonctionne

Si je ne complète que les quatre premiers champs txtNom txtFacture TxtDate1 txtAcompte1, là j'ai un problème

Erreur d'exécution 13 - Incompatibilité de type Le problème survient sur la txtDate2 et txtAcompte2 car ce sont des champs date et monétaire

J'ai évidemment un problème semblable si je modifie.

Un autre problème de saisie que je rencontre est que je voudrais ajouter l'obligation d'inscrire un chiffre négatif dans txtAcompte2

Et un dernier problème est que je veux afficher la cmbNom par ordre alpha

Je suis ouverte à toutes vos suggestions pour régler mes différents petits problèmes ainsi qu'a vos commentaires sur la manière de simplifier la saisie du formulaire

Merci beaucoup

Bonjour,

Nous aussi on a un problème :

A+

Le fichier est pourtant joint

Je le remet au cas ou

Merci

Unilien

41acompte-test.zip (178.08 Ko)

Bonjour,

Je mets un message, juste pour pouvoir suivre

Il y a certes un bon effort de programmation, mais de nombreuses choses que je considère comme des hérésies dans un code VBA qui se respecte :

  • un userform ouvert en non modal pour gérer des données,
  • l'utilisation de Activate ou Select,
  • l'utilisation conjointe excessive de ActiveCell,
  • l'absence de qualificateurs d'objet liée à ce type d'utilisation,
  • une Function à la place d'une Sub, utilisée comme Sub,
  • des déclarations de variables non placées en tête de procédure,
  • sans oublier le code non indenté !
et vu que je n'ai jeté qu'un simple regard circulaire, je suis sûr de ne pas être exhaustif.

A son énoncé, la nature de ton problème indique qu'il s'agit très certainement d'affectations effectuées sans contrôle préalable des données à affecter, toujours facile à régler : dans les cas où une erreur est possible lors de l'affectation, on n'affecte que si valeur du type qui convient à affecter, si vide on passe...

Je suis donc persuadé qu'en réécrivant correctement ton code (et en se posant les bonnes questions à chaque ligne) on n'aura plus d'erreurs à la fin, et on aura également éliminé d'autres erreurs potentielles...

Je repasserai donc selon selon les autres réponses que tu auras et si ma disponibilité le permet (car je n'interviendrai pas sur ton code sans le réécrire...)

Cordialement.

En fait, j'a besoin de ce petit formulaire Excel très rapidement et j'ai commencé à jeter un oeil sur le VBA via des formations sur Youtube le weekend dernier.

Je n'ai donc pas le vocabulaire nécessaire pour identifier tous les problèmes listés et je n'ai vu aucune aide sur les validation de saisie dans mes recherches

Donc je suis un peu coincée... d'après ce que je comprends mon formulaire est à jeter, je n'ai rien contre à condition qu'in me guide

Merci

Pas d'exégération !

Si je me suis assez longuement étendu dans mes critiques, c'est que ton formulaire est de plutôt bonne facture, que ton code (hormis les Select... et l'indentation ) est assez bien écrit avec des choix que certains ne sont pas en mesure de faire avec quelques années de pratique..., et mérite qu'on s'y intéresse.

Il y a je pense un petit problème de conception : tu gères des acomptes, dont des bénéficiaires occupent plusieurs lignes, et dont par ailleurs certains sont apurés. Il faudrait savoir pourquoi tu conserves les acomptes apurés... Un autre aspect est tu sélectionnes à partir d'un nom (lequel peut être répété), mais qui ne t'affiche qu'un seul seul acompte pour un bénéficiaire qui peut figurer plusieurs fois...

Cordialement.

Bonjour,

je vous explique un peu le fonctionnement... cela se passe dans un commerce au détail

Un client veut passer une commande sur laquelle il dépose un acompte (txtAcompte1) en date du (txtDate1)

Lorsque le client vient chercher la commande, nous créditons sa facture totale du montant de l'acompte initial... ce qui devient l'acompte 2 (textAcompte2) en date du (txtDate2)... dans un monde idéal, je n'aurais qu'à valider que le client est passé chercher sa commande en date du... et tout se ferait automatiquement ... mais laissons le code tel qu'il est

Un client peut passer plusieurs commandes d'où le fait qu'il peut apparaître plusieurs fois le même client

Par contre il n'y a qu'un numéro de facture par commande et celui-ci ne peut pas se répéter

L'information est saisie pour chaque jour d'affaires et la vérification avec le grand livre ne se fait qu'une fois par mois d'où l'importance de conserver toutes les transactions si le total ne balance pas avec le grand livre afin de valider d'ou provient l'erreur

Il est important d'épurer les données mais cela peut se faire manuellement en procédant à un tri pour le mois X avec ordre croissant des écarts et on supprime simplement les lignes à 0 une fois que tout a été vérifié avec le grand livre

Y a-t-il un moyen d'épurer par le formulaire ... c'est possible mais pour le moment il est plus urgent de donner un outil aux utilisateurs afin de pouvoir travailler et je n'ai pas les connaissances nécessaires pour me rendre là

Idéalement j'aimerais que le champ de recherche sur le nom soit le même que celui de saisie et idem pour le champ facture... je pense être en mesure de le faire moi-même mais ce qui me préoccupe actuellement c'est que ma saisie, AJOUT et MODIFICATION, ne fonctionne pas correctement et que je ne peux mettre le tri sur le combobox en ordre alpha... j'aurai donc le même problème en ordre croissant numérique

J'aimerais aussi que lorsque je sélectionne le client avec Allez-Y que je tombe sur la ligne du client sélectionné sur la feuille excel

Il y a beaucoup de j'aimerais mais pour l'instant je suis bloquée par ma saisie

Merci

Bonjour,

Malgré les indications "Client", le terme acompte me renvoyait spontanément à acompte sur salaire... ! Il s'agit d'une autre sorte d'acompte, et le champ unique est Facture. Je vais donc essayer de revoir sous un angle réadapté...

Je viens de terminer la recomposition d'un formulaire d'un autre genre... et je dois encore opérer une modification sur un programme dont j'assure la maintenance depuis au moins 7 ans, c'est une demande urgente et j'aurais mauvaise grâce à différer... tenant compte des nécessités de la vie courante, cela risque donc de n'être pas avant demain.

Bonne soirée.

Bonjour,

merci de bien vouloir m'aider ! J'ai travaillé toute la soirée hier et j'ai trouvé le moyen de trier le cboNom par ordre alpha, malheureusement ... le bouton Aller à ne fonctionnait plus avec ces nouveaux arrangements.

Je me rends donc compte que ce n'est pas si simple. J'ai donc effacer ce code et remis tel quel...

Il y a un autre problème dont je me suis rendue compte au niveau du champ calculé Écart qui n'est pas dans la saisie, si je supprime des lignes ou mme la totalité, cela vient affecter le nb de rang dans le Grand Livre voire même effacer la référence à A2 dans les formules si on supprime toutes les lignes pour recommencer.

C'est donc ce genre de problème de conception auquel je peux faire face. Je voudrais que les usagers puissent autant travailler du formulaire que de la feuille excel car certains usagers sont plus habiles avec le chiffrier et d'autres pas du tout. Je mettrais évidemment une protection sur les feuilles. Si la feuille est protégée et qu'ils veulent épurer, ils ne peuvent pas supprimer le champ calculé écart ce qui laisse des enregistrements vides dans le chiffrier...

Bref, il y a certainement un moyen de contourner cela mais hélas... je ne le connais pas

Je vous renvoie la dernière version de mon fichier sur lequel j'ai travaillé

Merci

53acompte-test2.zip (183.29 Ko)

Je vais essayer de résumer ce qu'il me semble comprendre de tes explications :

1) Un enregistrement concerne une commande. Lorsqu'une commande donnant lieu à un acompte est saisie, on sert les champs : Nom, Facture, Date1, Acompte1. Cette opération conduit à Ajouter un enregistrement.

2) Ce qu'il y a à déduire de cela, c'est que le champ primaire est par définition Facture. Si la recherche peut sans doute se faire plus facilement sur le Nom, il convient alors qu'elle soit couplée sur les champs Nom-Facture.

Si on procède ainsi, il y intérêt à trier le tableau par Nom (clé 1) et Facture (clé 2).

3) La commande est servie, on la recherche, et on sert le champ Date2, ainsi que le champ Acompte2 (mais celui-ci présente un automatisme naturel, qui implique qu'on n'ait pas à saisir manuellement). Cette opération consiste à Modifier l'enregistrement.

4) Jusque là, on est dans un système de saisie dont la simplicité est patente, on pourrait même parler de simplisme. Je ne sais si le traitement ultérieur nécessite d'autres éléments, mais elle me paraît gérable dans des conditions normales :

  • on n'y touche pas manuellement ! les opérations se font par l'intermédiaire du Userform,
  • la ComboBox suffit pour opérer la recherche : le bouton Aller n'a pas d'intérêt,
  • un bouton est par contre nécessaire pour effacer éventuellement les TextBox afin de passer à un ajout : c'est le bouton Effacer, mais le mettre au niveau des boutons de validation des opérations de gestion peut conduire à des erreurs...
  • nous avons 3 boutons de gestion : Ajouter, Modifier dont le rôle est bien défini (et structurel si j'ai suivi ton exposé), Supprimer dont le rôle est légitime (je dirai aux fins de rectification toujours par rapport à ton exposé)
  • la gestion est complètement assurée, hors ce que tu as appellé vérification du GL qui doit donc conduire à une épuration périodique... là je suis un peu dans le flou, mais c'est nécessairement une opération distincte de la gestion journalière de la base de données,
  • le système de navigation du formulaire me paraît donc inutile, et inadéquat dans la mesure où l'on n'a pas à naviguer dans la base, cela n'apporte rien et c'est même à déconseiller.

5) Pas de problème pour concevoir l'ensemble des procédures de gestion journalière effectuées au moyen du formulaire :

  • Appel form. et initialisation à partir d'une base triée : alimentation de la Combo de recherche sur deux colonnes, ou une liste concaténant les deux colonnes intéressées.
  • L'index de sélection dans la liste étant en correspondance avec la base triée, le prélèvement direct des données est rapide et on peut en changer aussi avec effet immédiat.
  • On dispose de cet index au moment de répercuter une modification, donc pas de problème d'affectation.
  • L'ajout se fait sur la ligne qui suit... pas de problème d'affectation (on connait à tout moment le nombre d'éléments de la base).
  • Affectations utilisant le tableau et non la feuille. En cas d'ajout retri immédiat et recomposition de la liste (id pour suppression).
Je crois qu'une fois un tel dispositif en place tes problèmes d'ordre alpha ou autres n'existeront plus...

Je ne comprends pas bien ta feuille GrandLivre : la raison pour laquelle on double le calcul avec un "résultat sur tri" (qui me semble plutôt être un calcul sur base filtrée), ni le type de formules utilisées (ne tenant pas compte que tu te sers d'un tableau structuré).

Si ce en quoi consiste la vérification est bien défini, et ce qu'elle implique au niveau de la base est également défini, cela devrait conduire à une épuration automatique, consécutive à la vérification...

Cordialement.

Bonjour,

merci de prendre tout ce temps

tu as assez bien saisi la problématique... et je trouve que tes suggestions sont bonnes

Pour ce qui est du grand livre c'est que... . nous obtenons le chiffre au Grand Livre une fois par mois

Exemple au 30 novembre, c'est le chiffre négatif qui persiste au grand livre à cette date disons -5 236 $

Si je fais le tri de tous les enregistrements avant le 30 novembre, je devrais retrouver une variation de 0 $ avec ce chiffre sinon c'est qu'il y a eu erreur dans la saisie des enregistrements

Une fois que le tout a été validé à une date précise, on peut épurer les enregistrements dont l'écart est à 0 à cette date

On n'aurait peut-être pas dû appeler cela écart ... variation conviendrait peut-être mieux pour ne pas confondre avec l'écart des Acomptes

Je ne voyais pas l'utilité de créer un mode de gestion pour cela car je pensais le faire par la feuille excel tout simplement

J'avoue que je n'ai aucune idée comment cela pourrait se gérer via le formulaire

Merci

Je crois que la vérification-épuration est à traiter hors du formulaire (sauf intervention pour rectifier des erreurs). On en reparle, car il y a sûrement quelque chose à faire si des erreurs sont à rechercher... Puis la procédure à mettre en oeuvre une fois la balance établie.

Mais... demai ! Je me couche souvent tard ou plutôt tôt le matin, mais je ne travaille pas jusqu'à ce terme, et j'ai un peu d'avance (UTC+4h).

Bonne nuit.

J'ai omis un détail "de taille" les utilisateurs ont versions 2003 et 2007 de Excel

Merci

En effet... ! Ça répond à une de mes interrogations sur les références structurées, les fonctionnalités de Tableau ne sont pas présentes sous 2003. De même que le nom livré par Excel sous 2007 n'y sera pas... On va donc y pallier en doublant par une plage nommé...

Par la même occasion précise-moi ta localisation géographique ! Ce qui m'intéresse (pour le sujet) ce sont les paramètres régionaux Windows, qui ont leur importance notamment pour les dates.

Et je te demanderais volontiers aussi comment tu obtiens ces info-bulles d'informations sur la feuille, un truc que je ne sais pas faire !

Sinon je crois que je commence à comprendre le défaut "conceptuel" de ta méthode : tu penses qu'il faut continuer à travailler avec Excel en utilisant VBA, je veux dire être dans le classeur, dans les feuilles, dans le tableau... Alors que la bonne utilisation de VBA c'est de travailler en VBA avec les données Excel : on emprunte les données, on travaille avec et on les rend à Excel à la fin, ce qui évite par ailleurs nombre de soucis... Je t'illustre ça dès que possible.

Cordialement.

Bonjour,

je suis au Québec, Canada d'où l'utilisation des $ canadien français exemple 22.00 $ et de la date sous la forme jj-mmm-aa

pour les info-bulles, c'est dans Validation des Données sous Données

Pour la conception ... peut-être que ça me rassure de voir le chiffrier se compléter en même temps

Mais il y a aussi le fait que les usagers ont actuellement un chiffrier excel duquel je dois migrer les données , je le fais avec un simple copier-coller mais il y a beaucoup de problèmes de doublons et de format de date justement

Merci

pour les info-bulles, c'est dans Validation des Données sous Données

Bon sang ! C'était trop simple !

As-tu une objection pour que les formats dans les TextBox soient alignés sur ceux du Tableau ?

Qu'est-ce que tu appelles chiffrier ? (ça ne fait pas partie de mes notions de base).

Le séparateur décimal pour toi est la virgule ou le point ?

Bonjour,

c'est justement ce que je veux que les formats soient alignés avec ceux de la feuille

J'utilise la virgule

Un chiffrier pour moi c'est une feuille excel... désolé pour l'expression

Merci

Merci pour le chiffrier ! Les expressions québécoises sont toujours intéressantes !

Je ne sais où tu as pris vbEmptyString, mais je ne trouve ça nulle part parmi les constantes VBA !?

Il est un peu tard pour tester mais je peux dire quelques mots sur l'économie du système (je n'aurais pas à répéter ensuite).

Tenant compte que le fichier est utilisé concurremment sur Excel 2003 et des versions plus récentes, je n'utilise pas le nom de Tableau inséré automatiquement par Excel que j'ai doublé par un nom (BAcpt) défini par la formule :

=DECALER(Acomptes!$A$2;;;NBVAL(Acomptes!$A:$A)-1)

Nom qui suivra automatiquement les variations de taille de ta base de données.

Une seule colonne est nommée, la première, c'est suffisant pour tout adressage, et cela fournit directement le nombre d'enregistrement.

Au lancement du formulaire, l'initialisation est basculée sur la procédure Userform_Activate.

Différence avec Initialize : Initialize s'exécute une fois (une seule) au chargement du formulaire, Activate s'exécute à chaque affichage ou réaffichage du formulaire. En le masquant à chaque opération (ajout, modif., suppression) une réinitialisation sera opérée lors du réaffichage.

L'initialisation consiste à :

  • Trier la base sur les champs Nom et Facture.
  • Affecter ces deux premières colonnes à un tableau.
  • Affecter ce tableau comme liste à cboNom (qui aura donc 2 colonnes)
  • Et te mettre la date dans le coin... !

Lors d'une sélection dans la Combo :

on récupère le ListIndex+1, valeur qui correspond au numéro de ligne dans la plage nommée, et il ne reste qu'à récupérer dans une boucle les valeurs des champs de cette ligne pour les affecter aux Textbox...

Parenthèse sur les boucles : c'est une bonne pratique de renommer ses contrôles, mais si on les renomme de façon à pouvoir les utiliser dans des boucles, c'est mieux ! (moins d'écriture, et généralement plus rapide). Vu le nombre réduit, j'ai conservé tes noms, mais comme rien ne saurait m'empêcher de faire des boucles j'en ai donc fait une (ici et ailleurs) en utilisant un tableau auxiliaire des parties variables des noms des TextBox...

Si lors d'un changement, le ListIndex de cboNom est à -1 (pas de sélection), une procédure d'effacement des TextBox est lancée.

La même proc. est également lancée par le bouton Effacer.

La proc. teste la valeur du ListIndex, le met à -1 s'il ne l'est, et efface les TextBox s'il l'est.

Saisie : Contrôle de saisie dans les TextBox :

  • Facture : qu'une valeur numérique est saisie (si c'est le cas, élimination automatique des 0 éventuels devant).
  • Date1 : mise au format s'il s'agit d'une date...
  • Acompte1 : mise au format s'il s'agit d'un montant...
  • Date2 : vérification que Date1 et Acompte1 sont servis, sinon effacement ; mise au format si date et affectation à Acompte2 de la valeur d'Acompte1 en négatif.
NB- Acompte2 ne peut être saisi manuellement.

Ces contrôles assurent que l'on a une donnée valide si saisie (donc la vérification ultérieurement n'a plus à porter que sur la présence d'une valeur).

Ajout : si un enregistrement est sélectionné dans la Combo, on n'est pas en ajout, donc bouton inopérant (interruption).

On récupère le numéro de facture et on teste si celui-ci existe déjà dans la base : interruption si c'est le cas.

On calcule la ligne d'affectation dans la plage nommée (nb de lignes +1).

On vérifie que la saisie est conforme, au moyen d'un fonction vérifiant que les 4 premiers TextBox contiennent une valeur (indispensable pour qu'un enregistrement soit valide) et renvoyant True ou False.

Si on peut valider : on masque le formulaire (Hide) ; on lance une proc. de mise à jour en lui passant le numéro de ligne.

Cette proc. récupère les valeurs des TextBox dans un tableau, en convertissant en date les valeurs dates et en nombres les montants, puis affecte ce tableau à la ligne indiquée. La même procédure sera lancée pour une modification...

Confirmation de l'ajout et réaffichage du formulaire.

Modification : à l'inverse de l'ajout, si aucun enregistrement n'est sélectionné dans la Combo, interruption...

Le numéro de ligne est fourni par ListIndex +1. Vérification de la saisie (comme ajout), puis confirmation demandée à l'utilisateur.

Si OK, suite comme ajout.

Suppression : interruption si aucun enregistrement sélectionné dans la Combo.

Suite comme modification, sauf qu'on ne vérifie pas la saisie, et qu'on supprime la ligne au lieu de lancer une inscription.

Il me reste à tester que tout ça fonctionne sans heurt... avant de te le repasser et voir la suite.

Cordialement.

Mon dieu !

Tout ce travail

J'ai bien hâte de voir !

J'ai fait une petite erreur... c'est le point qui est utilisé pour les dollars et l'espace pour les milliers exemple: 1 234.56 $

Merci

Bonjour,

Mauvaise nouvelle ! J'en étais à la dernière touche avant de t'envoyer le fichier... mise au point pour l'ouverture dans différentes versions :

- introduction de la mise en place de la formule en G si on est dans une version antérieure à 2007...

Testé sur Excel 2000, ça fonctionnait.

Mais problème au retour, les lignes ajoutées sous 2000 ne sont pas intégrées dans le Tableau. J'en étais donc à la mise en place d'une proc. à l'ouverture pour tester la dimension du tableau par rapport à la plage de données et l'étendre éventuellement lorsque mon Excel 2000 a planté et rendu le fichier irrécupérable.

N'en ayant pas de copie et ne trouvant aucune sauvegarde auto de ce fichier, je vais devoir repartir à 0. Ce qui va prendre un peu de temps. Désolé pour ce contretemps.

Cordialement.

Rechercher des sujets similaires à "userform probleme validation saisie ordre alpha"