Boutons inactifs : SUPPRIMER, RECHERCHE, MODIFIER, RECULER, AVANCER

Salut à tous,

En tant que débutant en Vba / [Excel 2016, à l’aide des tutos sur internet, j"ai réussi à élaborer un Userform pour établir des statistiques de fréquentation.

Mais au fur et à mesure des adaptations des tutos, malgré des multiples tentatives, je n’arrivent plus à faire fonctionner les boutons SUPPRIMER, RECHERCHE, MODIFIER, RECULER et AVANCER.

Merci d’avance pour l’aide,

Ci-joint mon fichier : TESTrod.xlsm (30,8 Ko)

Bonjour
Beaucoup de correction pour faire fonctionner l’ensemble
Pour la saisie afin d’homogénéiser les données de l’onglet « DONNEES » et ceux de l’onglet « LISTE »
J’ai mis en place une interdiction de saisie manuelle des cellules de la colonne A à K sauf les colonnes A/G/H de la ligne 2 à 50
Les données sont à choisir dans des listes déroulantes en lien avec les colonnes de l’onglet « LISTE »
Pour une nouvelle donnée à mettre il faut enrichir cet onglet sur la bonne colonne
Ainsi il y a l’exact correspondance des données entre les 2 onglets
Il en va du bon fonctionnement du formulaire
Si l’on veut étendre au de la de la ligne 50 les listes déroulante il suffit de copier une ligne qui est dotée de ces listes et de faire un collage spéciale validation (Coller/Collage spécial et cocher Validation puis OK) sur les lignes de destination
Attention de ne pas opérer des copier/coller sur toutes ces lignes hors mis les colonnes A/G/H au risque de supprimer les listes déroulantes qu’il faudra ensuite remettre
Faire uniquement des Copier/Coller collage spécial valeur (même procédure que pour les listes déroulante mais au lieu de Validation côcher Valeur et OK)
Il sera prudent pour gérer une petite catastrophe d’avoir une copie de ce fichier

J’ai donc remis en route tous les boutons
Pour moi il fonctionne correctement
Je n’ai pas trouvé de bouton RECHERCHE exprimé ici :
« boutons SUPPRIMER, RECHERCHE, MODIFIER, RECULER et AVANCER. »
J’ai supposé que c’était le bouton « ENREGISTRER » existant et non cité
Ci-joint ton fichier opérationnel
Fais des essais et dis moi

TESTrod.xlsm (38,2 Ko)

Salut FFO,

Merci de m’être venu en aide. J’admire ton efficacité. Toutefois, parce que je n’ai pas été assez clair, il y a encore quelques choses à faire! Ainsi, je te précise l’objectif des boutons à problème.

En fait, à la place du bouton RECHERCHE, il s’agit du ComboBox1_Change() 'Liste déroulante RECHERCHE (par DATE en A) sur le Formulaire` qui pose toujours un problème (dans ton fichier, seule la date s’affiche. Or, je veux que ce soit toutes les informations!). L’idée est lorsqu’une date est choisie par déroulement, tout le formulaire est chargée des informations (récupérées pour certaines des onglets LISTE et d’autres de DONNEES) y relatives (Déplacement, Aéroport d’embarquement,… Motif du voyage, Mode d’hébergement).

Ensuite, lorsque le formulaire est chargée tel que précédemment indiqué, l’utilisateur peut :

  • MODIFIER les informations affichées (suite à la RECHERCHE par DATE) sur le formulaire (dans le cas par exemple d’une mise à jour d’une ligne). L’utilisateur doit être capable de corriger ou renseigner tout le formulaire (sans nécessairement intervenir sur les onglets DONNEES et LISTE) puis les enregistrer. Pas possible jusqu’à présent ;

  • SUPPRIMER toutes les informations affichées (suite à la RECHERCHE par DATE) sur le formulaire (ce qui correspond à la suppression de la ligne correspondante). L’utilisateur doit voir toutes les informations avant de les SUPPRIMER (pour l’instant, seule la date est visible (c’est mieux ainsi parce que plus tard, après avoir régler les problèmes actuelles, je vais continuer le projet de telle sorte que : le formulaire s’affichera en plein écran pour masquer Excel, l’utilisateur accédera aux onglets par mot de passe…) ;

  • RECULER ou AVANCER (à partir des informations affichées suite à la RECHERCHE par DATE) d’une ligne pour choisir les informations à retraiter (MODIFIER, SUPPRIMER ou ENREGISTRER). Cela se fait uniquement par date, mais comme dit plus haut, il est mieux de le faire avec toutes les informations.

Si besoin d’autres éclaircissements, ne pas hésiter.
Dans l’attente et merci beaucoup,

Bonjour

Après une mise en œuvre conséquente j’ai 2 propositions ci_jointe qui diffère par leur présentation dans le formulaire
Le combobox Recherche a été enrichi de l’ensemble des colonnes de l’onglet « DONNEES » donc considérablement élargie
Lorsque l’on fait un choix dans la liste seule la date de la colonne A remonte dans ce combobox
L’ensemble des données de la sélection pour la première proposition sont rassemblées dans un texbox "Résutat recherche en dessous de même envergure chaque donnée est précédée de sa nature (Déplacement : Départ par exemple) les données sont séparées par un tiret bas (_) et toutes sont les unes après les autres
Pour la deuxième proposition même fonctionnement pour la combobox de Recherche mais pour un choix effectué toutes les données par nature sont ramenées dans un textbox spéciphique avec le nom de la nature au dessus soit 11 textbox pour 11 données

Une fois le choix effectué les données récupérées toutes les actions peuvent être réalisée par les différents boutons
« Enregistrer »
Après avoir saisie l’ensemble des combobox ou Textbox (toutes doivent être effectuées) le bouton rajoute à la 1° ligne du bas onglet « DONNEES » toutes ces données saisies rafraichi la combobox de recherche sélectionne dans cette combobox la ligne créée raffraichit le ou les textbox des données
Tout est automatique

Modifier

Après avoir réaliser une sélection dans la liste de la combobox seule le ou les champs à modifier dans les combobox ou texbox appropriés doivent être saisie de la donnée souhaitée
Le bouton modifie dans l’onglet « DONNEES » la ligne et ses cellules concernées puis rafraichit la liste de la combobox et le ou les textbox concernées des nouvelles données
Tout est automatique

AVANCER/RECULER avance ou recule la sélection de la listebox de la combobox de recherche en actualisant au fur et à mesure le ou les textbox des données
AVANCER a une action jusqu’à la dernière sélection de la listebox
RECULER a une action jusqu’à la première ligne de la listebox

SUPPRIMER supprime la sélection effectuée dans la listebox de la combobox de recherche puis positionne la sélection sur la première ligne de la listebox en actualisant le ou les textbox des données des siennes

Encore une fois tout se fait de manière automatique

Pour loger tous ces supplément j’ai été contraint d’agrandir le userforme

Dans l’onglet « DONNEES » j’ai maintenu les listes déroulantes que j’ai mise pour une sécurité concernant l’homogénéité des données entre cet onglet et l’onglet « LISTE » une intervention manuelle dans un autre contexte pourrait être dommageable

Fais des essais et dis moi

TESTrod2.xlsm (44,6 Ko) TESTrod3.xlsm (46,0 Ko)

Salut,

Merci pour les avancées. Le 2e fichier TESTrod3 me va bien. C’est celui que j’ai testé!

OK : à l’ouverture, le formulaire s’affiche et est vide.

Problème : après avoir saisi et enregistré, les infos sont toujours présentes = le formulaire devrait être à nouveau vide.

Ok : pour les boutons avancer et reculer suite à la Recherche par Date.

Ok : pour le bouton supprimer suite à la Recherche par Date.

Problème : il me semble que le bouton modifier ne fonctionne pas. Proposition : et si tu le programmais suite à la Recherche par Date comme pour le cas des boutons avancer, reculer et supprimer ?

Ainsi, après avoir affiché les résultats en dessous (ligne), l’utilisateur a le choix entre cliquer sur avancer, reculer, supprimer ou modifier pour profiter de mettre à jour les résultats avant de les enregistrer dans DONNEES. Autrement dit, pour modifier, il faut d’abord Rechercher par Date.

Tels sont les résultats de mes essais,
Encore merci,

Donc si j ai bien compris tout fonctionne correctement conformément à tes attentes
Aucune amélioration à effectuer
Merci de confirmer

Problème 1 : après avoir saisi et enregistré , les infos sont toujours présentes = je veux que le formulaire soit à nouveau vide .

Problème 2 : le bouton modifier ne fonctionne pas. Proposition : et si tu le programmais suite à la Recherche par Date comme pour le cas des boutons avancer , reculer et supprimer ? Ainsi, après avoir affiché les résultats en dessous (ligne), l’utilisateur a le choix entre cliquer sur avancer , reculer , supprimer ou modifier pour profiter de mettre à jour les résultats avant de les enregistrer dans DONNEES. Autrement dit, pour modifier , il faut d’abord Rechercher par Date .

Telles sont les améliorations à effectuer,

C est moi meme intentionellement qui est inhibé les lignes de code qui vidaient le formulaire pour 2 raisons :

Faire apparaître dans les 11 texbox le résultat de la création
Permettre une nouvelle création avec un minimum de saisie juste à modifier les données différentes et conserver les similaires au lieu d avoir à tout ressaisir

Pour le bouton modifier il faut d’abord faire remonter une sélection puis saisir dans les combobox appropriées les données qui doivent être modifiées sans saisir celles qui ne le sont pas puis cliquer sur le bouton
Les données saisies sont changees dans l onglet « DONNEES » sur la ligne de la sélection dans les cellules concernées puis le traitement reactualise la listebox de la combobox1 de recherche et remet à jour les 11 textbox de toutes les données modifiées ou non
J ai fais plusieurs essais cela fonctionne nickel ainsi
Réessaie pour moi tout est OK

Bonjour

Je te propose cette nouvelle qui inclus un bouton supplémentaire de réinitialisation du formulaire
Ainsi dans toutes situations l’utilisateur peut réinitialiser le formulaire avec un message de confirmation pour palier à tout erreur d’activation du bouton
Ainsi ce nettoyage est laissé à l’initiative de l’utilisateur
J’ai rajouté un contrôle dans le cadre d’un nouvel enregistrement bouton « ENREGISTRER » celui de la saisie de la Date textbox « Date » avec un message invitant à cette saisie
Si celle-ci est absente la dernière ligne n’aurait pas de donnée en colonne A colonne utilisée pour détecter le numéro de la dernière ligne saisie
Il y aurait donc une erreur dans les lignes code qui détecte cette dernière liée à l’absence de donnée dans cette colonne pour la dernière ligne

Pour le bouton « MODIFIER » voici ci-après ce que j’ai obtenu en l’utilisant

Ici l’état initial des données onglet « DONNEES » :

je considère la dernière ligne ligne 13 dont la rubrique « Sexe » colonne I est au départ « Féminin »

Je choisi dans la listebox « Recherche par date » cette ligne :

Je sélectionne dans la combobox « Sexe » l’item « Masculin »

Après avoir actionné le bouton « MODIFIER » la 9° textbox sous la combobox « Recherche par date » a été mise à jour sa donnée « Féminin » a été remplacée par « Masculin »

Dans l’onglet « DONNEES » même mise à jour rubrique « Sexe » colonne I dernière ligne :

image

Le fonctionnement de ce bouton est donc correct

A ta disposition pour en parler

La nouvelle version :

Désolé ci-après la nouvelle version :

TESTrod4.xlsm (46,7 Ko)

Bonjour;
Je fais les tests et reviens vers toi.
Merci,

Bonjour,

Cool la version TESTrod4! C’est bien d’anticiper, voire d’ajuster la conception du dispositif…

  • Ok avec ton idée permettant une nouvelle création avec un minimum de saisie…
  • Ok pour la possibilité de réinitialiser

Les choses à améliorer :

  • qu’il soit possible à l’utilisateur de Modifier n’importe qu’elle ligne (seule la 13 est modifiable)
  • que les ComboBox ne conservent pas un surplus d’informations après Enregistrer et Modifier. Exemple, Sexe
    doit toujours afficher : Masculin, Féminin seulement (voir image ci-dessous).

Merci et dans l’attente,

En fait plusieurs lignes étaient modifiables mais les premières non
J’ai apporté une correction et cela fonctionne sur toutes les lignes
J’ai modifié dans l’initialisation du formulaire les lignes de code qui constituaient toutes les listes des différentes combobox
Plus donc de redondance dans ces listes suite aux différentes manipulations effectuées dans le formulaire
Si il y a doublon c’est que celui-ci est présent dans l’onglet « LISTE » uniquement

Je pense que cette fois-ci tout est opérationnel

Teste et dis moi

TESTrod4.xlsm (49,8 Ko)

Oui, tout marche. Merci bien. Tu maitrises vraiment.
A cause de toi, mon niveau en Excel / Vba sera bientôt intermédiaire 1/2.

Petit souci. Je constate dans cette version, que tu as (sûrement involontairement) empêché aussi la modification de la Date. C’était pourtant possible avec la version précédente dans laquelle tu disais : J’ai rajouté un contrôle dans le cadre d’un nouvel enregistrement bouton « ENREGISTRER »….

Et si tu remettais cela (y compris le contrôle)?

Merci,

Non je n’ai pas involontairement inhiber la modification
A son origine dans tes premières versions la date utilisée était celle de la combobox1 de recherche
Pour apporter une homogénéité de saisie j’ai plutôt rajouté avec toutes combobox textbox de saisie une texbox pour cette date et modifié les procédures en fonction
J’ai omis celle de la modification pour ce texbox Date rajouté
C’est corrigé su ce fichier joint
Le contrôle sur cette donnée n’est opérationnel que pour l’enregistrement d’une création afin d’éviter une nouvelle série de donnée avec une date absente en colonne A préjudiciable au bon fonctionnement de l’ensemble
Essaies de réaliser un enregistrement sans date saisie un message d’alerte te le rappellera et stoppera le traitement
Je pense que tout est maintenant OK reste à savoir comment tu envisages l’enregistrement du fichier de tous les évolutions liées à l’utilisation du formulaire afin qu’à sa fermeture et réouverture tu les retrouves
Pour l’instant rien dans ce sens dans les différentes procédures
Peut être un bouton supplémentaire « ENREGISTREMENT FICHIER » ou il est possible d’inclure ce dispositif à la fermeture du classeur avec message de confirmationmais cette option c’est du tout ou rien peut être difficile à concevoir
Le bouton offre l’avantage de cibler ce qui doit l’être dans ce domaine

Qu’entends tu par :

A cause de toi, mon niveau en Excel / Vba sera bientôt intermédiaire 1/2.

Ce n’était pas mon objectif juste à t’aider ni plus ni moins

Bon courage

TESTrod4.xlsm (48,6 Ko)

Oui, tout est OK. Merci!
Ta question : reste à savoir comment tu envisages l’enregistrement du fichier de tous les évolutions liées à l’utilisation du formulaire afin qu’à sa fermeture et réouverture tu les retrouves? me fait prendre conscience d’un problème que je n’ai pas pu imaginer. Peux-tu me résoudre cet éventuel problème?

Par A cause de toi, mon niveau en Excel / Vba sera bientôt intermédiaire 1/2., je veux dire que j’apprends un peu plus en comprenant la logique de tes lignes de code. Je suis réellement un débutant en vba excel qui apprend sur le tas (et pas informaticien mais de formation scientifique).

Ton aide me fait évoluer plus vite. Et c’est positif.

Dans l’attente de ce bouton supplémentaire…

Ci-joint ton fichier avec un autre bouton « ENREGISTRER CLASSEUR »
Le formulaire vu son jeune âge commence à avoir de l’acné juvénile mais c’est pour la bonne cause
Donc ce nouveau bouton activable n’importe quand après validation d’un message d’information engendre l’enregistrement du classeur
Tout est donc après son passage conservé
J’en ai profité pour éviter des erreurs dommageables de rajouter pour le bouton « SUPPRESSION » une confirmation avant son traitement
Les boutons son si proches les uns des autres qu’une fausse manœuvre est vite arrivée

Promis c’est le dernier qui bourgeonne dans ton formulaire

A ta dispo pour d’autre amélioration

TESTrod4.xlsm (50,6 Ko)

Cool! :smiley:
En cas d’idées d’amélioration, je reviens vers toi…

Salut FFO,

J’ai essayé de comprendre ton code en vue de m’améliorer. Voici quelques constats, questions et demandes :

  • Dans l’image suivante : img1 peut-on remplacer le code en bleu par celui en rouge? Si non, pourquoi ?

  • Dans le formulaire, que signifie les lignes de code :

    I = Ws.Range(« A » & Rows.Count).End(xlUp).Row
    sélection = Me.ComboBox1.ListIndex
    Me.ComboBox1.ListIndex = L - 1
    Me.ComboBox1.List = Ws.Range(« A1:K2 »).Value et pourquoi pas A1:K1 ?

  • La ligne 4 Bouton RECULER n’est pas déclaré. Pas de problème?
    img2

  • La programmation a-t-elle pris en compte le fait que certaines listes déroulantes (exemple Prof) pourraient avoir plus de 3 éléments ? Si non, merci de mettre à jour.

  • Peut-on supprimer sans problème ces 2 lignes de code?
    img4
    Si non, pourquoi ?

  • Que signifie ce rappel : Call UserForm_Initialize au Bouton ENREGISTRER) ?

  • Pourquoi la liste déroulante Profession est-elle si grande comparée aux autres ? Merci de corriger.
    img5

Ci-joint le formulaire légèrement toiletté : ProjetRod.xlsm (38,5 Ko)
Merci d’avance,
Dans l’attente

Bonjour

Beaucoup de questions au quelles je vais essayer de répondre de la manière la plus intelligible possible

1° question
on remplacer le code en bleu par celui en rouge ? Si non, pourquoi ?
C’est 2 lignes écrite de manière différente aboutissent au même résultat

L’instruction Range a besoins de la colonne exprimée avec sa lettre et du numéro de la ligne
Dans la première ligne ces 2 éléments sont exprimés l’une par une lettre « A » l’autre par une instruction « Rows.Count » qui donne le nombre de lignes de la feuille donc le chiffre
Dans la 2° seul le chiffre inscrit en dur est la différence et l instruction Range est remplacée par des crochets
Range(« A65000 ») est identique à [65000]
L’avantage de la première c’est d’être dynamique et de s’adapter à la feuille pour déterminer sa dernière ligne le but au final est de faire démarrer l’ensemble à partir d’une cellule vide pour déterminer la première non vide donc la dernière ligne des données sachant que cette dernière est fluctuante au grés du nombre de ces données qui peuvent très bien augmenter ou diminuer
Maintenant la 2° écriture même si elle n’est pas dynamique aura toutes les chances de toujours fonctionner car peu de fichier atteigne quant à ces données la ligne 65000
Moi même j’utilise dans ce genre d’instruction la ligne 65536 qui était à l’époque d’Excel 2003 la dernière ligne des onglets
Aujourd’hui le nombre de ligne a exploser dans les dernière version d’Excel mais par habitude j’utilise toujours ce rang et n’est jamais eu à en déplorer son choix

2° question

Dans le formulaire, que signifie les lignes de code :

on détermine la dernière ligne de donnée de l’onglet Ws que l’on affecte à la variable « I » :
I = Ws.Range(« A » & Rows.Count).End(xlUp).Row

On affecte le numéro de la sélection effectué dans la combobox1 à la variable "sélection :
sélection = Me.ComboBox1.ListIndex

On positionne la sélection de la listebox de la Combobox1 au niveau déterminé par L-1 ce qui représente dans la procédure concernée la dernière position de la liste
Me.ComboBox1.ListIndex = L - 1

On constitue les éléments de la Listebox de la Combobox celle-ci impérativement doit avoir au moins 2 item
Si tu mets " A1:K1" tu n’as qu’un item donc bug en perspective
Pas d’autre choix que de mettre « A1:K2 » pour avoir le minimum d’item soit 2 et ainsi d’éviter un bug
Me.ComboBox1.List = Ws.Range(« A1:K2 »).Value et pourquoi pas A1:K1 ?

3° question
La ligne 4 Bouton RECULER n’est pas déclaré. Pas de problème?
Pour solutionner certains dysfonctionnement j’ai tenté de déclarer des variable public pour que ces variables utilisées dans différentes procédures récupèrent leur valeur émanant de l’exécution de l’une d’entre elles et d’en profiter sur la suivante
Hélas si cela fonctionne très bien dans les modules classiques ce n’est pas le cas dans les Userformes
Donc j’ai abandonné cette option mais oublié de supprimer la ligne :
Public ligne, ligne2, ligne3
Aucune incidence mais tu peux la supprimer car inutile

4° question

  • La programmation a-t-elle pris en compte le fait que certaines listes déroulantes (exemple Prof ) pourraient avoir plus de 3 éléments ? Si non, merci de mettre à jour.

Dans la constitution de toutes les listes la détermination de la dernière cellule à prendre en compte dans la colonne appropriée onglet « LISTE » est réalisée de manière dynamique
Pour cette liste les lignes concernées :

Set Ws = Sheets(« LISTE »)
I = Ws.Range(« D » & Rows.Count).End(xlUp).Row
If I > 2 Then
Me.ComboBox5.List = Ws.Range(« D2:D » & I).Value
Else
Me.ComboBox5.List = Ws.Range(« D2:D3 »)
End If

la constitution de la liste réalisée par cette ligne :

Me.ComboBox5.List = Ws.Range(« D2:D » & I).Value

utilise la variable « I » déterminée en amont par cette ligne de code :

I = Ws.Range(« D » & Rows.Count).End(xlUp).Row

qui s’adapte systématiquement au nombre de lignes remplies dans la colonne
Il en est ainsi pour toutes les listes
Pas de soucis donc à avoir

5° question
Peut-on supprimer sans problème ces 2 lignes de code?

Private Sub ComboBox2_Change()

End Sub

Pas de soucis on peut mais elle ne gène pas
A toi de voir

6° question
Que signifie ce rappel : Call UserForm_Initialize au Bouton ENREGISTRER) ?

Fais appel à la procédure de réinitialisation pour réinitialiser tout le userform afin de permettre la mise en place dans la listebox de la combobox1 en bas de sa liste du nouvel enregistrement effectué de placer la sélection dessus et d’alimenter de toutes les données correspondantes les 9 textbox de dessous
La procédure concernée appelée :
Private Sub UserForm_Initialize()

7° Question
je ne constate pas chez moi cette présentation
les cellules de la colonne concernée onglet « LISTE » après la dernière cellule saisie sont elles toutes vides sans espace invisible à l’œil

Moi chez moi j’ai cette présentation :

image

Je viens de récupérer ton fichier et comprendre l’origine de cet affichage listebox « Profession »
un caractère parasite dans la colonne concernée onglet « LISTE » en est la cause cellule « D14 »
Bien vérifier dans cet onglet la présence des seules données dans chaque colonne
Ne pas hésiter à faire un bon nettoyage après la dernière cellule saisie de chaque colonne
L’intrus colonne D onglet « LISTE » cellule D14 sélectionnée :

Je pense avoir répondu de manière claire à toutes tes interrogation

A ta disposition