Modélisation Des Liaisons Entre Userform Et Table De Données Excel ...
Maybe your like
Navigation
Dernière
Discussion : Modélisation des liaisons entre userform et table de données Excel (tableau structuré) Sujet :
Dernière


Inscrivez-vous gratuitementpour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter
- Vous n'êtes pas encore inscrit sur Developpez.com ? Inscrivez-vous gratuitement !
- Recherche avancée

- Forum
- Logiciels
- Microsoft Office
- Excel
- Contribuez
- Modélisation des liaisons entre userform et table de données Excel (tableau structuré)
Dernière
- Aller à la page:
Discussion : Modélisation des liaisons entre userform et table de données Excel (tableau structuré) Sujet : Contribuez
- Outils de la discussion
- Afficher une version imprimable
- S'abonner à cette discussion…
- Affichage
- Mode linéaire
- Choisir le mode hybride
- Choisir le mode arborescent
- 28/12/2019, 09h40 #1 Pierre Fauconnier
Rédacteur/Modérateur 







Formateur et développeur chez EXCELLEZ.netInscrit enNovembre 2003Messages19 125
Détails du profil
Informations personnelles :Sexe :
Âge : 59Localisation : BelgiqueInformations professionnelles :Activité : Formateur et développeur chez EXCELLEZ.netSecteur : EnseignementInformations forums :Inscription : Novembre 2003Messages : 19 125Billets dans le blog131
Modélisation des liaisons entre userform et table de données Excel (tableau structuré) Salut. Pour répondre à la question fréquente sur nos forums "Comment lier un userform à un tableau structuré?" et pour faire écho à la contribution de Qwazerty, je propose ici une modélisation des interactions entre un userform et une table de données (appelée aussi Tableau structuré Excel). Pour celles et ceux qui ne voient pas bien ce qu'est un tableau structuré, je propose la lecture de mon tuto sur le sujet. Je précise qu'en 2019, il me semble aberrant de continuer à travailler avec Excel sans tableaux structurés. Je vois encore passer trop souvent des codes qui utilisent des lignes telles que TblBD = f.Range("D8:H" & f.[D65000].End(xlUp).Row) alors que cela fait 12 ans que les tableaux structurés existent et permettent de s'affranchir d'un code lourd, d'une liaison des données à une feuille et d'un bornage des données sur une colonne bien précise. C'est du passé, tout cela, et il est temps d'utiliser les outils actuels d'Excel qui allègent l'écriture du code et facilitent la maintenance et l'évolution de l'application. Cette contribution découle du fait que l'on réinvente souvent la roue lorsqu'il s'agit de lier userform et tableau structuré, alors qu'en fait, le processus est toujours le même:
- Dans le sens Table vers Userform, il faut alimenter les contrôles du userform avec les données d'une ligne précise de la table;
- Dans le sens Userform vers Table, il faut alimenter les cellules d'une ligne précise de la table avec les données du userform.
Dans ce userform, nous voyons une liste déroulante qui s'appuie sur une table de données monocolonne contenant les fonctions qu'il est possible d'attribuer à un contact. Nous devons pouvoir, à l'aide du userform: - créer un nouvel enregistrement;
- supprimer un enregistrement;
- aller à l'enregistrement suivant;
- aller à l'enregistrement précédent;
- aller à l'enregistrement qui se trouve à la position x;
- enregistrer les modifications du contact ou les données du nouveau contact;
- quitter le userform.
- GotoNew;
- Delete;
- GotoNext;
- GotoPrevious;
- GotoRecord;
- UpdateTable;
- UpdateUsf.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
Dans le cadre d'une contribution, je n'explique pas en détails chaque procédure. Normalement, la lecture du code suffit à le comprendre. On remarquera que les actions sont réalisées par des fonctions, car le userform pourra se servir des valeurs renvoyées par les fonctions du DataUsfManager pour informer l'utilisateur, notamment. Je précise toutefois que l'array de mappage est créé "transposé". cela veut dire qu'il contient deux lignes (une pour le nom du contrôle du usf, une pour le nom de la colonne de la table) et autant de colonnes qu'il y a de paires contrôle/colonne. Je vous expliquerai plus loin pourquoi j'ai procédé ainsi. Vous pouvez vous rendre compte de cela dans les deux procédures UpdateTable et UpdateUsf. Vous remarquez aussi qu'il n'y a qu'une fois la procédure de transfert usf=>table. Le userform va embarquer un objet de type DataUsfManager et ce dernier sera appelé et manipulé lors des clics sur les différents boutons ou lors de la modification du numéro de l'enregistrement que l'on souhaite atteindre. Ici aussi, le code est à mon avis assez parlant. J'utilise ici l'évènement Initialize ud userform pour créer l'objet de type DataUsfManager. On remarque que les codes évènementiels des boutons pour les actions liées à la table se servent des valeurs renvoyées par le DataUsfManager pour afficher des messages à l'utilisateur.12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 Option Explicit Public Map Private mIndex As Long Private mTable As ListObject Private mUsf As UserForm Property Get Index() As Long Index = mIndex End Property Property Let Table(Value As ListObject) Set mTable = Value End Property Property Let Usf(Value As UserForm) Set mUsf = Value End Property Function GoToPrevious() As Long If mIndex > 1 Then mIndex = mIndex - 1 updateUserform Else GoToPrevious = 1 End If End Function Function GoToNext() As Long If mIndex < mTable.ListRows.Count Then mIndex = mIndex + 1 updateUserform Else GoToNext = 1 End If End Function Function GotoRecord(Index As Long) As Long If mTable.ListRows.Count >= Index And mTable.ListRows.Count > 0 And Index >= 1 Then mIndex = Index updateUserform Else GotoRecord = 1 End If End Function Sub GotoNew() mIndex = 0 End Sub Function Delete() As Long mTable.ListRows(mIndex).Delete If mTable.ListRows.Count > 0 Then If mIndex > mTable.ListRows.Count Then mIndex = mTable.ListRows.Count updateUserform Else Delete = 1 End If End Function Sub updateUserform() Dim r As ListRow Dim Counter As Long Dim ControlName As String Dim ColumnName As String Set r = mTable.ListRows(mIndex) For Counter = 1 To UBound(Map, 2) mUsf.Controls(Map(1, Counter)).Value = r.Range(mTable.ListColumns(Map(2, Counter)).Index).Value Next End Sub Sub UpdateTable() Dim r As ListRow Dim Counter As Long Dim ControlName As String Dim ColumnName As String If mIndex = 0 Then mTable.ListRows.Add mIndex = mTable.ListRows.Count End If Set r = mTable.ListRows(mIndex) For Counter = 1 To UBound(Map, 2) r.Range(mTable.ListColumns(Map(2, Counter)).Index).Value = mUsf.Controls(Map(1, Counter)).Value Next End Sub Code : Sélectionner tout - Visualiser dans une fenêtre à part
Je pense que, d'une manière générale, le code se passe de commentaires. Il faut toutefois bien observer ce qui suit: Le DataUsfManager n'utilise pas en hard coding la structure du formulaire. Il ne fait qu'utiliser les contrôles qui lui ont été passés dans l'array de mappage. Cela signifie, et c'est important de le signaler, que mis à part le fait d'embarquer un objet DataUsfManager, le userform ne doit respecter aucune contrainte de structure. Par exemple, ce n'est pas le DataUsfManager qui doit mettre à jour le textbox tboIndex, car il "ne sait pas" que ce contrôle existe dans le userform et ce contrôle pourrait très bien ne pas être présent sans que cela nuise au fonctionnement du DataUsfManager. Ce n'est pas le DataUsfManager qui affiche les messages à l'utilisateur, car ce n'est pas son rôle. Par contre, il envoie des infos au userform sous forme de résultat de fonctions pour que le userform puisse éventuellement afficher un message. On remarque également le code minimaliste des procédures évènementielles des boutons. Un code évènementiel ne peut normalement rien faire d'autre que d'appeler du code applicatif. C'est une règle à respecter sans aucune exception pour créer du code maintenable, évolutif, non redondant et facilement maintenable. Les codes évènementiels des boutons passent simplement la main au DataUsfManager, affichent des éventuellement des messages selon les réponses du DataUsfManager et ajustent le contenu de certains contrôles. C'est tout. Ce n'est pas le userform qui gère les interactions avec la table, mais bien le DataUsfManager. Le userform est piloté par une procédure d'un module standard, qui utilise une fonction pour créer le mappage. Nous verrons plus loin pourquoi.12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 Option Explicit Private mDataManager As DataUSFManager Property Get DataManager() As DataUSFManager Set DataManager = mDataManager End Property Private Sub btnDelete_Click() If mDataManager.Delete() = 1 Then ClearForm MsgBox "La table est vide" End If End Sub Private Sub btnNew_Click() ClearForm mDataManager.GotoNew End Sub Private Sub btnNext_Click() Dim Result As Long With mDataManager Result = .GoToNext() tboIndex = .Index End With If Result = 1 Then MsgBox "Vous êtes au dernier enregistrement" End Sub Private Sub btnPrevious_Click() Dim Result As Long With mDataManager Result = .GoToPrevious() tboIndex = .Index End With If Result = 1 Then MsgBox "Vous êtes au premier enregistrement" End Sub Private Sub btnQuit_Click() Me.Hide End Sub Private Sub btnSave_Click() With mDataManager .UpdateTable tboIndex = .Index End With End Sub Private Sub tboIndex_AfterUpdate() Dim Result As Long With mDataManager Result = .GotoRecord(tboIndex.Value) If Result = 1 Then MsgBox "Vous êtes hors limites de la table" If .Index <> 0 Then tboIndex = .Index Else tboIndex = "" End If End If End With End Sub Private Sub UserForm_Initialize() Set mDataManager = New DataUSFManager mDataManager.Usf = Me End Sub Sub ClearForm() tboFirstName.Value = "" tboLastName.Value = "" tboIndex = "" cboFunction.ListIndex = -1 End Sub Code : Sélectionner tout - Visualiser dans une fenêtre à part
A nouveau, le code se passe de commentaires et est normalement compréhensible à la seule lecture. On charge le userform, on passe au DataUsfManager intégré au userform l'array de mappage et le tableau structuré (listobject) qu'il devra piloter; on décide sur quel enregistrement on se positionne au départ; on met à jour les données dans le userform sur base de l'enregistrement choisi et on affiche le userform. Le reste est piloté par les boutons du userform qui vont appeler les fonctions correspondante du DataUsfManager. Dans le cadre d'une application qui utiliserait plusieurs userforms liés à des données, on pourrait vouloir créer la table de mappage en Excel, qui contiendrait alors les paires contrôle/colonne pour chaque paire Usf/Tableau structuré.1234567891011121314151617181920212223242526 Sub ShowUserform() With UserForm1 .DataManager.Map = getMap() .cboFunction.List = Range("t_Fonctions").Value .DataManager.Table = Range("t_Contacts").ListObject If .DataManager.GotoRecord(1) = 0 Then .tboIndex = 1 .DataManager.updateUserform End If .Show End With Unload UserForm1 End Sub Function getMap() Dim Map(1 To 2, 1 To 3) Map(1, 1) = "tboFirstname" Map(2, 1) = "Prénom" Map(1, 2) = "tboLastName" Map(2, 2) = "Nom" Map(1, 3) = "cboFunction" Map(2, 3) = "Fonction" getMap = Map End Function
On pourra alors modifier la fonction GetMap pour charger les paires contrôle/Colonne en fonction du nom du userform passé en paramètres. On comprend ici que le ReDim ne pouvant s'effectuer que sur la dernière dimension de l'array, il était nécessaire de le prévoir sur base de la structure 2 lignes et x colonnes (x étant le nombre de paires contrôle/colonne pour le userform considéré). Code : Sélectionner tout - Visualiser dans une fenêtre à part
Si vous souhaitez piloter un userform "Localités", il vous suffit de:123456789101112131415161718192021 Function getMap1(UsfName As String) Dim t ReDim Map(1 To 2, 1 To 1) Dim Counter As Long Dim Index As Long t = Range("t_MapUsf").Value For Counter = 1 To UBound(t) If t(Counter, 1) = UsfName Then If IsEmpty(Map(1, 1)) Then Index = 1 Else Index = UBound(Map, 2) + 1 ReDim Preserve Map(1 To 2, 1 To Index) End If Map(1, Index) = t(Counter, 2) Map(2, Index) = t(Counter, 3) End If Next getMap1 = Map End Function - Créer le tableau structuré pour les localités;
- Créer le userform correspondant;
- Ajouter les paires dans la table de mappage;
- Créer la fonction d'appel de ce userform.
Voici le code du module standard qui appelle le userform de gestion d'une localité. A part les noms du mappage et du tableau qui ont changé et la ligne d'alimentation de la combo qui a disparu, c'est le même code que celui qui prépare et affiche usfContact. Le code du userform est quasi identique à celui de usfContact. Code : Sélectionner tout - Visualiser dans une fenêtre à part
Comme on le voit, l'écriture d'un code générique permet un gain de temps considérable dans la gestion des échanges Usf-Table, puisque l'on ne réinvente pas la roue à chaque fois. Une approche systématique permet également des tests plus simples, une maintenance aisée et une évolution de l'application en s'appuyant sur du code solide, pérenne et unique. Si vous aviez 30 userforms liés à 30 tables de données, vous auriez évidemment les 30 fonctions de préparation et d'appel et les 30 codes dans les userforms (que l'on pourrait également rendre +/- génériques, bien que le gain soit minime), mais tous utiliseraient le même code, contenu dans la classe DataUsfManager. Bien entendu, vous pouvez enrichir cette classe et tous les userforms profiteraient alors de ces ajouts. Vos remarques sont bienvenues, dans l'esprit DVP123456789101112 Sub ShowCityForm() With usfCity .DataManager.Map = getMap1("usfCity") .DataManager.Table = Range("t_Localités").ListObject If .DataManager.GotoRecord(1) = 0 Then .tboIndex = 1 .DataManager.updateUserform End If .Show End With Unload usfCity End Sub
Bon travail avec Excel et VBA... Attention: Il faut supprimer l'extension .txt du fichier DataUsfManager...
Fichiers attachés -
DataUSFManager.cls.txt (2,1 Ko, 544 affichages) -
UserFormManager.xlsm (43,4 Ko, 591 affichages)
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire) --------------- Mes billets de blog sur DVP Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles... Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel... Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA... ---------------
Répondre avec citation 15 0 - 13/04/2020, 01h17 #2 JimClark
Candidat au Club
Assistant aux utilisateursInscrit enAoût 2012Messages4
Détails du profil
Informations personnelles :Sexe :
Localisation : FranceInformations professionnelles :Activité : Assistant aux utilisateursSecteur : Service publicInformations forums :Inscription : Août 2012Messages : 4
Bonjour Pierre. Je tenais à vous remercier pour toutes vos contributions, vos différentes réponses, vos billets sur votre blog. Je suis un grand fan dorénavant. En plus c’est toujours écrit de façon claire, consiste et dans un bon français. Et avec de l’humour de plus. J’apprécie énormément votre contribution sur les liaisons entre userform et tableaux structurés. Je tenais à vous remercier. J’étais convaincu par ces tableaux structurés depuis plusieurs années et donc un grand utilisateur de ces listobjects. Je le suis encore plus avec vos billets sur le sujet. Couplé avec VBA, cela devient un ensemble redoutablement efficace et extrêmement productif. A quand un livre dans le commerce ? Un grand merci. Ne changez rien SVP 👍 Cordialement
Répondre avec citation 3 0 - 14/04/2020, 21h54 #3 Pierre Fauconnier
Rédacteur/Modérateur 







Formateur et développeur chez EXCELLEZ.netInscrit enNovembre 2003Messages19 125
Détails du profil
Informations personnelles :Sexe :
Âge : 59Localisation : BelgiqueInformations professionnelles :Activité : Formateur et développeur chez EXCELLEZ.netSecteur : EnseignementInformations forums :Inscription : Novembre 2003Messages : 19 125Billets dans le blog131
Salut. Merci pour ton appréciation
Ca fait toujours plaisir à recevoir! "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire) --------------- Mes billets de blog sur DVP Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles... Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel... Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA... ---------------
Répondre avec citation 1 0 - 15/04/2020, 13h57 #4 JimClark
Candidat au Club
Assistant aux utilisateursInscrit enAoût 2012Messages4
Détails du profil
Informations personnelles :Sexe :
Localisation : FranceInformations professionnelles :Activité : Assistant aux utilisateursSecteur : Service publicInformations forums :Inscription : Août 2012Messages : 4
Bonjour. De rien, c’est en toute sincérité 😀. Je m’en suis servi encore hier soir en ajoutant 2 formulaires à ma petite application. Cela m’a pris 15 minutes à tout casser. C’est donc extrêmement efficace. On peut même appeler le formulaire depuis une ligne du tableau structuré et afficher la ligne concernée. Il suffit d’utiliser l’évènement beforedoubleclic du worksheet, de récupérer l’index de la ligne du listobject et le tour est joué. J’adore votre vision de la structuration d’une application Excel. Cela change des trucs gadgets souvent chouettes mais très peu utile au final. Ne changez rien Pierre SVP ! C’est parfait comme cela ! Bonne journée
Répondre avec citation 0 0 - 08/12/2020, 17h41 #5 gillou1961
Futur Membre du Club
LycéenInscrit enNovembre 2020Messages4
Détails du profil
Informations personnelles :Sexe :
Localisation : France, Jura (Franche Comté)Informations professionnelles :Activité : LycéenInformations forums :Inscription : Novembre 2020Messages : 4
problème de dates .. Bonjour pierre, Etant novice en VBA, j’ais quand même réussi à adapter mon fichier et mes userforms selon vos préconisations. Malheureusement je bloque sur un certain point qui, à mon niveau, m’empêche de continuer mon projet. Je veux parler de la gestion des dates. Je sais qu’un textbox ne ‘ manipule ‘ que du texte mais je n’arrive pas à appliquer le format date avant écriture dans mon tableau (inversion du jour et mois selon certaine date) Merci de bien vouloir me mettre sur une piste. Bonne journée
Répondre avec citation 0 0 - 08/12/2020, 21h28 #6 akim_59330
Membre habitué 



INGENIEUR MECANIQUEInscrit enNovembre 2020Messages8
Détails du profil
Informations personnelles :Sexe :
Localisation : France, Yvelines (Île de France)Informations professionnelles :Activité : INGENIEUR MECANIQUESecteur : IndustrieInformations forums :Inscription : Novembre 2020Messages : 8
Envoyé par gillou1961
Bonjour pierre, Etant novice en VBA, j’ais quand même réussi à adapter mon fichier et mes userforms selon vos préconisations. Malheureusement je bloque sur un certain point qui, à mon niveau, m’empêche de continuer mon projet. Je veux parler de la gestion des dates. Je sais qu’un textbox ne ‘ manipule ‘ que du texte mais je n’arrive pas à appliquer le format date avant écriture dans mon tableau (inversion du jour et mois selon certaine date) Merci de bien vouloir me mettre sur une piste. Bonne journée Bonjour gillou1961, J'avais le même problème, j'ai utilisé le code ci-dessous et mon problème a été réglé. Code : Sélectionner tout - Visualiser dans une fenêtre à part
TextBox_Daate est le nom de ma textbox12 CDate(TextBox_Daate.Value)
Répondre avec citation 1 0 - 08/12/2020, 21h49 #7 mfoxy
Membre Expert 






Automation VBAInscrit enFévrier 2018Messages752
Détails du profil
Informations personnelles :Sexe :
Âge : 38Localisation : BelgiqueInformations professionnelles :Activité : Automation VBASecteur : High Tech - Opérateur de télécommunicationsInformations forums :Inscription : Février 2018Messages : 752
Bonjour Guillou, akim, Pour des questions spécifiques, hors scope, il vaut mieux créer son propre sujet.
Sinon pour la gestion de date dans des textbox, un simple CDate(textedate) n' est pas suffisant, car si la valeur saisie n'est pas une date, vous allez vous retrouver avec une jolie erreur. Mais heureusement, l'ami Pierre
auteur de cette contribution, a aussi dans son blog la fonction générique qui résoudra le souci : vba convertir texte en date/ Bav,
Répondre avec citation 1 0 - 31/07/2021, 20h34 #8 j.gui
Membre averti 






Inscrit enJuin 2007Messages13
Détails du profil
Informations personnelles :Localisation : FranceInformations forums :Inscription : Juin 2007Messages : 13
Bonsoir, je suis enseignant et pour automatiser les tonnes de fichiers que l'on doit faire et fournir à l'institution pour la notation examen de nos élèves, j'ai automatisé la chose et en tombant sur le code magique de Pierre que je tiens à remercié pour ce partage...j'ai gagné beaucoup de temps... bon étant débutant, je me suis pris un livre sur la programmation VBA car j'ai pas tout compris...mais quand j'aurais un peu de temps faudra que je creuse pour comprendre la totalité de ce code. Par contre, j'ai une question, j'ai trouvé sur le net des gens qui parlaient d'userform en modal (ou si j'ai bien compris on ne peut pas jouer avec un autre fichier Excel en //) ou non modal (la on peu avoir l'userform et avoir une feuille excel pour faire des copier/coller par exemple...soit ce que je voudrais) J'ai donc recherché comment passer votre code modal en non modal...ils disent rajouter un 0 à .Show, j'ai donc mis dans votre procédure de lancement : ".Show 0" et la votre userform...et donc le mien aussi...apparait (du moins le cadre) pour disparaitre aussitôt Y a t'il donc une solution pour pouvoir avec la possibilité d'utiliser en // du Userform un autre fichier Excel Merci d'avance si vous aviez un retour positif à ma demande Bonne soirée
Répondre avec citation 0 0 - 02/02/2022, 15h19 #9 punk_sportif
Membre actif 






secrétaireInscrit enDécembre 2014Messages49
Détails du profil
Informations personnelles :Sexe :
Âge : 45Localisation : France, Ille et Vilaine (Bretagne)Informations professionnelles :Activité : secrétaireInformations forums :Inscription : Décembre 2014Messages : 49
Bonjour, Pour commencer, je tiens à remercier l'auteur de ce tuto. Je n'ai pas le niveau, j'étais pessimiste au départ, mais j'ai réussi à adapter ce code à mon tableau. J'avais au départ une erreur sur le fichier d'exemple car je ne passais pas par la fonction d'ouverture du userform, ce qui fait que le datamanager n'était pas initialisé. Sinon, bravo, une fois qu'on a compris, c'est pas sorcier pour faire le mappage. Bref, j'aurai voulu savoir 3 choses : Est-il possible de rajouter un msgbox d'avertissement au moment de changer d'enregistrement quand on a effectué des modifications sur des combobox / textbox mais qu'on n'a pas cliqué sur le bouton "sauvegarder" ? Est-il possible de de faire une navigation selon un filtre? Par exemple si j'ai une colonne "Service", et que je souhaite consulter uniquement les enregistrements du "Service B" ? Je rencontre également le problème de l'enregistrement de date. Je ne vois pas comment adapter la fonction UpdaeTable() pour l'insertion d'une date. Pouvez vous m'aiguiller à ce sujet?
Répondre avec citation 0 0 - 07/02/2022, 13h05 #10 Valtrase
Membre émérite 






Jeune retraité...Inscrit enJanvier 2016Messages538
Détails du profil
Informations personnelles :Sexe :
Âge : 66Localisation : France, Pyrénées Orientales (Languedoc Roussillon)Informations professionnelles :Activité : Jeune retraité...Secteur : Boutique - MagasinInformations forums :Inscription : Janvier 2016Messages : 538
Gestion de deux tableaux structurés Bonjour, D'abords merci pour toutes vos contributions qui me servent tous les jours, moi petit autodidacte à la retraite. J'utilise la modélisation de données dans un petit programme que j'expérimente et que je veux mettre à disposition de ceux qui veulent faire du Access avec du Excel.
C'est un petit programme de devis clients, Jusque-là avec la modélisation j'arrive à gérer quatre pages Clients, Articles, Fournisseurs, et Devis. Là ou je voudrais faire une évolution c'est au niveau de la page devis, celle-ci comporte les champs texte IdDevis, DateDevis, RefDevis, EtatDevis issus de la table t_Devis, et IdNomDevis qui lui contient l'index client issu de la table t_Clients. C'est avec ce dernier que je voudrais faire évoluer la classe. A l'heure actuelle je mets à jour les champs de la table t_Devis avec le Datamanager, et ensuite je mets à jour les champs client (Nom, Prénom, adresse...) en les importants de la table t_Clients grasse à son index. d'où ma question avez-vous une idée, ou un fil à suivre pour pouvoir gérer cette sous table par la classe DataManager ? Autant j'arrive avec mes maigres moyens à suivre le déroulement de la classe autant pour la modifier, et l'adapter c'est une autre histoire. Merci d'avance du temps que vous prendrez, pour me répondre.
Répondre avec citation 0 0 - 08/02/2022, 11h59 #11 Pierre Fauconnier
Rédacteur/Modérateur 







Formateur et développeur chez EXCELLEZ.netInscrit enNovembre 2003Messages19 125
Détails du profil
Informations personnelles :Sexe :
Âge : 59Localisation : BelgiqueInformations professionnelles :Activité : Formateur et développeur chez EXCELLEZ.netSecteur : EnseignementInformations forums :Inscription : Novembre 2003Messages : 19 125Billets dans le blog131
Salut. A vrai dire, je n'ai pas bien compris la question. Le DataManager assure la liaison entre un userform (en tout ou en partie) et un tableau structuré (en tout ou en partie). Il faudrait un peu détailler la structure du classeur pour que nous puissions mieux comprendre le problème.
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire) --------------- Mes billets de blog sur DVP Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles... Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel... Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA... ---------------
Répondre avec citation 0 0 - 08/02/2022, 12h57 #12 punk_sportif
Membre actif 






secrétaireInscrit enDécembre 2014Messages49
Détails du profil
Informations personnelles :Sexe :
Âge : 45Localisation : France, Ille et Vilaine (Bretagne)Informations professionnelles :Activité : secrétaireInformations forums :Inscription : Décembre 2014Messages : 49
Envoyé par Pierre Fauconnier
Salut. A vrai dire, je n'ai pas bien compris la question. Le DataManager assure la liaison entre un userform (en tout ou en partie) et un tableau structuré (en tout ou en partie). Il faudrait un peu détailler la structure du classeur pour que nous puissions mieux comprendre le problème. Bonjour, J'espère ne pas être trop insistant, mais je me permets de vous solliciter pour mes problèmes dans le message un peu plus au dessus : Comment gérer l'enregistrement des dates qui est capricieuse au niveau du format via les textbox? Et comment serait-il possible d'ajouter un message d'alerte lorsque des modifications ont été apportées dans les textbox/combobox et que le bouton save n'a pas été cliqué avant un bouton next/prévious/quitter etc ?
Répondre avec citation 0 0 - 08/02/2022, 15h37 #13 Valtrase
Membre émérite 






Jeune retraité...Inscrit enJanvier 2016Messages538
Détails du profil
Informations personnelles :Sexe :
Âge : 66Localisation : France, Pyrénées Orientales (Languedoc Roussillon)Informations professionnelles :Activité : Jeune retraité...Secteur : Boutique - MagasinInformations forums :Inscription : Janvier 2016Messages : 538
Envoyé par Pierre Fauconnier
Salut. A vrai dire, je n'ai pas bien compris la question. Le DataManager assure la liaison entre un userform (en tout ou en partie) et un tableau structuré (en tout ou en partie). Il faudrait un peu détailler la structure du classeur pour que nous puissions mieux comprendre le problème. Bonjour, Ne sachant pas à qui était destiné la réponse , je me permet de répondre aussi. Donc les structures des tables son comme ci-dessous : Table Clients : Qui regroupe toutes les informations client avec une colonne ID (Numéro auto), Nom, Prénom, etc. Table Lignes devis : qui reprends les lignes du devis avec les colonnes ID (numéro auto); ID Article pour l'article concerné; Quantité, etc... Table Articles : où son stockées les infos de l'article : Désignation, prix, etc. Table Devis : qui regroupe les infos des devis avec : - Colonne ID numéros auto du devis
- Colonne Référence qui ne sert qu'a l'impression c'est la référence de la facture (date + numéro)
- Colonne ID Client colonne qui reprends l'ID du client cette colonne me sert à récupérer les infos clients dans le table Client par rapport à l'ID client
- Colonne ID Lignes qui reprends l'ID des lignes du devis ici pareil je stocke les lignes devis dans une table à part
- Colonne état pour gérer l'état du devis en cours, validé, etc...
- En premier les informations du devis (en bleu) qui sont gérés par le DataManager ID, Référence, Date,...
- Ensuite viennent les infos clients (en vert) qui ne sont pas gérés par le DataManager puisque provenant d'une autre table
- Ensuite viennent les lignes du devis (en Jaune) dans une listbox qui elles n'ont plus ne sont pas gérées par le DataManager
Répondre avec citation 0 0 - 10/03/2022, 13h00 #14 punk_sportif
Membre actif 






secrétaireInscrit enDécembre 2014Messages49
Détails du profil
Informations personnelles :Sexe :
Âge : 45Localisation : France, Ille et Vilaine (Bretagne)Informations professionnelles :Activité : secrétaireInformations forums :Inscription : Décembre 2014Messages : 49
Bonjour, Je relance une dernière fois : Comment est-il possible d'intégrer proprement un message d'alerte si une modification a été faite dans le formulaire, que l'utilisateur clique sur un bouton "suivant", "précédent" etc et qu'il n'a pas sauvegarder les modifications?
Répondre avec citation 0 0 - 10/03/2022, 13h22 #15 Pierre Fauconnier
Rédacteur/Modérateur 







Formateur et développeur chez EXCELLEZ.netInscrit enNovembre 2003Messages19 125
Détails du profil
Informations personnelles :Sexe :
Âge : 59Localisation : BelgiqueInformations professionnelles :Activité : Formateur et développeur chez EXCELLEZ.netSecteur : EnseignementInformations forums :Inscription : Novembre 2003Messages : 19 125Billets dans le blog131
Salut. C'est au userform de contrôler cela. Ce n'est pas en lien, direct en tout cas, avec le transfert vers le tableau de données. Une technique simple serait de mettre un flag comme variable privée du userform et de le mettre à True lorsque l'on modifie la donnée d'un contrôle. On peut alors proposer à l'utilisateur d'enregistrer avant de voyager sur précédent, suivant, ou de quitter. Voilà un code qui met cela en place
Code : Sélectionner tout - Visualiser dans une fenêtre à part 123456789101112131415161718192021222324252627282930313233343536 Option Explicit Private IsModified As Boolean Private Sub btnNext_Click() If IsModified Then SaveQuitCancel End Sub Private Sub btnPrevious_Click() If IsModified Then SaveQuitCancel End Sub Private Sub optActive_Click() IsModified = True End Sub Private Sub tboName_Change() IsModified = True End Sub Private Sub SaveQuitCancel() Dim Result As VbMsgBoxResult Result = MsgBox("Voulez-vous enregistrer les données?", vbYesNoCancel, "Mon application") Select Case Result Case vbYes Save Case vbNo Me.Hide End Select IsModified = (Result = vbCancel) End Sub Sub Save() MsgBox "Sauvé" End Sub "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire) --------------- Mes billets de blog sur DVP Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles... Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel... Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA... ---------------
Répondre avec citation 0 0 - 10/03/2022, 14h51 #16 punk_sportif
Membre actif 






secrétaireInscrit enDécembre 2014Messages49
Détails du profil
Informations personnelles :Sexe :
Âge : 45Localisation : France, Ille et Vilaine (Bretagne)Informations professionnelles :Activité : secrétaireInformations forums :Inscription : Décembre 2014Messages : 49
Envoyé par Pierre Fauconnier
... Merci pour cette réponse. Mais je crois qu'il y a un problème avec cette méthode que je viens de mettre en place : J'ai l'impression qu'a chaque chargement d'un enregistrement, il considère qu'il y a modification dans les textbox, cb_box et compagnie comme les données ne sont pas vides et qu'il charge les données du tableau. Je pourrais éventuellement le mettre sur l’événement click, ça résoudrait une partie du problème... EDIT : je viens de tenter sur l'événement Click(). Ca marche pour le premier bouton suivant, mais ensuite, ça me demande à chaque fois si je veux enregistrer... Etrange, je ne clique pourtant nulle part à part le bouton next. C'est dans cette partie de code là que ça appelle mes procédures Click() : Code : Sélectionner tout - Visualiser dans une fenêtre à part
Bon après parcours pas à pas, ça ne le fais pas à chaque cb_box, et j'ai l'impression que ce n'est pas forcément en lien avec les cb_box rempli ou vide... Etrange...123 For Counter = 1 To UBound(mMap) mUsf.Controls(mMap(Counter, 1)).Value = r.Range(mTable.ListColumns(mMap(Counter, 2)).Index).Value Next
Répondre avec citation 0 0 - 10/03/2022, 16h51 #17 Pierre Fauconnier
Rédacteur/Modérateur 







Formateur et développeur chez EXCELLEZ.netInscrit enNovembre 2003Messages19 125
Détails du profil
Informations personnelles :Sexe :
Âge : 59Localisation : BelgiqueInformations professionnelles :Activité : Formateur et développeur chez EXCELLEZ.netSecteur : EnseignementInformations forums :Inscription : Novembre 2003Messages : 19 125Billets dans le blog131
Je viens de reprendre le fichier. Je regarde pour une solution pratique et simple.
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire) --------------- Mes billets de blog sur DVP Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles... Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel... Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA... ---------------
Répondre avec citation 0 0 - 10/03/2022, 16h53 #18 punk_sportif
Membre actif 






secrétaireInscrit enDécembre 2014Messages49
Détails du profil
Informations personnelles :Sexe :
Âge : 45Localisation : France, Ille et Vilaine (Bretagne)Informations professionnelles :Activité : secrétaireInformations forums :Inscription : Décembre 2014Messages : 49
Ok, merci bien.
Répondre avec citation 0 0 - 10/03/2022, 16h56 #19 Pierre Fauconnier
Rédacteur/Modérateur 







Formateur et développeur chez EXCELLEZ.netInscrit enNovembre 2003Messages19 125
Détails du profil
Informations personnelles :Sexe :
Âge : 59Localisation : BelgiqueInformations professionnelles :Activité : Formateur et développeur chez EXCELLEZ.netSecteur : EnseignementInformations forums :Inscription : Novembre 2003Messages : 19 125Billets dans le blog131
Il faut mettre le IsModified en Public. Dès lors, après le chargement, on peut le basculer à False
Code : Sélectionner tout - Visualiser dans une fenêtre à part
Attention, il faut aussi le basculer à False à la fin de la procédure btnSave12345678910111213 Sub ShowCityForm() With usfCity .DataManager.Map = getMap1("usfCity") .DataManager.Table = Range("t_Localités").ListObject If .DataManager.GotoRecord(1) = 0 Then .tboIndex = 1 .DataManager.updateUserform .IsModified = False End If .Show End With Unload usfCity End Sub Code : Sélectionner tout - Visualiser dans une fenêtre à part
Ca devrait être ok1234567 Private Sub btnSave_Click() With mDataManager .UpdateTable tboIndex = .Index End With IsModified = False End Sub "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire) --------------- Mes billets de blog sur DVP Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles... Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel... Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA... ---------------
Répondre avec citation 0 0 - 10/03/2022, 16h58 #20 Pierre Fauconnier
Rédacteur/Modérateur 







Formateur et développeur chez EXCELLEZ.netInscrit enNovembre 2003Messages19 125
Détails du profil
Informations personnelles :Sexe :
Âge : 59Localisation : BelgiqueInformations professionnelles :Activité : Formateur et développeur chez EXCELLEZ.netSecteur : EnseignementInformations forums :Inscription : Novembre 2003Messages : 19 125Billets dans le blog131
Pour le problème de la date, je regarde ce soir.
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire) --------------- Mes billets de blog sur DVP Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles... Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel... Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA... ---------------
Répondre avec citation 0 0
Dernière
- Aller à la page:
| Actualités | FAQs OFFICE | TUTORIELS OFFICE | LIVRES OFFICE | SOURCES VBA | OFFICE 2010 |

- Forum
- Logiciels
- Microsoft Office
- Excel
- Contribuez
- Modélisation des liaisons entre userform et table de données Excel (tableau structuré)
Discussions similaires
- SELECT depuis une table de liaison entre 2 mêmes tables Par Pedro dans le forum Langage SQL Réponses: 9 Dernier message: 10/04/2013, 18h16
- [XL-2007] Problème Méthode de Liaison entre Userform Par Garruth dans le forum Excel Réponses: 4 Dernier message: 05/03/2012, 15h22
- [POWERDESIGNER]Je n’arrive pas à représenter une liaison entre deux entité/table. Par zoltix dans le forum PowerAMC Réponses: 13 Dernier message: 22/08/2009, 16h53
- [E-03] Supprimer message d'erreur des liaisons entre classeur Par moilou2 dans le forum Excel Réponses: 1 Dernier message: 03/03/2009, 13h41
- Liaison entre Access et tables Oracle Par lerico dans le forum Modélisation Réponses: 1 Dernier message: 05/09/2008, 16h35
Partager
Partager
Tag » Apprendre Userform
-
VBA - Mon Tout Premier UserForm - Débutants Extrêmes - CCM
-
Cours VBA : UserForm - Excel
-
Utiliser Les UserForm En VBA Excel - SilkyRoad
-
Creation D Un Formulaire De Saisie Avec Userform.N°1 - YouTube
-
[PDF] Cours VBA - UserForm - Les Contrôles
-
Créer Un UserForm | ScholarVox
-
Tester Le UserForm | ScholarVox
-
Formation Excel Création Et Utilisation Des UserForms - Clicours
-
Tester Le UserForm | Elephorm
-
Les Cases à Cocher (Checkbox) | Editions ENI
-
Apprendre La Comptabilité à Partir De 0.00 Connaissances - Pinterest
-
Apprendre Excel VBA - ISTAS
-
Communicate With Your Users - Code VBA