XL 2016 INSERER PHOTOS USERFORM

youpi457032

XLDnaute Occasionnel
Bonjour,
J'ai un userform qui reprend une base de données. Jusque là pas de problème ! tout fonctionne selon mes besoins.
Il me prend l'idée de faire apparaître la photo de chaque élève, c'est à dire nom après nom dans l'userform (formulaire_élève)
Ce formulaire, je l'ai lié à un document word (fiche élève) qui par publipostage reprend les informations voulues.
Comment d'une part dans ma base de données de référence (base_malafretaz) inserer soit les photos soit les liens de celles ci, afin que mon userform les reprenne, et d'autre part pour chaque élève faire apparaître la photo voule dans ma fiche élève Word (construite par publipostage). Chaque élève devant disposer de sa photo sur l'userform ? Et qu'elle s'auto ajuste dans le cadre imposé ?
Le tout en VBA, de préférence au moins pour Excel….
Merci à vous tous pour votre aide ….
 

Pièces jointes

  • essai photos.xlsm
    323.5 KB · Affichages: 34

Dranreb

XLDnaute Barbatruc
Bonjour.
VB:
Option Explicit
Private WithEvents CL As ComboBoxLiées, CA As ControlsAssociés, LCou As Long, TVL()
Private Sub UserForm_Initialize()
   Set CL = CLsCAs.Création.ComboBoxLiées
   Set CA = CLsCAs.Création.ControlsAssociés
   CL.Plage Feuil1.Rows(2), NbCol:=37
   CL.Add Me.T1, 1
   CA.Add Me.T2, 2
   CA.Add Me.T3, 3
   CL.Add Me.T4, 4
   CA.Add Me.T35, 35
   CA.Add Me.photo, 37
'  Ajoutez ici les CA.Add pour tous vos autres contrôles
   CL.Actualiser
    Dim  i&
    T36.List = Feuil2.Range("D2:D" & Feuil2.Range("D" & Rows.Count).End(3).Row).Value
    T37.List = Feuil2.Range("D2:D" & Feuil2.Range("D" & Rows.Count).End(3).Row).Value
    For i = 23 To 34
        Controls("T" & i).List = Feuil2.Range("A2:A" & Feuil2.Range("A" & Rows.Count).End(3).Row).Value
    Next i
   End Sub
Private Sub CL_Change(ByVal Complet As Boolean, ByVal NbrLgn As Long)
   If NbrLgn = 1 Then Exit Sub
   LCou = 0
   ReDim TVL(1 To 1, 1 To CL.PlgTablo.Columns.Count)
   CA.ValeursDepuis TVL
   End Sub
Private Sub CL_Résultat(Lignes() As Long)
   If UBound(Lignes) > 1 Then Exit Sub
   LCou = Lignes(1)
   TVL = CL.PlgTablo.Rows(LCou).Value
   CA.ValeursDepuis TVL
   End Sub
Private Sub Bt1_Click()
   CA.ValeursVers TVL
   If LCou = 0 Then
      LCou = CL.PlgTablo.Rows.Count
      CL.PlgTablo.Rows(LCou).Copy
      CL.PlgTablo.Rows(LCou).Insert
      LCou = LCou + 1
      CL.ValeursVers TVL
      CL.PlgTablo.Rows(LCou).Value = TVL
      CL.Actualiser
   Else
      CL.PlgTablo.Rows(LCou) = TVL
      End If
   End Sub
Private Sub Bt2_Click()
   CL.Nettoyer
   End Sub
Private Sub Bt3_Click()
   If LCou = 0 Then Exit Sub
   If MsgBox("Attention vous allez Supprimer l'élève actuellement sélectionné, êtes vous sur de vouloir Supprimer l'élève??", _
      vbExclamation + vbYesNo, "Suppression d'un élève") = vbNo Then Exit Sub
        If rep = vbNo Then Exit Sub
        rep1 = MsgBox("Attention vous allez Supprimer un élève??, confirmer vous la suppression, action irréversible??", vbCritical + vbYesNo, "Confirmation de Suppression d'un élève")
        If rep1 = vbNo Then Exit Sub
        Feuil1.Rows(T1.ListIndex + 2).Delete Shift:=xlUp
        Bt2_Click
    End If
    CL.PlgTablo.Rows(LCou).Delete xlShiftUp
    CL.Actualiser
   End Sub
Private Sub Bt4_Click()
   Unload Me
   End Sub
Private Sub Facturation_Click()
      règlement_facturation.Show 0
   End Sub
 
Dernière édition:

youpi457032

XLDnaute Occasionnel
Bonjour,
J'entends bien votre commentaire. Je demandais pas forcément la solution ….mais le chemin pour y parvenir….
Merci de votre aide pour la rédaction de la macro . C'est une ecriture VBA que je ne maîtrise pas. Je ne connais pas cette façon d'écrire... c'est assez nouveau pour moi. Je pense que vous avez vu mon code beaucoup plus "Rudimentaire"....
Le votre est complexe, mais plus léger on dirait bien… c'est une façon d'écrire que je vais devoir étudier pleinement à l'avenir...
J'ai copié l'intégralité de votre macro en lieu et place de la mienne dans l'userform Formulaire_élève. J'ai complété les CA.add et CL.add de T1 à T34...
l'exécution me renvoie une erreur dont je joins copie d'écran. Pouvez-vous m'éclairer ?
erreur de compilation.jpg
 

Dranreb

XLDnaute Barbatruc
ComboBoxLiées et ControlsAssociés sont des types d'objets définis par mon CBxLCtlA.xlam.
Son projet VBA CLsCAs doit être coché dans les références du projet de votre classeur.
Je joins à nouveau son classeur précurseur à installer, après une petite modif.
Attention, seules les ComboBox devant faire l'objet d'une recherche dans la plage dont la première ligne est spécifiée au CL.Plage doivent donner lieu à un CL.Add. Pour les ComboBox indépendantes ou dont les listes sont spécifiées d'une autre source, il faut des CA.Add.
Pour le contrôle Image, aussi. Je ne le vois plus, pourquoi ?
 

Pièces jointes

  • CBxLCtlA.xlsm
    174.4 KB · Affichages: 35
Dernière édition:

youpi457032

XLDnaute Occasionnel
ComboBoxLiées et ControlsAssociés sont des types d'objets définis par mon CBxLCtlA.xlam.
Son projet VBA CLsCAs doit être coché dans les références du projet de votre classeur.
Je joins à nouveau son classeur précurseur à installer, après une petite modif.
Attention, seules les ComboBox devant faire l'objet d'une recherche dans la plage dont la première ligne est spécifiée au CL.Plage doivent donner lieu à un CL.Add. Pour les ComboBox indépendantes ou dont les listes sont spécifiées d'une autre source, il faut des CA.Add.
Pour le contrôle Image, aussi. Je ne le vois plus, pourquoi ?


Cool ! un grand Merci.... ! ca fonctionne. J'ai corrigé les contrôles comme indiqués, installer AU BON ENDROIT !!
CBxLCtlA.xlam. ET surtout j'ai remis les styles des combox à 0 au lieux de deux …. forcément….ca va lieux !!!
Donc un grand merci !!!
Je vais m'intéresser à ta vision de l'écriture Macro ! elle me semble intéressante. Je vais pas mal galérer c'est sûr… je suis assez novice en VBA
 

youpi457032

XLDnaute Occasionnel
Voilà, il me reste un gros morceau.
Je voudrais sur la base de ce qui a déjà été fait créer un Userform1 (manifestations)
Je voudrais recenser les élèves volontaires (case à cocher= cochée = volontaire ou OUI, sinon décoché=NON ) pour des évènements.
Une fois recensés mes élèves (feuille "manifestations") via l'userform1 qui lui est dédié, je voudrais pouvoir filtrer ma base (feuille "manifestations") pour n'obtenir que les élèves concernés par un évènement (comme j'ai pu le mettre en place pour le menu filtre des cours existants ). L'idée de base restant la même, ne contacter que les élèves concernés ( via leur mail) par un évènement.
Je joins une fois de plus mon fichier source (Malafretaz_finalisé)…. c'est pour aider à la compréhension…. rien de plus...

Je reviens sur l'insertion photo….. elle fonctionne c est très cool ! je suis même content !!!!++++
mais il me reste un bug ! je ne peux plus enregistrer de nouveau élèves ! ca n'enregistre plus !!! GRRRRRR !!!!
Help… je joins le fichier 'essai photos) …. je comprends pas ce qui se passe…..
 

Pièces jointes

  • essai photos.xlsm
    308.6 KB · Affichages: 32
  • malafretaz finalisé.xlsm
    224.6 KB · Affichages: 40

Dranreb

XLDnaute Barbatruc
Bonjour.
De mon coté j'ai tapé un nom qui n'existait pas dans la ComboBox T1, cliqué sur le bouton BT1: ça m'a bien ajouté une ligne. Mais elle s'est retrouvée en 3ième position. Mais c'est normal. Quand la plage a moins de 2 lignes et n'a pas fait l'objet d'une mise sous forme de tableau, il prend quand même au moins 3 lignes. D'où les vides proposés au début. Alors forcément le processus pour créer une nouvelle ligne à la fin duplique cette ligne vide.
Mais je vois que la référence à CL.PlgTablo n'est pas corrigée par le CL.PlgTablo.Rows(LCou).Insert. Ça ne marche qu'en insérant une ligne entière: CL.PlgTablo.Rows(LCou).EntireRow.Copy suivi de CL.PlgTablo.Rows(LCou).EntireRow.Insert
Mais il vaudrait mieux mettre la base sous forme de tableau: la création d'une ligne se ramènerait à une seule instruction CL.Lignes.Add.Range.Value = TVL. Le ComboBoxLiées détecte en effet un ListObject et reprend à son compte sa propriété ListRows en tant que propriété Lignes. Au CL.Plage on peut alors spécifier simplement la feuille: il comprend qu'il faut en prendre son ListObjects(1)
Pas trop compris l'histoire du filtrage de la base, et je ne pourrait probablement pas faire grans chose car ça semble déboucher sur l'utilisation d'un morceau dont je ne suis pas du tout équipé: Outlook.
 
Dernière édition:

youpi457032

XLDnaute Occasionnel
Bonjour.
De mon coté j'ai tapé un nom qui n'existait pas dans la ComboBox T1, cliqué sur le bouton BT1: ça m'a bien ajouté une ligne. Mais elle s'est retrouvée en 3ième position. Mais c'est normal. Quand la plage a moins de 2 lignes et n'a pas fait l'objet d'une mise sous forme de tableau, il prend quand même au moins 3 lignes. D'où les vides proposés au début. Alors forcément le processus pour créer une nouvelle ligne à la fin duplique cette ligne vide.
Mais je vois que la référence à CL.PlgTablo n'est pas corrigée par le CL.PlgTablo.Rows(LCou).Insert. Ça ne marche qu'en insérant une ligne entière: CL.PlgTablo.Rows(LCou).EntireRow.Copy suivi de CL.PlgTablo.Rows(LCou).EntireRow.Insert
Mais il vaudrait mieux mettre la base sous forme de tableau: la création d'une ligne se ramènerait à une seule instruction CL.Lignes.Add.Range.Value = TVL. Le ComboBoxLiées détecte en effet un ListObject et reprend à son compte sa propriété ListRows en tant que propriété Lignes. Au CL.Plage on peut alors spécifier simplement la feuille: il comprend qu'il faut en prendre son ListObjects(1)
Pas trop compris l'histoire du filtrage de la base, et je ne pourrait probablement pas faire grans chose car ça semble déboucher sur l'utilisation d'un morceau dont je ne suis pas du tout équipé: Outlook.
Bonjour.
De mon coté j'ai tapé un nom qui n'existait pas dans la ComboBox T1, cliqué sur le bouton BT1: ça m'a bien ajouté une ligne. Mais elle s'est retrouvée en 3ième position. Mais c'est normal. Quand la plage a moins de 2 lignes et n'a pas fait l'objet d'une mise sous forme de tableau, il prend quand même au moins 3 lignes. D'où les vides proposés au début. Alors forcément le processus pour créer une nouvelle ligne à la fin duplique cette ligne vide.
Mais je vois que la référence à CL.PlgTablo n'est pas corrigée par le CL.PlgTablo.Rows(LCou).Insert. Ça ne marche qu'en insérant une ligne entière: CL.PlgTablo.Rows(LCou).EntireRow.Copy suivi de CL.PlgTablo.Rows(LCou).EntireRow.Insert
Mais il vaudrait mieux mettre la base sous forme de tableau: la création d'une ligne se ramènerait à une seule instruction CL.Lignes.Add.Range.Value = TVL. Le ComboBoxLiées détecte en effet un ListObject et reprend à son compte sa propriété ListRows en tant que propriété Lignes. Au CL.Plage on peut alors spécifier simplement la feuille: il comprend qu'il faut en prendre son ListObjects(1)
Pas trop compris l'histoire du filtrage de la base, et je ne pourrait probablement pas faire grans chose car ça semble déboucher sur l'utilisation d'un morceau dont je ne suis pas du tout équipé: Outlook.
Ok, je vais faire les correctifs nécessaires.
quant à la partie filtrage par évènement je m'explique.
Actuellement j'ai ma base de données élèves. J'ai un filtre qui me permet de trier mes élèves par cours. Je choisis le ou les cours et il me sort le listing des élèves concernés. Ensuite je n'ai plus qu'à lancer ma macro mail qui me permet de lancer en effet Outlook pour les contacter.
Cette partie filtre et mail, je la maitrise, pas de soucis.
Ce qu'il me faudrait c'est la macro pour constituer la base de données (en feuille manifestations) a partir de l'Userform1 (manifestations). Voir la pièce jointe fournie ci dessus. Je ne sais pas coder avec les cases à cocher !
exemple, quand je coche Gala, je voudrais que dans ma base de données, l'elève soit répertorié comme participant. Si la case est décochée, il ne participe pas. Et cette procédure pour chaque case à cocher. Ensuite il me resterait plus qu'à construire le filtre pour trier par évènement(s)...etc...
Voilà l'idée… tu peux m'aider à coder la partie Formulaires seulement (juste cette partie là). ?
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Et cette deuxième base ne peut-elle pas être aussi mise à jour par une paire d'objets ComboBoxLiées et ControlsAssociés ?
Ce dernier supporte les CheckBox. On peut spécifier au Add derrière la colonne une liste de trois textes déparé par des points virgules à appliquér pour ses valeurs possibles True, False et Null. Par défaut il prend "×;;#N/A".
 

youpi457032

XLDnaute Occasionnel
Bonjour.
Et cette deuxième base ne peut-elle pas être aussi mise à jour par une paire d'objets ComboBoxLiées et ControlsAssociés ?
Ce dernier supporte les CheckBox. On peut spécifier au Add derrière la colonne une liste de trois textes déparé par des points virgules à appliquér pour ses valeurs possibles True, False et Null. Par défaut il prend "×;;#N/A".

peux tu coder une ligne….que je comprenne la méthode ? Stp
 

Discussions similaires

Statistiques des forums

Discussions
311 720
Messages
2 081 915
Membres
101 837
dernier inscrit
Ugo