• Initiateur de la discussion Initiateur de la discussion cibleo
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

cibleo

XLDnaute Impliqué
Bonsoir le forum,

Je sais vous allez me dire que le sujet a été mille fois abordé.😉

Mais pour illustrer ma demande, j'ai repris un fichier trouvé sur le forum qui répond partiellement à mon problème.

Dans la feuille de calcul "Monte" s'affiche un formulaire dans lequel la combo1 et combo2 alimentent la listbox1 sur ses 2 colonnes. (Travail de Boisgontier)

Dans la feuille "Monte2", je reprends les mêmes éléments et code identique sauf que la listbox1 ne possède plus qu'une colonne et j'aimerais que la sélection effectuée en combo1 et 2 s'affiche l'une en dessous de l'autre dans la listbox et non plus sur la même ligne comme dans l'exemple de Boisgontier.

Quequ'un peut il m'aider à modifier le code.

Tout cela en vue d'un futur projet qui me permettrait d'alimenter un planning journalier.
Actuellement, je rassemble beaucoup d'éléments sur le forum pour concevoir mon formulaire.

Ma base de travail étant le fichier de Jyll dans le fil ci-dessous.

https://www.excel-downloads.com/threads/userform-intuitif.75953/

Merci de votre aide.

Cibleo
 

Pièces jointes

Dernière édition:
Re : Alimenter 1 listbox

Bonjour à tous,
Bonjour Bebere , bqtr

Tu dis :
Tu devrais mettre en PJ un exemple de ton USF tel qu'il sera au final.

Je commençais sérieusement à y songer, mais tu travailles plus vite que moi.

Je te rassure, ton travail n'est aucunement remis en cause, dans l'esprit c'est tout à fait cela.
Le problème chez moi c'est que plus j'explique et moins je me fais comprendre 😀. Abcd me l'avait fait déjà remarqué.

Il y a juste un petit souci au niveau de la ventilation.

En attendant le développement de mon formulaire et des modifications à venir, je te livre un aperçu des données qui au final pourront alimenter la ListBox1 puis être ventilées dans mon planning.

Ci-dessous, la course saisie se présentera ainsi dans la Listbox1, c'est pour cela que j'ai intégré un spinbutton qui me permet de trier les infos à ma guise (pour rendre le système plus souple).

Le 1er item sera toujours composé de l'heure et du point de départ et constituera le repère horaire pour ventiler la course.

Exemple :

09:10 Sauvigny ----> créé = txtHeure&ComboPCharge
MR ALLOU Marc -----> créé = ComboCivilite&ComboClients
2 personnes ----->Non créé = txtNbrePers
3, rue du puits ------> Non créé = txtAdresse
03.85.21.40.17 -----> Non créé = txtTel
Consultation -------->Non créé = ListboRDV
Dr Duranton --------> Non créé = ListboDescription
10:30 CHU Dijon-------->Non créé = txtHeure2&ComboDestination
Diabétique ------------->Non créé = ListboEtat
Aide à la marche -------->Non créé = ListboRecom
Attestation de droits ----->Non créé = ListboFormalites
Aller + retour ----------->Non créé = ListboConditions

+ les Boutons déjà créés.

Toutes les ListBox seront à sélection multiples sauf la ListBox1.

Avec cet aperçu, comprends tu la trame de mon projet ?

Je poursuis le développement de mon formulaire et reviens avec d'ici quelques jours, patience 😀

A bientôt Cibleo
 
Dernière édition:
Re : Alimenter 1 listbox

Re,

Tu confirmes ce que je pensais.

Deux, trois petites questions :

Tu comptes mettre les 11 lignes de la course dans une seule Cellule ?

Y aura t'il toujours 11 lignes par course ? Si non, ca ne va pas être simple pour extraire les éléments de la listbox par course. Comment fera t'on pour délimiter les courses ? (tu as plusieurs heures différentes par course). Le mieux sera peut-être de procéder course par course.

Pour les listbox à sélection multiple, les données de chaque listbox seront concaténées et envoyées dans la listbox1 ou chaque sélection sera envoyée séparemment ?

A+
 
Re : Alimenter 1 listbox

Bonsoir à tous,
Bonsoir Bebere, bqtr

Tu dis :
Le mieux sera peut-être de procéder course par course.
Bien d'accord avec toi.

Petit rappel : une course, c'est 1 point de départ et 1 point d'arrivée (comme mentionnés ci-dessous) + des infos que je rentre à travers différents contrôles.
09:10 Sauvigny
........
........
10:30 Dijon
.......

J'ai potassé le formulaire, le voici.
Précisions :

Les contrôles sur fond blanc sont ceux sur lesquels tu as déjà travaillés.
Les contrôles sur fond orange ont été rajoutés.
Les contrôles sur fond vert me servent à filtrer les données situées à leur droite et leurs données ne seront donc jamais insérées dans la Listbox1.
Tu comptes mettre les 11 lignes de la course dans une seule Cellule ?

Non, pour plus de souplesse, on va considérer que toutes les données à saisir sont facultatives.
En général, une course affichée dans la listbox1 se présentera comme ceci.

09:10 Sauvigny
Mr ALLOU Marc
Hospitalisation
10:30 CHU Dijon

Je ne vais pas en mettre une tartine 😀 ni rajouter l'âge du capitaine.

Sinon, les données des listbox ne devront pes être concaténées.

A l'initialisation de l'userform, je ne parviens pas à alimenter mes 5 listbox à partir des noms de liste (Condi, Recom, Etat, Formali et RDV) que j'ai définis dans la feuille de calcul "BaseRens" 😕.

ListboConditions
ListboRecom
ListboEtat
ListboFormalites
ListboRDV

Autre point, tu verras il y a des petits problèmes de focus 🙄, je n'arrive pas à les régler dans la fenêtres propriétés.

Dernier point, je joins un fil pour paramétrer la txtTel.

https://www.excel-downloads.com/threads/vba-masque-saisie-textbox-numero-telephone-how-to.81711/

Pas eu le temps, d'adapter le travail de PascalXLD.

Bonne soirée à tous Cibleo
 

Pièces jointes

Re : Alimenter 1 listbox

Re,

Voici un premier exemple :

-Pour le TB Téléphone c'est paramétré
-Idem pour le deuxième TB pour l'heure d'arrivée

J'ai ajouté dans la propriété Tag des 6 listboxs (sauf la listbox1) un "L".
Cela permet de faire une boucle et de les identifier pour le transfert dans la listbox1.

Pour le bouton "Créer la course", le code contrôle comme avant si les 6 infos indispensables ont été saisies (H de départ + lieu, civilité + nom, H d'arrivée + lieu). Le reste est facultatif et est pris en compte le cas échéant.

Pour la validation j'ai ajouté un contrôle sur le cellule de destination au cas où elle serait déjà renseignée.
La validation doit se faire course par course.

Par contre avec les Frames c'est beau mais ça gène la tabulation, surtout pour les heures, quand tu renseignes le txtHeure2 et que tu changes de Frame le contrôle de saisie ne se fait pas et les ":" ne se mettent pas.
Il faudrait supprimer cette Frame et intégrer les deux TB heure dans la Frame "Trajet effectué" (Heure de D + De + Prise en Charge et Heure d'Ar + Vers + Destination)

Le deuxième fichier repend les modifs des Frames. La tabulation se fait correctement entre les Frames.

A+
 

Pièces jointes

Dernière édition:
Re : Alimenter 1 listbox

Bonsoir à tous,
Bonsoir Bebere, bqtr

Je découvre ton travail, c'est génial, on avance à grands pas.🙂
J'opte sans problème pour la Version2.

Je vais prendre le temps d'analyser tout ça et revenir avec quelques questions pour améliorer certaines fonctionnalités.

En attendant, j'aimerais formater la Textbox "txtNbrePers" pour qu'elle ignore les valeurs texte et n'accepte que les nombres.

De plus, j'aimerais inclure une condition dans le code ci-dessous pour concaténer le nombre entré avec le mot "Personne".

Ainsi lorsque je tape 1, jaimerais que cela m'affiche 1 personne sans (S), si je tape un nombre > 1 j'aimerais afficher "personnes" avec un (S).

Ai-je choisi le bon évènement, car j'ai beaucoup de difficultés à comprendre les évènements des Textbox.

Code:
Private Sub txtNbrePers_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Me.txtNbrePers = Me.txtNbrePers & " personne"
End Sub

Sinon, je continue les tests et reviens bientôt 😉

Bon week-end à tous.
A+ Cibleo
 
Re : Alimenter 1 listbox

bonjour Cibleo,Bqtr
Cibleo il te gâte Bqtr

'contrôle saisie numeric
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii >= 97 And KeyAscii <= 122 Then
MsgBox ("Pas du texte,svp")
End If
End Sub

à essayer dans évènement change
si tu tapes 1 dans Me.txtNbrePers :

if isnumeric(Me.txtNbrePers) then
x=val(Me.txtNbrePers)
if x=1 then
Me.txtNbrePers = Me.txtNbrePers & " personne"
else
Me.txtNbrePers = Me.txtNbrePers & " personnes"
endif
endif

à bientôt
 
Re : Alimenter 1 listbox

Bonsoir le forum,
Bebere, bqtr

Pour la textbox (txtNbrePers), j'ai repris tes instructions et opté pour l'évènement exit qui est plus approprié, je pense.

Code:
Private Sub txtNbrePers_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  If IsNumeric(Me.txtNbrePers) Then
  x = Val(Me.txtNbrePers)
    If x = 1 Then
      Me.txtNbrePers = Me.txtNbrePers & " personne"
    Else
      Me.txtNbrePers = Me.txtNbrePers & " personnes"
    End If
  End If
End Sub

+ cela
Code:
Private Sub txtNbrePers_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    'Dans le TextBox, autorise uniquement les touches numériques
    KeyAscii = AutoriseFrappe(KeyAscii)
End Sub

Faut me corriger si on peut améliorer 🙄

Je continue ma batterie de tests et reviens cette semaine, j'ai quelques modifications à apporter, c'est pas tout à fait fini 😉

Cibleo
 
Re : Alimenter 1 listbox

Bonsoir tous le monde,

Histoire de chipoter 😀, il reste le problème du 0 (zéro).
Voici une solution :
Code:
Private Sub txtNbrePers_Exit(ByVal Cancel As MSForms.ReturnBoolean)

If Me.txtNbrePers = 0 Then
  MsgBox "Saisie invalide, Le nombre de personne doit être > à 0", vbExclamation, "Chiffre invalide"
  Me.txtNbrePers = ""
  Cancel = True
  Exit Sub
End If

If Me.txtNbrePers <> "" Then Me.txtNbrePers = IIf(Me.txtNbrePers > 1, Me.txtNbrePers & " personnes", Me.txtNbrePers & " personne")
   
End Sub
Plus sérieusement, connais-tu la fonction IIF, dans ton cas on peux l'utiliser comme ceci.
Code:
Private Sub txtNbrePers_Exit(ByVal Cancel As MSForms.ReturnBoolean)

 Dim x As Byte
 If IsNumeric(Me.txtNbrePers) Then
   x = Val(Me.txtNbrePers)
   Me.txtNbrePers = IIf(x = 1, x & " personne", x & " personnes")
 End If
 
End Sub
A+
 
Dernière édition:
Re : Alimenter 1 listbox

Bonsoir à tous,
Bonsoir Bebere, bqtr

Pour le 0, je savais que tu interviendrais 😀

Et pour rebondir sur le Iif que je ne connaissais pas, j'aimerais vous poser une colle.

Toujours avec cette Textbox, serait-il possible de réaliser une sorte de saisie intuitive, je m'explique :

Je tape 1e -------> s'affiche 1 enfant
2e ou > 1 -----> 2 enfants

1a ---------> 1 adulte
2a ou > 1-----2 adultes

1p ---------> 1 personne
2p ou > 1-----> 2 personnes

1c-----------> 1 chien
2c ou > 1----> 2 chiens

Peut-être avec la fonction Switch que je découvre aussi.

Ce n'est pas indispensable, mais comme je vous sais très calés 😉

Après, je repasserai aux choses sérieuses.

Merci à vous Cibleo
 
Re : Alimenter 1 listbox

Bonjour,

Essaye avec ceci:

Tu ne peux saisir que des chiffres et seulement les lettres a,e,c,p. Si tu saisis une lettre (a,e,c,p) en premier rien ne se passe.
Il faut impérativement 1 ou 2 chiffre plus une lettre autorisée.

Code:
Private Sub txtNbrePers_Change()
    Me.txtNbrePers.MaxLength = 3
 
    If Len(Me.txtNbrePers) = 1 Then
      If Not IsNumeric(Me.txtNbrePers) Or Me.txtNbrePers = 0 Then Me.txtNbrePers = ""
    End If
 
    If Len(Me.txtNbrePers) > 1 And Len(Me.txtNbrePers) <= 3 Then
      Select Case Right(Me.txtNbrePers, 1)
        Case Is = "e"
           Me.txtNbrePers.MaxLength = 0
           Me.txtNbrePers = IIf(Left(Me.txtNbrePers, Len(Me.txtNbrePers) - 1) = 1, "1" & " enfant", Left(Me.txtNbrePers, Len(Me.txtNbrePers) - 1) & " enfants")
           Me.txtAdresse.SetFocus
        Case Is = "a"
           Me.txtNbrePers.MaxLength = 0
           Me.txtNbrePers = IIf(Left(Me.txtNbrePers, Len(Me.txtNbrePers) - 1) = 1, "1" & " adulte", Left(Me.txtNbrePers, Len(Me.txtNbrePers) - 1) & " adultes")
           Me.txtAdresse.SetFocus
        Case Is = "p"
           Me.txtNbrePers.MaxLength = 0
           Me.txtNbrePers = IIf(Left(Me.txtNbrePers, Len(Me.txtNbrePers) - 1) = 1, "1" & " personne", Left(Me.txtNbrePers, Len(Me.txtNbrePers) - 1) & " personnes")
           Me.txtAdresse.SetFocus
        Case Is = "c"
           Me.txtNbrePers.MaxLength = 0
           Me.txtNbrePers = IIf(Left(Me.txtNbrePers, Len(Me.txtNbrePers) - 1) = 1, "1" & " chien", Left(Me.txtNbrePers, Len(Me.txtNbrePers) - 1) & " chiens")
           Me.txtAdresse.SetFocus
       End Select
    End If
 
End Sub

Code:
Private Sub txtNbrePers_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
  If InStr("0123456789aecp", Chr(KeyAscii)) = 0 Then KeyAscii = 0
End Sub

Tu saisis donc 1e ou 10e ou 25a ou 1p .../... et l'affichage se fait quand tu saisis la lettre.


A+
 
Dernière édition:
Re : Alimenter 1 listbox

Bonjour le forum,
Bonjour bqtr, Bebere

Réponse de bqtr.....et la magie s'opère 🙂

Je reviens pour peaufiner quelques petits réglages.

Comme tu l'as vu, j'ai rajouté la "txtNbrePers" qui va rendre facultative la saisie de "ComboCivilite" et "ComboClients", je pourrais alors créer une course comme ceci :

09:00 Sauvigny
5 personnes
09:45 Gare Montereau

Conséquence, seule la saisie dans le premier cadre est obligatoire et je rajouterai que la saisie dans "ComboCivilite" deviendra obligatoire si je saisis dans "ComboClients".

D'autre part, peut-on entrainer la remise à blanc de mes différentes saisies lors du clic sur "Créer la course"?

- Puis faire apparaître une MsgBox (Dans cette tranche horaire, voulez-vous créer une autre course pour "Nom du chauffeur choisi")<-- ComboChauffeurs

- Si oui ----> Focus sur la txtHeure
- Si non ----> Focus sur le bouton "Valider la course"

Autre cas de figure : je crée une course, je la valide ---> MsgBox (Plage horaire déjà prise, voulez-vous continuez la saisie ?) si oui la course écrase la précédente.

Ne peut-on pas intégrer un choix tel que :

Je valide ---> MsgBox(Plage horaire déjà prise, voulez-vous remplacer la course initiale ?)
- Si oui ----> écrase la course
- Si non ----> mets la course à la suite de l'autre.

Merci pour ton aide et bon week-end à tous.

Cibleo
 
Re : Alimenter 1 listbox

Bonsoir à tous,
Bonsoir bqtr,

Je ne trouve plus de superlatifs 🙂, c'est génial.

Toutefois, je reviens avec mon fichier et quelques modifications.

Dans la feuille planning, j'ai réduit ma plage horaire qui passe désormais de 07:00 à 17:00. (C'est pour l'impression, j'aimerais faire tenir le tout sur 1 seule page).
Or la ventilation se trouve maintenant faussée (décalage d'une colonne), je pense qu'il faut faire la modif dans la partie ci-dessous mais je n'y parviens pas 🙄.

Code:
With Sheets("Planning")
  lign = Me.ComboChauffeurs.ListIndex + 9
  Col = Left(ListBox1.List(0), 2) - 3
  If Col < 3 Then Col = 3
  If Col > 13 Then Col = 13

D'autre part, j'ai implanté un nouveau bouton (Ajouter une Info).

En effet, le bouton "Créer une course" m'oblige à saisir une course complète (c'est parfait, on laisse comme cela) mais j'aimerais aussi pouvoir rajouter une info à l'aide de ce nouveau bouton.

Illustration :

Dans un premier temps, je crée une course dans la ListBox1.
09:00 Estry
Mr Duval
03.45.21.52.36
Hospitalisation
10:00 CH Amiens

Puis, avant de ventiler, j'aimerais pouvoir ajouter seulement un nom, un N° de Tel par exemple et obtenir ceci dans la ListBox1, ce que je ne peux pas réaliser avec le bouton "Créer la course".
09:00 Estry
Mr Duval
03.45.21.52.36
Mme Degrande
06.21.90.46.73
Hospitalisation
10:00 CH Amiens

Peux-tu une nouvelle fois intervenir, je ne suis pas pressé 😉

Amicalement Cibleo
 

Pièces jointes

Dernière édition:
Re : Alimenter 1 listbox

Bonjour à tous,

Pour le décalage de colonne, modifie cette ligne comme ceci, les bornes 3 et 13 sont bonnes:
Code:
Col = Left(ListBox1.List(0), 2) - [B]4[/B]
Remplace le 3 par le 4.

Pour le code du bouton ajouté, j'ai fait au plus simple. Les éléments se rajoutent à la fin de la Listbox. Utilise les SpinButtons pour placer ces derniers dans l'ordre que tu souhaites.
Code:
Private Sub B_AjouInfo_Click()
If Me.ComboCivilite.ListIndex >= 0 And Me.ComboClients.ListIndex >= 0 Then Me.ListBox1.AddItem ComboCivilite & " " & Me.ComboClients
If Me.txtNbrePers <> "" Then Me.ListBox1.AddItem Me.txtNbrePers
If Me.txtTel <> "" Then Me.ListBox1.AddItem Me.txtTel
If Me.txtAdresse <> "" Then Me.ListBox1.AddItem Me.txtAdresse
  
  For Each Ctrl In Me.Controls
    If Ctrl.Tag = "L" Then
      For i = 0 To Controls(Ctrl.Name).ListCount - 1
         If Controls(Ctrl.Name).Selected(i) Then Me.ListBox1.AddItem Controls(Ctrl.Name).List(i)
      Next
    End If
  Next
  
Remise_Zero
End Sub

J'ai rajouté deux tests dans le code du bouton de validation. Ils contôlent si dans le 1er et le dernier élément de la listbox il y a les deux points ":" de l'heure de début et de fin de course.
Cela évite les erreurs, comme ca tu es sur que ta course commence et fini bien par une heure.
Code:
Private Sub B_Valider_Click() 'Valider la course
Dim Col As Integer, lign As Long, k As Long, Rep As String, Concat As String
If Me.ListBox1.ListCount = 0 Then Exit Sub
If InStr(1, ListBox1.List(0), ":") = 0 Then
  MsgBox "Le début de la course n'est pas valide.", vbInformation, "Erreur."
  Exit Sub
End If
If InStr(1, ListBox1.List(ListBox1.ListCount - 1), ":") = 0 Then
  MsgBox "Le fin de la course n'est pas valide.", vbInformation, "Erreur."
  Exit Sub
End If
  
If Me.ComboChauffeurs.ListIndex = -1 Then
    MsgBox "Choisir un chauffeur"
    Exit Sub
End If
'.../...

A+
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
1
Affichages
1 K
Retour