XL 2019 Saisie Formulaire par ComboBox, mais pas que !

Choco2x

XLDnaute Occasionnel
Bonjour à toutes et à tous !


Je n’ai pas trouvé de solution à mes besoins en cherchant dans les sujets, je me permets donc de venir vers vous.

J’ai un formulaire qui doit remplir un tableau.

Sur une autre page (Feuille 3), j’ai une « base de données » composée de deux tableaux (1 et 2) à remplir à l’aide de ce formulaire.

De même, j’aimerais que mes combobox me permettent de voir ce qui a déjà été saisi, et que si je saisis un nouveau mot il entre de ce fait dans la base de données.

Pour le moment ça ne fonctionne que si je n’ai qu’un champ rempli, sur les 3 qui m’intéressent (deux champs ont un même tableau en commun).

Sachant qu’il y aura forcément des doublons, j’ai essayé d’intégrer une macro qui les efface. Et pour terminer j’aimerais que les tableaux de ma base de données soit en ordre alphabétique, afin de mieux profiter des menus déroulants en découlant.
Tout fonctionnait jusqu'à ce que j'essaye de remplir mes champs d'après les combobox, car avant j'utilisais des textbox, mais alors je ne pouvais pas voir si ce que j'allais taper était déjà dans la base de données ou pas...


Voici dont le résultat de mes galères depuis 15 jours…

Ne critiquez pas mes formules svp, je me débrouille comme je peux, j’ai utilisé un ensemble de formules trouvées sur internet et de macros recopiées… ;)

Allez, c'est parti (je mets tout, pour ne pas passer à côté du problème !) :



Private Sub btnAjout_Click()


‘Quand je valide mon formulaire, il rempli un premier tableau journalier.

Feuil1.Activate

Range("A2:K2").Select

Selection.ListObject.ListRows.Add (1)

Range("A3:K3").Select

Selection.Copy

Range("A4").Select

Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _

SkipBlanks:=False, Transpose:=False

Application.CutCopyMode = False

Range("A2").Select

Selection.Offset(1, 0).Select

ActiveCell = txtNom.Value

ActiveCell.Offset(0, 1).Value = txtPrénom

ActiveCell.Offset(0, 3).Value = txtDateNaiss

ActiveCell.Offset(0, 4).Value = txtDateTps

ActiveCell.Offset(0, 6).Value = cboHeureDép

ActiveCell.Offset(0, 7).Value = cboServiceDép

ActiveCell.Offset(0, 8).Value = cboHeureArr

ActiveCell.Offset(0, 9).Value = cboServiceArr

ActiveCell.Offset(0, 10).Value = cboMotif

ActiveCell.Offset(0, 11).Value = txtComment



If OptbtnMme.Value = True Then

Range("C3").Value = "Femme"

End If

If OptbtnM.Value = True Then

Range("C3").Value = "Homme"

End If



If OptbtnAmb.Value = True Then

Range("F3").Value = "Ambulance"

End If

If OptbtnVSL.Value = True Then

Range("F3").Value = "VSL"

End If





Feuil3.Activate

Range("A1").Select

Selection.End(xlDown).Select 'On se positionne sur la dernière ligne

Selection.Offset(1, 0).Select 'On se décale d'une ligne vers le bas

ActiveCell = Me.cboServiceArr.Value



‘********* CA NE FONCTIONNE QUE JUSQUE LA, si je valide ce qui suit ça ferme Excel !*************



Feuil3.Activate

Range("B1").Select

Selection.End(xlDown).Select 'On se positionne sur la dernière ligne

Selection.Offset(1, 0).Select 'On se décale d'une ligne vers le bas

ActiveCell = Me.cboMotif.Value



Feuil3.Activate

Range("B1").Select

Selection.End(xlDown).Select 'On se positionne sur la dernière ligne

Selection.Offset(1, 0).Select 'On se décale d'une ligne vers le bas

ActiveCell = Me.cboServiceDép.Value



'Trie les tableaux



Sheets("Base de données").Select

Range("Tableau1[Etablissements]").Select

ActiveWorkbook.Worksheets("Base de données").ListObjects("Tableau1").Sort. _

SortFields.Clear

ActiveWorkbook.Worksheets("Base de données").ListObjects("Tableau1").Sort. _

SortFields.Add Key:=Range("A2"), SortOn:=xlSortOnValues, Order:= _

xlAscending, DataOption:=xlSortNormal

With ActiveWorkbook.Worksheets("Base de données").ListObjects("Tableau1").Sort

.Header = xlYes

.MatchCase = False

.Orientation = xlTopToBottom

.SortMethod = xlPinYin

.Apply

End With

Range("Tableau2[Services]").Select

ActiveWorkbook.Worksheets("Base de données").ListObjects("Tableau2").Sort. _

SortFields.Clear

ActiveWorkbook.Worksheets("Base de données").ListObjects("Tableau2").Sort. _

SortFields.Add Key:=Range("B2"), SortOn:=xlSortOnValues, Order:= _

xlAscending, DataOption:=xlSortNormal

With ActiveWorkbook.Worksheets("Base de données").ListObjects("Tableau2").Sort

.Header = xlYes

.MatchCase = False

.Orientation = xlTopToBottom

.SortMethod = xlPinYin

.Apply

End With



'***********************************************

'Enlève les doublons



Feuil3.Activate

Range("Tableau1[Etablissements]").Select

ActiveSheet.Range("Tableau1[Etablissements]").RemoveDuplicates Columns:=1, Header:= _

xlYes

Range("Tableau2[Services]").Select

ActiveSheet.Range("Tableau2[Services]").RemoveDuplicates Columns:=1, Header:= _

xlYes

Range("A6").Select



**************************la suite fonctionne*********************



OptbtnMme = ""

OptbtnM = ""

OptbtnAmb = ""

OptbtnVSL = ""

txtNom = ""

txtPrénom = ""

cboSexe = ""

txtDateNaiss = ""

txtDateTps = ""

CboModeTps = ""

cboHeureDép = ""

cboServiceDép = ""

cboHeureArr = ""

cboServiceArr = ""

cboMotif = ""

txtComment = ""



Sheets("Commandes").Select

Range("Tableau10[NOM]").Select



End Sub



‘*********************************et voilà !!*****************************





Mille remerciements par avance à qui pourra m’aider !
 

Dranreb

XLDnaute Barbatruc
Bonsoir.
Probablement du travail pour cette ressource :
Il vaut mieux éviter de créer des doublons plutôt que de les supprimer après coup, non ?
 

Choco2x

XLDnaute Occasionnel
Bonjour !

JM27 > En effet j'avais des données confidentielles, j'ai effacé ce qui pouvait l'être et je joins le fichier. Merci pour ta suggestion !

Dranreb > je regarde çà dés que possible, je suis passé à côté ! J'espère que ça m'aidera...
Je n'arrive pas à éviter de créer les doublons, tout ce que j'ai tenté s'est soldé par des échecs. Ceci dit, j'ai peut-être voulu faire trop de choses à la fois, alors que je ne maîtrise ni la syntaxe ni les procédures...
Merci pour le lien !

La raison d'être de mon fichier est de permettre à un hôpital de me commander quotidiennement des ambulances, tout en enrichissant sa base de données pour avoir de moins en moins de saisie à faire avec le temps. Voir même enrichir une base de données patients dates de naissance etc, mais çà, c'est moins indispensable.

J'ai besoin de savoir ce que je foire, comment enchaîner des actions VBA sans que ça plante, car à peu de choses près je pense que je ne suis pas loin d'avoir un fichier fonctionnel, même s'il y a assurément plus simple à concevoir...
:)
 

Pièces jointes

  • Commande transports ambulance 6.0 pour XLD.xlsm
    46.9 KB · Affichages: 23

Dranreb

XLDnaute Barbatruc
Bonjour.
L'avez vous déjà laissé s’installer dans votre dossier de compléments ? Il servira c'est sûr !
Mettez des ComboBox pour pratiquement toutes les colonnes (sauf Sexe et Commentaire) et ne prévoyez pas de Base de données. L'objet ComboBoxLiées saura fabriquer des listes d'après tout ce qui existe déjà dans le tableau Commandes. Il ne propose pas en principe ce qui n'est pas compatible, dans ce qui existe, avec ce qui a déjà été spécifié dans certaines, mais il peut être stoppé temporairement, et dans ce cas, avant de se désactiver, il regarnit des listes complètes trouvées toutes les ComboBox dont il a la charge. Ce serait plus simple de faire comme ça que de gérer un deuxième tableau de services d'établissements, mais ce serait faisable aussi avec deux objets ComboBoxLiées. Mais même dans ce cas il faudrait qu'un des deux soit toujours stoppé car il ne faut pas confier une même ComboBox à deux objets ComboBoxLiées actifs en même temps.
 

Choco2x

XLDnaute Occasionnel
Euh...
1 - je suis largué
2 - en suivant le lien je n'ai rien trouvé à télécharger.
3 - Il faut que ça soit transparent en utilisation et aucune activation ni désactivation à effectuer, quelque chose d'efficace mais simplissime à utiliser pour eux, qui ne connaissent absolument pas excel.

Enregistrer automatiquement ce qui est saisi dans une combobox en gérant les doublons et l'ordre alphabétique tout en restant sur mon élan serait génial. Je suis certain que même si les procédures sont lourdes et imparfaites par manque de simplicité ça peut fonctionner...
 

Dranreb

XLDnaute Barbatruc
Moi quand je clique sur le lien, je vois bien un bouton rouge "Téléchager maintenant", et quand je clique dessus il me propose bien de l'ouvrir avec Excel, et je sais qu'en l'ouvrant il va m'afficher le message initiant la procédure d'installation :
1607419547766.png

Les méthodes Stopper et Réactiver de l'objet ComboBoxLiées peuvent être exécutées sur demande expresse par un CommandButton, ou, pour le rendre transparent à l'utilisation, lors des évènements Enter de certains contrôles. Mais c'est plus souple à mon avis avec un bouton qui libère sur demande les listes complètes pour pouvoir panacher des éléments de différentes lignes de l'existant.
Remarque: Votre tableau deviendrait plus un historique sur une longue période, mais il devrait être facile d'extraire vers un tableau de même structure toutes les ligne d'une même Date du transport par exemple.
 

Choco2x

XLDnaute Occasionnel
Je n'ai rien de tel à l'affichage...
Et je ne sais même pas si je saurai l'intégrer à mon fichier... Oui, je sais, je suis nul à ce point... 🤣

Avoir les transports du même jour ne m'intéresse pas, la société qui m'emploie a déjà un logiciel professionnel pour çà.
Là, je cherche juste à faciliter la vie du personnel hospitalier dans la saisie. Les demandes sont quotidiennes, et pourraient génèrer un tableau qui nous serait envoyé par mail (voir mon bouton envoi), avant d'être effacé et recommencé le lendemain. Je voudrais juste que ce qui est tapé dans les ComboBox alimente mes tableaux, sans doublon, et mis dans l'ordre, tout en étant du coup visible le lendemain dans ladite ComboBox par menu déroulant pour choisir plus simplement...
Je pensais que mon bugg était dû uniquement à une mauvaise compréhension de syntaxe (faire plusieurs actions à la suite au même endroit ?), mais ça semble plus compliqué que je ne croyais...
 

Dranreb

XLDnaute Barbatruc
Oui, je parlais de conserver plus longtemps qu'un jour, justement, pour pouvoir garder plus d'éléments à ne plus saisir, ce qui impliquait de pouvoir en extraire ceux du jour.
Les listes de ComboBox prise en charge par un objet ComboBoxLiées sont toujours classées et sans doublon.
 

Choco2x

XLDnaute Occasionnel
Je suis désolé, là on part dans un domaine que je maîtrise encore moins que le VBA, c'est dire !
Je n'ai aucune idée de quoi on parle, ni de comment ni où l'utiliser.
Ce serait donner de la confiture à un cochon, j'ai déjà du mal à comprendre le peu que j'ai saisi.
Je vais laisser tomber, je pense.

Merci d'avoir tenté de m'éclairer, malgré tout.
 

Dranreb

XLDnaute Barbatruc
Déjà je n'envoie jamais directement les valeurs de contrôle dans des cellule. C'est lent. Je les envoie d'abord dans un tableau dynamique d'une ligne que j'appelle généralement TVL (Tableau des Valeurs de la Ligne). Et ça permet d'écrire ensuite .ListRows.Add.Range.Value = TVL pour un ajout ou .ListRows(LCou).Range.Value = TVL pour une modification.
Les objets ComboBoxLiées et ControlsAssociés offrent des facilités pour récupérer ou garnir ce tableau par des méthode ValeursDepuis et ValeursVers, car on aura annoncé une seule fois dans la Sub UserForm_Initialize quels contrôles doivent être pris en charge et à quelles colonnes il correspondent. On peut y spécifier les titres des colonne du tableau. Il s'en suit que la plupart des procédures à mettre sont très courtes, en dehors de l'userForm_Initialize qui définit en quelque sorte presque tout.
Pour intégrer les fonctionnalité du CBxLCtlA.xlam dans votre classeur il suffit, aussitôt après son installation, et dans son VBAProject, de faire Alt+OR et d'y cocher la référence CLsCAs.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Sinon, si vous tenez à en rester à votre système, pour ajouter un service d'arrivée à votre liste, ne suffirait-il pas de faire ça dans la btnAjout_Click ? :
VB:
If Not cboServiceArr.MatchFound Then
      With Feuil3.ListObjects("Tableau2")
      .ListRows.Add.Range.Value = cboServiceArr.Text
      .Sort.Apply
      End With: End If
À tester. Je n'utilise guère la propriété RowSource des ComboBox, je préfère garnir leur propriété List. J'ai de plus vu des #REF! dans des noms inutiles qui devaient les couvrir un jour, je suppose …
(Comme dit plus haut dans ma liste, la cboServiceArr, je l'aurais appelée CBxServiceArr, et le btnAjout: CBnAjout)
 
Dernière édition:

Choco2x

XLDnaute Occasionnel
Les #REF! doivent être dus à ma purge pour enlever les données confidentielles et inutiles pour vous...

Je ne connais pas la propriété List. Quelle est la différence, exactement ? Quel type d'info doit s'y trouver ? Tableau1 est refusé.

Ca fonctionne une ou deux fois une fois le code adapté, avant de planter. J'ai renommé cbnoServiarr en cboEtab, c'est plus juste.
Dés que je remplis un autre champ du formulaire que celui des établissements, ça plante à la validation.
Je me remets en test.

La très grande partie de ce que vous m'expliquez m'est inconnu, ça me fait me sentir vraiment à la ramasse.

Je ne trouve pas la référence CLsCAs dans la liste. 😤
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Mais non, c'est un outil que vous ne connaissez pas encore, alors c'est normal que vous soyez perdu, à moins que n'ayez pas non plus les notions d'objet, de propriété et de méthode ni de variables locales ou globales de portée Private ou Public. Dans ce cas ce sont des bases qu'il vous manque, mais vous pourrez les acquérir à cette occasion.
J'ignore pourquoi Tableau1 est refusé. C'est pourtant bien le nom du ListObject à la colonne "Etablissement". Personnellement je séparerais quand même d'une colonne vide les deux tableaux. Ou alors au contraire j'en ferais un seul de lieux de destination avec Établissement et Service, l'établissement étant répété sur chaque ligne (le ComboBoxLiées se débrouiile très bien pour en faire une liste d'établissements classée et sans doublon).
C'est soit qu'il n'a pas été installé (vous avez répondu Annuler quelque part lors de l'exécution de sa procédure d'installation) soit que vous l'avez installé lors d'une session Excel précédente à celle où vous voulez avoir la référence. Dans ce cas il n'est plus ouvert. Mais, si c'est bien dans votre dossier de compléments que vous l'avez laissé s'installer, vous pouvez l'ouvrir facilement en cochant, coté Excel cette fois, "CBx liées et Ctl associés", menu Développeur, groupe Compléments, commande Compléments Excel.
Il m'aurait été agréable que vous eussiez renommé le cboServiceArr en CBxÉtab. Ça m'aurait montré que vous auriez compris l'intérêt de ma liste de trigrammes permettant de retrouver rapidement de mémoire, et grâce au système de codification par seulement deux règles simples, de quel type de contrôle il s'agit.
 
Dernière édition:

Statistiques des forums

Discussions
311 720
Messages
2 081 896
Membres
101 833
dernier inscrit
sandra25