Evolution d'un UseForm suivant le contenu d'un tableau
#1
Débutant XLPages

Inscription: 10/08/2009

Messages: 11

Système d'exploitation:
PC
Version Excel utilisée:
2003
Posté le : 10-08-2009 22h01
Bonjour,

Débutant en VBA depuis une petite semaine (mais ayant déjà une petit expérience dans d'autres languages), je me lance actuellement dans la contruction d'un gros fichier Excell pour mon travail.

Ce fichier, pour placer le contexte, contiendra de multiples pages référencant des clients, et chaque page contenant une liste des prestations proposées à ce client.
Jusqu'à présent j'ai, par l'intermédiaire d'une ComboBox, listé les clients en question et su mettre en relation client et page contenant le tableau des prestations. Je me demande maintenant comment faire pour qu'à partir de cette page, Excell "lise" la liste des prestation présente, et ajoute pour chacune d'elle un "Label" contenant la prestation en question, précédé ou suivi d'une petite "TextBox" où indiquer la quantité choisie pour cette prestation.

Ceci donc quel que soit le nombre de prestation proposé pour le client en question.

Dans mon exprit la feuille "UseForm" sera donc "evolutive", et changera suivant le client designé dans la première "ComboBox", sachant que chaque client de recoit pas les mêmes prestations.


Voile ça fait beaucoup de " " et j'espère ne pas être trop confus dans mes propos, je reste de toute façon scotché au forum dans l'attente d'une réponse ^^

Merci d'avance !
Hors Ligne
Rapport   Haut 

Re: Evolution d'un UseForm suivant le contenu d'un tableau
#2
Webmestre

Inscription: 18/05/2006
De Saône-et-Loire (71)

Messages: 1539

Système d'exploitation:
PC
Version Excel utilisée:
97, 2000, 2002, 2003, 2007, 2010, 2013, 2016 et 365
Posté le : 10-08-2009 22h08
Bonsoir et bienvenue à toi dedechseb,

Tu as oublié de joindre ton fichier...

Le cas échéant, merci de consulter CE LIEN. Rappel : le fichier (si possible zippé) doit avoir un poids maximum de 80 ko.

Cordialement,

Didier_mDF
Image redimensionnée
Le Webmaster

La réponse vous satisfait ? Merci de revenir solder le sujet en [résolu], voir ce lien
Hors Ligne
Rapport   Haut 

Re: Evolution d'un UseForm suivant le contenu d'un tableau
#3
Débutant XLPages

Inscription: 10/08/2009

Messages: 11

Système d'exploitation:
PC
Version Excel utilisée:
2003
Posté le : 10-08-2009 22h13
Re-Bonsoir ,

En fait je n'ai pas joint le fichier car il peut contenir certaines données confidentielles. En revanche je peux peut-être monter un autre fichier "exemple" avec  des données bidons afin que vous m'expliquiez la démarche sur celui-ci ?

Dans ce cas le temps que je le crée, je le déposerai d'ici une petite heure.
Hors Ligne
Rapport   Haut 

Re: Evolution d'un UseForm suivant le contenu d'un tableau
#4
Webmestre

Inscription: 18/05/2006
De Saône-et-Loire (71)

Messages: 1539

Système d'exploitation:
PC
Version Excel utilisée:
97, 2000, 2002, 2003, 2007, 2010, 2013, 2016 et 365
Posté le : 10-08-2009 22h23
Re,

Je pense que ce serait préférable oui, afin que nous puissions voir notamment la structure de tes onglets et listes de prestations (sans données confidentielles, cela va de soit).
Par ailleurs, je pense qu'il serait aussi intéressant de préciser le nombre maximum de prestations qu'un client pourrait se voir proposer.
Je t'avoue que pour un tout débutant VBA, tu attaques un projet d'envergure... Pour moi, t'orienter sur une façon de faire ou une solution possible, pas de problème, mais il va falloir que tu remontes tes manches...

Cordialement,

Didier_mDF
Image redimensionnée
Le Webmaster

La réponse vous satisfait ? Merci de revenir solder le sujet en [résolu], voir ce lien
Hors Ligne
Rapport   Haut 

Re: Evolution d'un UseForm suivant le contenu d'un tableau
#5
Débutant XLPages

Inscription: 10/08/2009

Messages: 11

Système d'exploitation:
PC
Version Excel utilisée:
2003
Posté le : 10-08-2009 23h09
Re-à-nouveau ^^

Bon j'ai épuré mon fichier, en laissant la "feuille de saisie" originelle, mais en retirant toute donnée confidentielle.

Donc dans cet exemple plusieurs petites choses à dire:

-D'une part je ne sais pas pourquoi, mais le menu déroulant des clients qui marchait bien jusqu'à présent a décidé de ne plus afficher les noms... Il y'a le nombre de ligne nécessaire, mais plus les noms sur chaque ligne.

- D'autre part, je n'ai encore relié à rien tous les autres boutons, checkbox et autres zones de texte du Useform. je vais m'atteler à cela demain quand je serai en plus grande forme.

Il y'a donc juste le strict nécessaire pour réaliser ce que j'aimerai obtenir (non pas par flemme mais je ne savais pas trop quoi remplir).

-Il y'a donc deux pages : Client 1 et Client 2, contenant chacune un exemple de prestations (totalement bidons et sans réalité avec mon travail, mais j'étais en grand manque d'inspiration). Sur la page Client 2 vous remarquerez une petite variante, qui pourra être redivisé en deux lignes "feutre noirs" et "feutres rouges" si cela pose trop de problèmes.


Je conçois bien que pour un débutant, je m'attaque à très gros, mais je comprends très vite et suis très motivé pour mener à bien au plus vite ce projet qui permettra à mon équipe de travailler bien plus rapidemment ensuite.

Voilà je vais vous quitter là pour aujourd'hui, si vous jettez un oeil à ce document ce soir, je répondrai à toute interrogation dès demain matin au cas où vous auriez besoin de précisions.

D'avance merci pour le temps que vous m'accorderez !

Bonne fin de soirée.



Pièce jointe:
xls Saisie Bon de Commande.xls   [ Taille: 56.50 Ko - Téléchargements: 511 ]
Hors Ligne
Rapport   Haut 

Re: Evolution d'un UseForm suivant le contenu d'un tableau
#6
Webmestre

Inscription: 18/05/2006
De Saône-et-Loire (71)

Messages: 1539

Système d'exploitation:
PC
Version Excel utilisée:
97, 2000, 2002, 2003, 2007, 2010, 2013, 2016 et 365
Posté le : 11-08-2009 03h24
Re,

Tu trouveras ci-joint ton fichier modifié pour tenter de répondre à ton souhait...

J'ai utilisé le code suivant (dans le module de code du Userform) :
Option Explicit
'myDearFriend!  -  www.mdf-xlpages.com

Private Sub UserForm_Initialize()
Dim DerLign As Long
    'Remplir la combo Clients
    With Enseigne
        .ColumnCount = 2        'la combo aura 2 colonnes
        .BoundColumn = 2        'la propriété Value tirera sa valeur de la 2ème colonne
        .ColumnWidths = ";0 pt" 'la 2ème colonne sera masquée à l'affichage utilisateur
    End With
    With Sheets("Données")
        'La plage B5:C7 (ou plus...) sera affectée à la combo
        DerLign = .Cells(.Rows.Count, 2).End(xlUp).Row
        Enseigne.List = .Range(.Cells(5, 2), .Cells(DerLign, 3)).Value
    End With
End Sub

Private Sub Enseigne_Change()
Dim DerLign As Long
    If Enseigne.ListIndex > -1 Then
        lstPrestations.Clear
        With Sheets(Enseigne.Value)
            DerLign = .Cells(.Rows.Count, 2).End(xlUp).Row
            lstPrestations.List = .Range(.Cells(1, 1), .Cells(DerLign, 3)).Value
        End With
    End If
End Sub

Private Sub lstPrestations_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim Q As String
    'Saisir la quantité
    With lstPrestations
        Q = Application.InputBox("Quelle quantité de " & .List(.ListIndex, 1) & " ?", "Quantité", .List(.ListIndex, 2), Type:=1)
        If Q <> "Faux" Then     'Choix <> Annuler
            .List(.ListIndex, 2) = IIf(Val(Q) > 0, Q, "")
        End If
    End With
End Sub

Private Sub btnQuantites_Click()
'J'ai ajouté ce bouton uniquement pour que tu puisses comprendre comment récupérer à la fin les quantités saisies
Dim T As String
Dim L As Byte
    With lstPrestations
        'Si la liste contient des lignes
        If .ListCount > 0 Then
            'Pour chaque ligne de la liste
            For L = 0 To .ListCount - 1
                'Si présence d'une quantité
                If .List(L, 2) <> "" Then
                    T = T & .List(L, 2) & " - " & .List(L, 1) & vbLf
                End If
            Next L
        End If
    End With
    'On affiche le résumé
    If T <> "" Then
        MsgBox T
    Else
        MsgBox "Aucune quantité n'a été saisie !"
    End If
End Sub
Pour que sa puisse être jouable, j'ai dû revoir un peu la structure des onglets "Client...".

Comme tu le verras, j'ai choisi la solution la plus simple : une listbox pour pouvoir afficher simplement un nombre variable d'éléments. La saisie des quantités est ensuite possible par un simple double-clic dans cette liste.

Une autre solution aurait consisté à une création dynamique de contrôles TextBox et Labels. Mais, compte tenu de tes débuts VBA, je te déconseille fortement ce type de solution assez délicate à mettre en oeuvre et nécessitant la modification d'un paramètre de sécurité sur chaque poste devant utiliser le classeur...

Quelques points si tu le permets et puisque tu débutes avec VBA :

Citation :
dedechseb a écrit :
-D'une part je ne sais pas pourquoi, mais le menu déroulant des clients qui marchait bien jusqu'à présent a décidé de ne plus afficher les noms... Il y'a le nombre de ligne nécessaire, mais plus les noms sur chaque ligne.

Cette mauvaise surprise est causée par la propriété RowSource que tu as utilisée pour charger la ComboBox. Si la feuille active est bien la feuille "Données" au moment où tu affiches ton Userform, alors la RowSource "B5:B...." fonctionnera bien, mais si la feuille active n'est pas la bonne, ta RowSource ne pointera plus au bon endroit !
Tu peux normalement contourner ce problème en nommant au préalable ta plage de cellules, puis en affectant le nom de cette plage à la propriété RowSource (en lieu et place de l'adresse de plage).

Cela dit, la meilleur méthode consiste tout simplement à proscrire l'utilisation de cette propriété RowSource. Je te conseille de regarder la méthode AddItem en particulier ou même de faire directement comme je l'ai fait dans le code ci-dessus : on affecte directement les valeurs de toute la plage dans la propriété List de la ComboBox.
Cela se passe dans le passage suivant :
   With Sheets("Données")
        'La plage B5:C7 (ou plus...) sera affectée à la combo
        DerLign = .Cells(.Rows.Count, 2).End(xlUp).Row
        Enseigne.List = .Range(.Cells(5, 2), .Cells(DerLign, 3)).Value
    End With

Par ailleurs, je te recommande fortement l'utilisation de Option Explicit placé en tête de module (comme ci-dessus). Voir le cas échéant, l'explication qui en est faite dans l'article VBA et les variables.

Si tu as besoin d'explications complémentaires sur le code que j'ai utilisé plus haut, n'hésite pas.
Je te laisse reprendre en main ton projet maintenant et te souhaite un bon développement

Cordialement,

Pièce jointe:
zip PourDedechseb.zip   [ Taille: 17.98 Ko - Téléchargements: 496 ]

Didier_mDF
Image redimensionnée
Le Webmaster

La réponse vous satisfait ? Merci de revenir solder le sujet en [résolu], voir ce lien
Hors Ligne
Rapport   Haut 

Re: Evolution d'un UseForm suivant le contenu d'un tableau
#7
Débutant XLPages

Inscription: 10/08/2009

Messages: 11

Système d'exploitation:
PC
Version Excel utilisée:
2003
Posté le : 11-08-2009 08h17
Bonjour,

Ca me parait super, et correspond tout à fait à ce que j'aimerai obtenir.

Je vais jetter un oeil au code afin de m'impregner de la logique du système, et essayer de continuer à avancer de mon côté.
Je pense que je vais tenir à jour mon fichir privé et cet exemple en parallèle, afin de pouvoir me retourner vers vous en cas de problème.

En tout cas merci pour le temps que vous m'avez accordé, je passe le sujet en [résolu] !

Bonne journée, et au plaisir
Hors Ligne
Rapport   Haut 

Re: Evolution d'un UseForm suivant le contenu d'un tableau
#8
Débutant XLPages

Inscription: 10/08/2009

Messages: 11

Système d'exploitation:
PC
Version Excel utilisée:
2003
Posté le : 11-08-2009 18h12
Bonsoir,

Je reviens à la charge avec mon sujet, qui a légèrement évolué depuis hier soir. J'ai plutôt bien saisi les manipulations faites, les commentaires aidant bien.

Voilà, aujourd'hui où j'en suis : 

 - J'ai donc différents Clients, et pour chaque Client une page lui correspondant avec les différentes prestations proposées. Chaque prestation correspondant à une catégorie : Fournitures, Informatique, Alimentation ...
J'ai un petit cadre avec des CheckBox en relation avec ces prestations : CheckBox "Fournitures",  CheckBox "Informatique" ...
J'aimerai qu'en cochant et décochant ces CheckBox, la TextBox indiquant les prestation proposées au client évlue donc pour ne montrer que les prestations des catégories cochées.

Jusqu'à présent j'ai pu afficher différentes prestations pour différentes CheckBox cochées, mais jamais un cumul des prestations lorsque plusieurs CheckBox sont cochées en même temps.

- D'autre part, j'ai fait évoluer un peu aussi mon fichier au niveau de la ComboBox "Chargées de la Relation Client". Celle-ci, dans mon fichier perso, se rempli correctement, suivant le Client choisi, mais dans le fichier exemple ci-joint rien n'y apparait. La méthode que j'ai utilisée doit surement êtr perfectible, s'il vous est possible de m'éclairer un peu là dessus...


Voilà donc pour mes questions du jour ^^

J'espére ne pas vous donner l'impression de me reposer entièrement sur vous pour réaliser mon travail, je cherche le plus possible de mon coté mais ces quelques points bien spécifiques restent sans réponses dans les forums et tutoriels que j'ai pu visités.

Merci d'avance pour votre aide, et bonne soirée.


Pièce jointe:
xls PourDedechseb.xls   [ Taille: 69.50 Ko - Téléchargements: 432 ]
Hors Ligne
Rapport   Haut 

Re: Evolution d'un UseForm suivant le contenu d'un tableau
#9
Webmestre

Inscription: 18/05/2006
De Saône-et-Loire (71)

Messages: 1539

Système d'exploitation:
PC
Version Excel utilisée:
97, 2000, 2002, 2003, 2007, 2010, 2013, 2016 et 365
Posté le : 11-08-2009 20h36
Bonsoir dedechseb,

Ci-joint une façon de faire pour ta liste de prestations filtrée en fonction des CheckBox.

J'ai ajouté le code suivant à ton Userform (en remplacement de ton code) :
Private Sub Alimentation_Click()
    MAJliste
End Sub

Private Sub Entretien_Click()
    MAJliste
End Sub

Private Sub Fournitures_Click()
    MAJliste
End Sub

Private Sub Informatique_Click()
    MAJliste
End Sub

Private Sub PDP_Click()
    MAJliste
End Sub

Private Sub MAJliste()
Dim Sh As Worksheet
Dim Ctrl As String
Dim DerLign As Long, L As Long
Dim Ok As Boolean
    'On mémorise la feuille cible
    Set Sh = Sheets(Enseigne.Value)
    With lstPrestations
        .Clear
        DerLign = Sh.Cells(Sh.Rows.Count, 3).End(xlUp).Row
        'Pour chaque ligne de prestations
        For L = 1 To DerLign
            If Sh.Cells(L, 1).Text <> "" Then               'S'il s'agit d'une catégorie principale
                Ok = Controls(Sh.Cells(L, 1).Text).Value    'On vérifie si elle doit être prise en compte ou non
            End If
            If Ok Then                                      'Si prise en compte...
                .AddItem Sh.Cells(L, 2).Text
                .List(.ListCount - 1, 1) = Sh.Cells(L, 3).Text
            End If
        Next L
    End With
End Sub
Attention toutefois : cette méthode nécessite que le nom de tes contrôles CheckBox correspondent exactement aux titres de catégories qu'on retrouve dans les feuilles Clients... Attention donc lorsque tu vas renommer l'ensemble pour correspondre à la réalité de ton projet !

Citation :
dedechseb a écrit :

- D'autre part, j'ai fait évoluer un peu aussi mon fichier au niveau de la ComboBox "Chargées de la Relation Client". Celle-ci, dans mon fichier perso, se rempli correctement, suivant le Client choisi, mais dans le fichier exemple ci-joint rien n'y apparait. La méthode que j'ai utilisée doit surement êtr perfectible, s'il vous est possible de m'éclairer un peu là dessus...

A vrai dire, je n'ai pas compris ce passage là... Pourquoi faire une Combo pour le Chargé de Relation Client puisque, visiblement, dans l'onglet Données, il n'y a qu'un seul Chargé de Rel. Client par client ?
Si ce n'est pas le cas, alors comment va se présenter cet onglet Données dans de tels cas ?
Ou bien alors, tu veux laisser la possibilité d'en choisir un autre dans le Userform, mais dans ce cas, il manque une table de l'ensemble des Chargés de Rel. Client quelque part...

Citation :
dedechseb a écrit : Voilà donc pour mes questions du jour ^^

J'espére ne pas vous donner l'impression de me reposer entièrement sur vous pour réaliser mon travail, je cherche le plus possible de mon coté mais ces quelques points bien spécifiques restent sans réponses dans les forums et tutoriels que j'ai pu visités.
J'apprécie en tout cas les efforts personnels visibles que tu as fourni sur ton projet... Cela dit, effectivement, je ne vais pas pouvoir m'investir de trop dans ton projet car se plonger dans le code de quelqu'un d'autre, ce n'est pas un exercice très facile et ça demande aussi et surtout beaucoup de temps. Et comme ton projet va naturellement se développer et donc se compliquer davantage...


Bien cordialement,
Pièce jointe:
zip PourDedechseb2.zip   [ Taille: 22.21 Ko - Téléchargements: 473 ]

Didier_mDF
Image redimensionnée
Le Webmaster

La réponse vous satisfait ? Merci de revenir solder le sujet en [résolu], voir ce lien
Hors Ligne
Rapport   Haut 

Re: Evolution d'un UseForm suivant le contenu d'un tableau
#10
Débutant XLPages

Inscription: 10/08/2009

Messages: 11

Système d'exploitation:
PC
Version Excel utilisée:
2003
Posté le : 11-08-2009 21h07
Re-Bonsoir,

Effectivement je n'ai pas été forcément très clair concernant ma deuxième remarque.
En effet chaque Client "possède" sa propre Chargée de Relation. Le truc c'est que parfois elle s'échangent ponctuellement les Clients, donc même si elles restent l'interlocutrice personnelle d'un client, d'autres sont parfois amenées à les remplacer pour certaines affaires.

Je cherchait en fait à faire en sorte que la ComboBox affiche par défaut la Chargée de Relation indiquée dans la liste, et permette de choisir tout de même une autre personne dans le menu déroulant.

J'ai réalisé quelque chose qui marche, bien que je ne l'ai pas mis sur ce fichier, en suivant la forme suivante :

-la procédure compare la valeur de la ComboBox "Enseigne" avec la liste des clients. Lorsque Enseigne.Value = Range(xxxx).Value, alors la ComboBox affiche la chargée de la relation client désignée.

- ensuite c'est un entassement de "If" par rapport à un petit tableau regroupant les chargées de la Relation afin de comparer pour chacune si elle est l'Interlocutrice affichée dans la ComboBox. Si non, alors un AddItem ajoute son nom à la liste de la ComboBox.

C'est un procédé assez lourd en écriture et pas forcément très "optimisé" au niveau programation ^^, je voulais donc avoir votre vision de la chose afin de comparer les logiques et épurer mes lignes de code.


Voilà j'espère à nouveau ne pas avoir été trop confus dans mes explications ^^.

J'aurai aussi aimé savoir ou est ce que je peux trouver des explication sur les différentes propriété que vous utilisez tels que les .Rows, les .Count,  les .ListCount ....  Car visiblement leur bonne utilisation est une des cléf d'une programation efficace.

Bonne soirée !
Hors Ligne
Rapport   Haut 


Vous pouvez voir les sujets.
Vous ne pouvez pas débuter de nouveaux sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

[Recherche avancée]


Qui consulte actuellement ce sujet ?   1 Utilisateur(s) anonymes