XL 2016 INSERER PHOTOS USERFORM

youpi457032

XLDnaute Junior
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 ….
 

Fichiers joints

Dranreb

XLDnaute Barbatruc
Bonsoir.
Mon objet ControlsAssociés accepte désormais les contrôles Image.
*** pièce jointe supprimée ***
 
Dernière édition:

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 Junior
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 ?
 

Fichiers joints

Dernière édition:

youpi457032

XLDnaute Junior
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 Junior
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…..
 

Fichiers joints

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 Junior
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 Junior
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
 

Dranreb

XLDnaute Barbatruc
Ben par exemple CA.Add Me.CkxToto, "Titre", "Oui!;Non.;?"
À tester, ça n'a encore jamais trouvé d'application.
Pour les Image on peut spécifier un dossier, et pour la plupart des autres contrôles un format d'affichage du texte. C'est pourquoi cet argument facultatif s'appelle Fmt.
Le "Titre" en guise de spécification de colonne n'est applicable que si un ListObject couvre la plage, c'est à dire si celle ci a fait l'objet
d'une mise sous forme de tableau. Mais pour que ça marche il faut affecter par un Set à la propriété Colonnes du ControlsAssociés celle du ComboBoxLiées. Seul ce dernier a les billes au départ grâce à sa méthode Plage qui analyse ce qu'il doit prendre comme données.
 
Dernière édition:

youpi457032

XLDnaute Junior
Ben par exemple CA.Add Me.CkxToto, "Titre", "Oui!;Non.;?"
À tester, ça n'a encore jamais trouvé d'application.
Le "Titre" en guise de spécification de colonne n'est applicable que si un ListObject couvre la plage, c'est à dire si celle ci a fait l'objet
d'une mise sous forme de tableau.
Pour les Image on peut spécifier un dossier, et pour la plupart des autres contrôle un format d'affichage du texte. C'est pourquoi cet argument facultatif s'appelle Fmt.
Je nage….
je voudrais du coup faire plus simple avec ce que je possède déjà….sinon je ne vais pas y arriver….
j'ai pas mal avancé sur mon projet ce soir…. j'ai construit mon userform et la base associée….
il me reste plus qu'à bâtir la fonction filtre….
je possède déjà une fonction filtre sur une autre base qui fonctionne très bien… elle compare les données pour chaque ligne, colonne après colonne, à une plage de référence L1. Si les données contenues dans la base sont identiques à la plage de valeur de rérence, il affiche dans une fenêtre L2 les résultats, et surtout les copie dans une feuille distincte… Je voudrais reprendre ce schéma de fonctionnement.
Sauf qu'avec des checkbox (case à cocher) en Userform le résultat renvoyer n'est pas le même que celui des TXT, CBBox…
il me faut absolument pouvoir faire dire à mes ChKbox que si activées alors la valeur est ="GALA", par exemple. Comme ca il écrit gala dans la cellule concernée, je retrouve une valeur qui est connue de mon filtre et le tour est joué, je m'en sors…
EX si pour le nom 1 (ligne 1 en fait), Case a cocher Gala cochée, écrire dans la BDD concernée, colonne Gala "GALA" sinon rien.
peux tu m'aider a coder ca...
Si T5 Coché ecrire "GALA sinon rien.
SI T6 coché écrire Soirée dansante, sinon rien
Si T7 cochée écrire OLA chikita, sinon rien
Peux tu m'aider à coder ça STP
je te mets en copie le code qui doit faire fonctionner cela… de l'USERFOM vers la feuille "Manifestations"

[CODE\]
Option Explicit
Private Sub Bt1_Click()
Dim Lig&, i&
If T1 = "" Or T2 = "" Then MsgBox "Vous devez au minimum remplir le nom et le pr?nom pour pouvoir enregistrer un ?l?ve!!", vbCritical, "Manque de donn?e": Exit Sub
With Feuil6
If T1.ListIndex <> -1 Then
Lig = T1.ListIndex + 2
For i = 1 To 17
If i = 10 Or i = 11 Or i = 15 Or i = 18 Or i = 21 Then .Cells(Lig, i) = Controls("T" & i): GoTo 1
If IsNumeric(Controls("T" & i)) Then
.Cells(Lig, i) = CDbl(Controls("T" & i))
Else
.Cells(Lig, i) = Controls("T" & i)
End If
1 Next i
Else
Lig = .Range("A" & Rows.Count).End(3).Row + 1
For i = 1 To 17
If i = 10 Or i = 11 Or i = 15 Or i = 18 Or i = 21 Then .Cells(Lig, i) = Controls("T" & i): GoTo 2
If IsNumeric(Controls("T" & i)) Then
.Cells(Lig, i) = CDbl(Controls("T" & i))
Else
.Cells(Lig, i) = Controls("T" & i)
End If
2 Next i
End If
End With
End Sub
Private Sub Bt2_Click()
Unload Me
End Sub
Private Sub Bt3_Click()
Dim rep, rep1
If T1.ListIndex <> -1 Then
rep = MsgBox("Attention vous allez Supprimer l'?l?ve actuellement s?lectionn?, ?tes vous sur de vouloir Supprimer l'?l?ve??", vbCritical + vbYesNo, "Suppression d'un ?l?ve")
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
Feuil6.Rows(T1.ListIndex + 2).Delete Shift:=xlUp
Bt2_Click
End If
End Sub
Private Sub Bt4_Click()
Unload Me
End Sub
Private Sub Filtre_manif_Click()
Filtre_manifestations.Show 0
End Sub
Private Sub T1_Click()
Dim Lig&, i&
If T1.ListIndex <> -1 Then
Lig = T1.ListIndex + 2
For i = 1 To 17
Controls("T" & i) = Feuil6.Cells(Lig, i).Value
Next i
End If
End Sub

Private Sub T360_BeforeDragOver(ByVal Cancel As MSForms.ReturnBoolean, ByVal Data As MSForms.DataObject, ByVal x As Single, ByVal Y As Single, ByVal DragState As MSForms.fmDragState, ByVal Effect As MSForms.ReturnEffect, ByVal Shift As Integer)
End Sub
Private Sub UserForm_Initialize()

Worksheets("manifestations").Range("A2:C600").Value = Worksheets("base_MALAFRETAZ").Range("A2:C600").Value
Worksheets("manifestations").Range("D2:D600").Value = Worksheets("base_MALAFRETAZ").Range("P2:p600").Value

Dim aa, fin&, i&
With Feuil6
fin = .Range("A" & Rows.Count).End(3).Row
If fin < 2 Then Exit Sub
aa = .Range("A2:AC" & fin)
End With
T1.ColumnCount = 2
T1.List = aa
End Sub
[/CODE]

Je veux que mes T qui sont des chekbox ne renvoie pas 0 ou -1, Vrai ou faux....
je veux qu'elle renvoie pour chaque T différend une valeur bien définie
T5 soirée dansante. sinon Vide
T6 gala, sinon vide
T7 Ola chikita, sinon vide
T8 base de loisir, sinon vide
ETc.….pour chaque TXt….
c'est ca que je cherche a faire….
 

Dranreb

XLDnaute Barbatruc
Oh ben non, vous avez maintenant un outils qui ventile tout seul des valeurs de controles associés à un jeu de ComboBox liées genre Nom, Prénom et Date de naissance, vous n'allez pas employer autre chose quand même ?
Note: le ControlsAssociés s'occupe de convertir en nombre les textes numériques de TextBox, sauf si on spécifie Fmt:="&" au Add, signifiant expressément qu'on les veut sous forme de textes.
 
Dernière édition:

youpi457032

XLDnaute Junior
Je ne sais pas super bien coder….je bidouille !
J'aime bien votre code…. mais je sais pas le transposer à mes chekbox !!!
En fait je suis perdu là….
je devrais faire autrement qu'avec les contrôle checkbox…. c'est dommage, je les trouvais simples et efficaces...
 

youpi457032

XLDnaute Junior
Je ne sais pas super bien coder….je bidouille !
J'aime bien votre code…. mais je sais pas le transposer à mes chekbox !!!
En fait je suis perdu là….
je devrais faire autrement qu'avec les contrôle checkbox…. c'est dommage, je les trouvais simples et efficaces...
Oh ben non, vous avez maintenant un outils qui ventiles tout seul des valeurs de controles associés à un jeu de ComboBox liées genre Nom, Prénom et Date de naissance, vous n'allez pas employer autre chose quand même ?
Note: le ControlsAssociés s'occupe de convertir en nombre les textes numériques de TextBox.
Oh ben non, vous avez maintenant un outils qui ventiles tout seul des valeurs de controles associés à un jeu de ComboBox liées genre Nom, Prénom et Date de naissance, vous n'allez pas employer autre chose quand même ?
Note: le ControlsAssociés s'occupe de convertir en nombre les textes numériques de TextBox.
Je ne sais pas super bien coder….je bidouille !
J'aime bien votre code…. mais je sais pas le transposer à mes chekbox !!!
En fait je suis perdu là….
je devrais faire autrement qu'avec les contrôle checkbox…. c'est dommage, je les trouvais simples et efficaces...

 

Créez un compte ou connectez vous pour répondre

Vous devez être membre afin de pouvoir répondre ici

Créer un compte

Créez un compte Excel Downloads. C'est simple!

Connexion

Vous avez déjà un compte? Connectez vous ici.

Haut Bas