IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Userform - double click


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    RETRAITE
    Inscrit en
    Août 2018
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : RETRAITE

    Informations forums :
    Inscription : Août 2018
    Messages : 32
    Points : 26
    Points
    26
    Par défaut Userform - double click
    Bonsoir,

    Suite à une discussion sur le site de mars 2012, j'ai recopié le code de cette discussion dans son intégrité et adapté en fonction de mes besoins qui correspond normalement à ce que je veux faire hormis que je suis vraiment novice et j'ai bien peur que je n'ai pas recopié cela au bon endroit. Donc mon fichier est en lien partagé.

    Je cherche à double clicker sur une feuille de calcul "Listing" pour ouvrir un userform et d’y renvoyer les valeurs dans les Txt_box et les cb_box respectives pour modifier les données.

    Donc quand je double click sur la feuille de calcul « Listing » l’userform s’affiche (pas de problème sur ce point)

    Normalement, si j’ai bien compris les tutos et forums, l’userform devrait s’afficher avec les valeurs des différentes colonnes de la feuille « Listing ». Ce qui ne fait pas avec le code ci-dessous.

    1°) J’ai déclaré une variable public Lalig qui devrait contenir la ligne du double click à modifier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Public Lalig As Long
    2°) Dans le module de la feuille « Listing »
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
    Cancel = True
    Lalig = Target.Row
    frm_saisie.Show
    End Sub
    3°) Dans le module de l’userform
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    Private Sub userform_initialise()
    If Lalig > 0 Then
    With Worksheets("Listing")
    Me.cbxclub.Value.Range ("A" & Lalig)
    Me.Txtlicence.Value.Range ("C" & Lalig)
    Me.TxtNom.Value.Range ("D" & Lalig)
    Me.Txtprenom.Value.Range ("E" & Lalig)
    Me.Txtdate.Value.Range ("F" & Lalig)
    Me.Txt_clt_Aller_Ufolep.Value.Range ("G" & Lalig)
    Me.Txt_clt_retour_Ufolep.Value.Range ("H" & Lalig)
    Me.Txt_clt_Aller_FFTT.Value.Range ("I" & Lalig)
    Me.Txt_clt_retour_FFTT.Value.Range ("J" & Lalig)
    Me.Txt_club_FFTT.Value.Range ("K" & Lalig)
    Me.cbxmute.Value.Range ("L" & Lalig)
    End With
    End Sub
    Ainsi, pouvez vous éventuellement corriger mon fichier ce qui serait le mieux ou alors m"expliquer parce qu'à mon age les méninges ne fonctionnent plus trés bien

    lien de partage : https://mon-partage.fr/f/gSmSx58c/

    Merci de votre aide

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 593
    Points : 34 250
    Points
    34 250
    Par défaut
    Salut,

    l'ensemble à l'intérieur de ton WIth/End With est bancal à cause d'un détail

    il suffit de corriger le bloc en ajoutant le = et en spécifiant le .Value de ta cellule

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.cbxclub.Value.Range ("A" & Lalig)
    deviendra
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.cbxclub.Value=.Range ("A" & Lalig).Value
    je te laisse corriger les autres lignes
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    RETRAITE
    Inscrit en
    Août 2018
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : RETRAITE

    Informations forums :
    Inscription : Août 2018
    Messages : 32
    Points : 26
    Points
    26
    Par défaut
    Bonsoir,

    Je viens d'apporter les corrections mais en vain.

    En double cliquant sur la feuille de calcul, l'userform s'ouvre (pas de problème mais sans les données)

    J'y comprend rien

    Merci pour votre aide je galère depuis ce matin avec

  4. #4
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 942
    Points
    55 942
    Billets dans le blog
    131
    Par défaut
    Salut.

    Perso, j'ai un gros doute sur les .Range derrière les .Value des contrôles. (Il n'y a pas de propriété .Range sur le .Value des contrôles, ça n'existe pas)

    De plus, où donnes-tu une valeur à la variable LaLig utilisée dans le userform_Initialize? Pour moi, nulle part, donc elle vaut 0 et ta condition n'est pas remplie...

    Il n'y a pas Option Explicit en début de module. Ça n'aide pas à s'y retrouver. (Voir mon billet à ce sujet)

    Dans ton Useform_Initialise, il y a un If Lalig > 0 then... Mais pas de End If...


    Tu as créé de toutes pièces une procédure Private Sub userform_initialise() qui n'est pas la procédure événementielle du userform (Userform_Initialize qui se trouve plus bas dans le code mais qui est vide)...


    Ce code ne saurait fonctionner comme cela. Il manque plus que les bases. De plus, tu aurais intérêt à travailler avec les tableaux structurés, ce serait bien plus simple, que ce soit en Excel ou en VBA.
    "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...
    ---------------

  5. #5
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 593
    Points : 34 250
    Points
    34 250
    Par défaut
    Un autre gros doute aurait également du nous prendre, car tu as un nom de macro bancal également
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub userform_initialise()
    au lieu d'avoir le correctement orthographié
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub UserForm_Initialize()
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  6. #6
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 942
    Points
    55 942
    Billets dans le blog
    131
    Par défaut
    De plus, même si ces données peuvent probablement être trouvées par ailleurs, je ne suis pas convaincu de la pertinence de les rendre publiques dans un fichier Excel...
    "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...
    ---------------

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    RETRAITE
    Inscrit en
    Août 2018
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : RETRAITE

    Informations forums :
    Inscription : Août 2018
    Messages : 32
    Points : 26
    Points
    26
    Par défaut
    Bonsoir,

    Désolé, mais je ne suis pas un expert de VBA ni d'excel par ailleurs. Je cherche juste des renseignements pour une association sportive en tant que bénévole pour développer un petit truc.

    Je me débrouille avec les moyens et le minimum de connaissances dont je dispose et les quelques neurones qui me restent.

    Concernant la pertinence de rendre les données publique, vous pouvez me confiance, j'étais bien placé pendant mon activité et les informations des joueurs sont sur le net depuis bien longtemps !!

    Maintenant, pour le bout de code vous pouvez toujours regarder la discussion du 27/03/2012, 20h14 sur ce site dont je ne fais que recopier les éléments (sauf qq fautes de frappes)

    Si ce forum, n'est pas un site d'entraide ou l'on peut puiser quelques renseignements auprès d'expert faite le moi savoir, j'en prendrez note !

    Sur cela une bonne soirée

    Xavier

  8. #8
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 942
    Points
    55 942
    Billets dans le blog
    131
    Par défaut
    Pas de soucis...

    Déjà, ton tableau avec les joueurs est un tableau structuré. C'est une bonne chose. Je te propose de convertir également les deux plages de ta feuille Parametre en tableaux structurés. C'est plus facile pour la suite.

    J'ai nommé le tableau des joueurs t_Joueurs, celui des clubs t_Clubs et celui des mutations t_Mutations.

    Pour moi, il y a un défaut d'ergonomie et je trouverais plus intéressant d'avoir une liste déroulante dans le userform pour choisir un joueur existant. J'ai nommé ce combobox cbxSelection. Du coup, le bouton Modifier ne sert à mon avis à rien.

    Nom : 2018-08-16_093355.png
Affichages : 1168
Taille : 118,3 Ko

    Donc, à l'ouverture du userform, on n'a rien, et on peut choisir un joueur existant pour modifier ses données ou saisir directement les données d'un nouveau joueur puis valider.

    Perso, je n'utilise pas Userform_Initialize dans ce cas-çi, mais on pourrait. les listes déroulantes sont alimentées à l'appel du formulaire, lors du clic sur le bouton sur la feuille Excel. La procédure appelée par ce bouton est assez simple:
    • on décharge le formulaire pour être certain qu'il est bien initialisé;
    • on alimente les combobox via leur propriété List qui attend un tableau, matérialisé par la colonne du tableau structuré correspondant. (D'où l'utilité de travailler avec des tableaux structurés...);
    • on affiche le userform.


    Le code du bouton de la feuille, situé dans un module standard, est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub ouvreformulaire()
      Unload frm_Saisie
      With frm_Saisie
        .cbxClub.List = Range("t_Clubs[Clubs]").Value
        .cbxMute.List = Range("t_Mutations[Mutation]").Value
        .cbxSelection.List = Range("t_Joueurs[Nom & Prenom]").Value
        frm_Saisie.Show
      End With
      Unload frm_Saisie
    End Sub
    Dans le userform, on va travailler avec le tableau structuré, et plus particulièrement avec une ligne de ce tableau, qui est un objet ListRow. Cet objet contient une propriété Range qui pointe vers la plage correspondante de la feuille, et on échangera les données entre les cellules de cette plage et les contrôles du userform. C'est la sélection dans le combobox de sélection du joueur qui déterminera sur quelle ligne on va chercher les données dans le tableau. On aura donc besoin d'une propriété privé du userform appelée mTableRow et qui est typée ListRow.

    Donc, lors de la modification de la sélection du combobox de sélection, on utilise ListIndex pour retrouver la ligne. Comme la liste est alimentée par les lignes du tableau, c'est très simple. Il faut juste savoir que ListIndex vaut -1 si le combobox est vide (absence de sélection) et que l'index commence à 0 pour la première ligne. Les lignes du tableau structuré sont numérotées à partir de 1, il faut donc ajouter 1 à ListIndex. (Attention, je parle bien des lignes du tableau structuré et non de la feuille! Le tableau structuré des joueurs pourrait être décalé sur la feuille sans que le code soit impacté par cette modification: autre avantage des tableaux structurés qui sont manipulés indépendamment de leur position sur la feuille de calcul). Lorsque mDataRow est définie, on charge les données de sa plage dans les contrôles grâce à la procédure ValuesToControls

    Voici le code activé sur le changement de sélection de cbxSelection
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub cbxSelection_Change()
      If cbxSelection.ListIndex <> -1 Then
        Set mTableRow = Range("t_Joueurs").ListObject.ListRows(cbxSelection.ListIndex + 1)
        ValuesToControls
      End If
    End Sub
    Et voici celui de ValuesToControls (ici, la structure du tableau structuré intervient car on utilise les colonnes du tableau par position et pas par nom, mais on va faire comme ça pour l'instant, c'est moins pro mais plus simple...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Sub ValuesToControls()
      With mTableRow
        cbxClub.Value = .Range(1).Value
        Txtlicence.Value = .Range(3).Value
        TxtNom.Value = .Range(4).Value
        Txtprenom.Value = .Range(5).Value
        Txtdate.Value = .Range(6).Value
        Txt_clt_Aller_Ufolep.Value = .Range(7).Value
        Txt_clt_retour_Ufolep.Value = .Range(8).Value
        Txt_clt_Aller_FFTT.Value = .Range(9).Value
        Txt_clt_retour_FFTT.Value = .Range(10).Value
        Txt_club_FFTT.Value = .Range(11).Value
        cbxMute.Value = .Range(12).Value
      End With
    End Sub
    Lorsque l'on va valider, on devra transférer les données des contrôles vers la plage de la ligne mDataRow. C'est la procédure inverse de ValuesToControls qui s'appelle logiquement ControlsToValues
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Sub ControlsToValues()
      With mTableRow
        .Range(1).Value = cbxClub.Value
        .Range(3).Value = Txtlicence.Value
        .Range(4).Value = TxtNom.Value
        .Range(5).Value = Txtprenom.Value
        .Range(6).Value = Txtdate.Value
        .Range(7).Value = Txt_clt_Aller_Ufolep.Value
        .Range(8).Value = Txt_clt_retour_Ufolep.Value
        .Range(9).Value = Txt_clt_Aller_FFTT.Value
        .Range(10).Value = Txt_clt_retour_FFTT.Value
        .Range(11).Value = Txt_club_FFTT.Value
        .Range(12).Value = cbxMute.Value
      End With
    End Sub
    Cette procédure est appelée lors du clic sur Valider et il faut tester que mDataRow est valide. Si mDataRow n'est pas défini, c'est qu'on ajoute une nouvelle ligne au tableau et on fait donc pointer mDataRow vers une nouvelle ligne du tableau, puis on utilise ControlsToValues. Si nouvelle entrée, par souci d'ergonomie, on actualise la liste de sélection et on la fait pointer sur la nouvelle entrée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub Cbt_Valider_Click()
      Dim NewData As Boolean
     
      If mTableRow Is Nothing Then
        Set mTableRow = Range("t_Joueurs").ListObject.ListRows.Add
        NewData = True
      End If
      ControlsToValues
      If NewData Then
        cbxSelection.List = Range("t_Joueurs[Nom & Prenom]").Value
        cbxSelection.ListIndex = cbxSelection.ListCount - 1
        Set mTableRow = Range("t_Joueurs").ListObject.ListRows(cbxSelection.ListIndex + 1)
      End If
    End Sub
    Le bouton Effacer le formulaire a été modifié pour appeler une procédure qui vide les contrôles et "vide" également mDataRow (mDataRow ne pointe donc plus sur une ligne du tableau structuré).

    Voici le code du bouton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Cbt_Effacer_Click()
      ClearControls
      Set mTableRow = Nothing
    End Sub
    Et voici le code pour le nettoyage du formulaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub ClearControls()
      TxtNom = ""
      Txtprenom = ""
      cbxClub = ""
      Txtlicence = ""
      Txtdate = ""
      cbxMute = ""
      Txt_clt_Aller_Ufolep = ""
      Txt_clt_retour_Ufolep = ""
      Txt_clt_Aller_FFTT = ""
      Txt_clt_retour_FFTT = ""
      Txt_club_FFTT = ""
      cbxSelection.ListIndex = -1
    End Sub
    Le bouton Fermer masque le formulaire, qui sera déchargé par le code appelant du module 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Cbt_Fermer_Click()
      Me.Hide
    End Sub

    Voilà. Je t'ai mis le fichier avec lequel j'ai travaillé. Une bonne idée est de faire fonctionner cela en mode pas à pas pour bien comprendre comment ça fonctionne. Il te suffit de mettre un point d'arrêt sur la procédure que tu souhaites examiner...
    Fichiers attachés Fichiers attachés
    "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...
    ---------------

  9. #9
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 942
    Points
    55 942
    Billets dans le blog
    131
    Par défaut
    Ceci dit, en fonction de ton message de hier soir, je me demande ce que t'apporte un userform par rapport à une saisie directe dans la feuille de calcul. Ca me semblerait bien plus simple.

    Ici, avec le userform, tu devrais normalement vérifier que la saisie dans txtDate est bien une date, alors qu'avec Excel, ça peut se faire avec les outils natifs. Idem pour la sélection du club et de la mutation, Excel permettant une validation par liste déroulante.

    Pourquoi passer par un userform (hormis le plaisir de programmer, bien sûr... ) ?
    "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...
    ---------------

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    RETRAITE
    Inscrit en
    Août 2018
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : RETRAITE

    Informations forums :
    Inscription : Août 2018
    Messages : 32
    Points : 26
    Points
    26
    Par défaut
    Bonjour Pierre,

    Dans cet exemple il y a qu une quarantaine de noms et comme, je suis en train de faire un petit truc qui va être diffuser dans un 1er temps au niveau de mon département puis j espere au niveau de la region , la liste des joueurs avec être longue 5 a 6000

    Dans ce cas, j aurai préféré ,

    1°) de selectionner le club
    2) de sélection le joueur en fonction du club

    il y aura moins de monde à lister

    Je suis absent, je regarderai + tard,. Mais je peux d ores et déjà vous remercier pour ces explications.

    Il me reste à comprendre, en détail étape par étape votre analyse.

    Cordialement

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    RETRAITE
    Inscrit en
    Août 2018
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : RETRAITE

    Informations forums :
    Inscription : Août 2018
    Messages : 32
    Points : 26
    Points
    26
    Par défaut
    Re,
    je n'est pas lu les 2 discussions jusqu'à leurs termes.

    Mon projet, est de fournir à tous mes bénévoles qui gèrent les championnats et ou compétitions un fichier (soit 35). Ces fichiers seront sur un Cloud.

    Ces fichiers ont plusieurs onglets. Certains onglets seront masquées pour une ergonomie visuelle et d'autres auront des cellules verrouillées.

    Pour ce cas, il s'agit d'un onglet faisant partie du fichier. La structure ne doit pas être modifier et les données doivent toujours être indexées. Car dans certains onglets j utilise la fonction décalé. Et comme j ai peur qu ils oublient ou comme des petits malins modifient, j ai pris cette option.

    Derrière cela, j'ai plusieurs fichiers qui viennent importer ou transférer des données dans le but de consolider tout cela ( c'est compliqué, mais je suis sur le point d y arriver).

    Pour info, je peux vous transmettre mes fichiers pour informations et recevoir vos remarques et observation

    cordialement

  12. #12
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 942
    Points
    55 942
    Billets dans le blog
    131
    Par défaut
    Pour choisir le joueur en fonction du club, il faut ajouter la liste déroulante de sélection du club. Cette liste pourra être alimentée juste avant l'affichage du userform de la même façon que la liste des clubs. Par contre, la liste de sélection des joueurs sera vide au départ, car remplie en fonction de la sélection du club dans la liste. Le userform se présente donc comme ceci, avec deux listes de sélection nommées cbxSelClub et cbxSelPlayer. cbxSelPlayer contiendra deux colonnes dont la première masquée (largeur à 0 et avec BoundColumn = 1 pour que la propriété Value renvoie la valeur de la première colonne, masquée, de la liste). Cette colonne contiendra la position du joueur dans le tableau.

    Nom : 2018-08-16_113952.png
Affichages : 1076
Taille : 119,5 Ko

    La procédure d'affichage du userform dans le module standard devient donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub ouvreformulaire()
      Unload frm_Saisie
      With frm_Saisie
        .cbxSelClub.List = Range("t_Clubs[Clubs]").Value
        .cbxClub.List = Range("t_Clubs[Clubs]").Value
        .cbxMute.List = Range("t_Mutations[Mutation]").Value
        frm_Saisie.Show
      End With
      Unload frm_Saisie
    End Sub
    On va avoir besoin d'une fonction qui recrée un tableau VBA (array) des joueurs en fonction du club. Sur 6000 lignes voire plus, il peut être intéressant de passer par des arrays pour filtrer les données. C'est le boulot de la fonction getPlayersByClub du module standard. Cette fonction dimensionne un array en fonction du nombre de joueurs du club souhaité grâce à un Evaluate (fonction VBA qui permet d'évaluer une formule Excel) et à un Redim sur un array nommé Players. Cet array contient deux colonnes car nous allons mettre dans la première la position du joueur dans la liste. Ca permettra de récupérer la ligne très facilement grâce aux deux colonnes de cbxSelPlayer et sa propriété BoundColumn à 1.

    Voici le code de cette fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Function GetPlayersByClub(ClubName As String)
      Dim CountOf As Long
      Dim Clubs
      Dim Index As Long
     
      CountOf = Evaluate("countifs(t_Joueurs[Club],""" & ClubName & """)")
      ReDim players(1 To CountOf, 1 To 2)
     
      Clubs = Range("t_Joueurs[Club]").Value
      Index = 1
      For CountOf = 1 To UBound(Clubs)
        If StrComp(Clubs(CountOf, 1), ClubName, vbTextCompare) = 0 Then
          players(Index, 1) = CountOf
          players(Index, 2) = Range("t_Joueurs[Nom & Prenom]")(CountOf).Value
          Index = Index + 1
        End If
      Next
      GetPlayersByClub = players
    End Function
    Sur la modif de cbxSelClub, on va adapter la liste des joueurs disponibles (cbxSelPlayers) et on va supprimer la sélection sur ce combobox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub cbxSelClub_Change()
      If cbxSelClub.ListIndex <> -1 Then cbxSelPlayer.List = GetPlayersByClub(cbxSelClub.Value)
      cbxSelPlayer.ListIndex = -1
    End Sub
    Dès lors, une modif s'impose sur le Change de cbxSelPlayer car maintenant ListIndex ne correspond plus à la position du joueur dans le tableau. Pour récupérer la bonne ligne, c'est Value qu'il faut utiliser (pour rappel, Value renvoie la valeur de la colonne BoundColumn, soit la première, qui est masquée, qui contient la position du joueur dans le tableau).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub cbxSelPlayer_Change()
      If cbxSelPlayer.ListIndex <> -1 Then
        Set mTableRow = Range("t_Joueurs").ListObject.ListRows(cbxSelPlayer.Value)
        ValuesToControls
      End If
    End Sub
    A la validation, si on est en présence d'un nouveau joueur, on doit modifier un peu le code vu la modification de cbxSelClub et cbxSelPlayer. On va attribuer la valeur de cbxClub à cbxSelClub, puis on va recharger cbxSelPlayer grâce à la fonction getPlayersbyClub, et il faudra encore faire pointer cette liste déroulante sur sa dernière valeur pour afficher le joueur qui vient d'être créé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub Cbt_Valider_Click()
      Dim NewData As Boolean
     
      If mTableRow Is Nothing Then
        Set mTableRow = Range("t_Joueurs").ListObject.ListRows.Add
        NewData = True
      End If
      ControlsToValues
      If NewData Then
        cbxSelClub.Value = cbxClub.Value
        cbxSelPlayer.List = GetPlayersByClub(cbxSelClub.Value)
        cbxSelPlayer.ListIndex = cbxSelPlayer.ListCount - 1
      End If
    End Sub
    Voilà le nouveau fichier avec ces modifs. Celui-ci et les explications fournies devraient te permettre de comprendre comment tout se met en place...
    Fichiers attachés Fichiers attachés
    "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...
    ---------------

  13. #13
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 942
    Points
    55 942
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par xababaTT Voir le message
    [...]Mon projet, est de fournir à tous mes bénévoles qui gèrent les championnats et ou compétitions un fichier (soit 35). Ces fichiers seront sur un Cloud.[...]
    Ici, on a traité une partie de ce projet, à savoir les interactions entre le tableau structuré et le userform. On permet la création, la lecture et la modification d'un enregistrement. En découpant ce grand projet en petits morceaux, on a un code plus propre et plus maintenable.

    J'espère que ces explications te permettront d'y voir plus clair. J'ai d'ailleurs vu que tu avais posté d'autres questions relatives à d'autres parties de ce projet
    "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...
    ---------------

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    RETRAITE
    Inscrit en
    Août 2018
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : RETRAITE

    Informations forums :
    Inscription : Août 2018
    Messages : 32
    Points : 26
    Points
    26
    Par défaut
    Bonsoir Pierre,

    Tout d'abord, je vous remercie pour votre apport à mon projet. Pour faire suite, j'ai quand même quelques questions. Si j'ai bien compris, le formulaire à plusieurs fonctions Création - Modification - Lecture - efface les données du formulaire, je regarderai la suite.

    Plusieurs interrogation et de compréhension

    1°) Concernant la création d'un enregistrement, pourquoi y a t-il les 2 combobox qui servent de recherche, les utilisateurs ne vont pas comprendre !!

    - De plus et à cause de la fonction DECALER dans d"autres onglets, il faut que que la feuille de calcul soit trier par ordre alpha, par club, et par nom - prénom

    2°) Si j'efface le formulaire puis que j'appui sur valider, pourquoi il crée un enregistrement ?

    3°) Je regarderai pour la suppression (sauf que je veux un bouton supprimer dans Userform qui efface les données dans la feuille de calcul puis trier pour la fonction DECALER)


    Ne faudrait-il pas plutôt créer 2 Userform soit : 1 pour la création et 1 pour les modifications ?

    Ou alors dans la feuille de calcul avoir 2 boutons :
    - soit 1 pour la création dans ce cas, j'ouvre le formulaire puis je rends invisible les 2 combobox ?
    - soit le 2ème pour la modif et la suppression

    Sinon c'est ce que je recherche. Si vous pouvez regarder mes petits problèmes je vous en serait reconnaissant.

    Au plaisirs

    xavier

  15. #15
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 942
    Points
    55 942
    Billets dans le blog
    131
    Par défaut
    Salut

    Remarques générales:
    • J'ai "imaginé" cette ergonomie par rapport aux boutons que j'ai trouvé sur le formulaire, et il est clair qu'il faut adapter le code et le userform pour coller à ce que tu souhaites réaliser;
    • Il ne faut évidemment pas créer deux userforms puisqu'ils feraient la même chose. Ce serait contre-productif car il y aurait duplication de code. Il faut mettre en place les différents mécanismes dans le même userform.



    1. En effet. Je pense qu'il faudrait changer le texte du bouton "effacer le formulaire" en "Nouveau joueur" puisque ce bouton sert à créer un nouveau joueur. Car sinon, ce bouton ne sert à rien. Par clic sur ce bouton, on préparerait le userform pour une nouvelle saisie.

    1 bis. Le tri des données dans la feuille n'impacte en rien les échanges entre le userform et la feuille. Il suffit, lors de l'ajout d'un nouveau joueur dans la feuille, de retrier le tableau sur les colonnes souhaitées. Je m'interroge cependant sur la pertinence du DECALER en lien avec d'autres classeurs. J'ose espérer qu'il n'y a pas de formules interclasseurs. Je crois t'avoir dit dans une autre discussion ce que je pensais de ces techniques.

    2. Le problème d'un formulaire de saisie, c'est qu'il faut effectivement contrôler les données avant de transférer les infos. Il faudrait donc créer une fonction qui vérifie la cohérence des infos et le transfert ne pourrait être effectué que si cette fonction renvoie TRUE, par exemple.

    3. La suppression ne pose aucun problème en soi puisque l'on travaille avec un listrow et que l'on connait son index. Normalement, on ne devrait pas retrier par la suite. Supprimer une ligne dans une liste triée ne perturbe pas le tri.

    1. On modifie le caption du bouton "Effacer...", et on ajoute une ligne de code dans sa proc événementielle pour appeler une procédure PrepareForNew qui va préparer le formulaire. Cette fonction est ici minimaliste (elle cache les deux combobox de sélection). A toi à la compléter selon tes besoins
    Code du bouton "Nouveau joueur"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Cbt_Effacer_Click()
      ClearControls
      PrepareForNew
      Set mTableRow = Nothing
    End Sub
    Code de la proc qui prépare le userform pour un nouveau joueur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub PrepareForNew()
      cbxSelClub.Visible = False
      cbxSelPlayer.Visible = False
    End Sub
    Bien entendu, la validation est impactée par ce choix ergonomique puisqu'il faut rendre les combobox visibles et qu'en plus (1 bis), il faut trier. On va donc créer une procédure dans un module standard qui trie le tableau et qui sera appelée à la validation, après ajout des données dans le tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub SortDatas()
      With Range("t_Joueurs").ListObject.Sort.SortFields
        .Clear
        .Add Range("t_Joueurs[[#All],Club]"), SortOn:=xlSortOnValues, Order:=xlAscending
        .Add Range("t_Joueurs[[#All],Nom]"), SortOn:=xlSortOnValues, Order:=xlAscending
        .Add Range("t_Joueurs[[#All],prenom]"), SortOn:=xlSortOnValues, Order:=xlAscending
      End With
      Range("t_Joueurs").ListObject.Sort.Apply
    End Sub
    et la procédure sur le bouton Valider est modifiée, car on doit ajouter l'appel à SortDatas juste après l'ajout dans la feuille (soit après la ligne ControlsToValues
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Private Sub Cbt_Valider_Click()
      Dim NewData As Boolean
     
      PrepareForUpdate
      If mTableRow Is Nothing Then
        Set mTableRow = Range("t_Joueurs").ListObject.ListRows.Add
        NewData = True
      End If
      ControlsToValues
      SortDatas
      If NewData Then
        cbxSelClub.Value = cbxClub.Value
        cbxSelPlayer.List = GetPlayersByClub(cbxSelClub.Value)
        cbxSelPlayer.ListIndex = cbxSelPlayer.ListCount - 1
      End If
    End Sub
    2. Pour valider un enregistrement, existant ou nouveau, on passe par une fonction qui renvoie TRUE si tout est ok. A toi de l'adapter à tes règles de validation. Au passage, on remarquera qu'ici, j'accepte un Exit Function (l'exception qui confirme la règle)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Function DatasAreOk() As Boolean
      DatasAreOk = True
      If cbxClub.ListIndex = -1 Then DatasAreOk = False: Exit Function
      If TxtNom.Value = "" Then DatasAreOk = False: Exit Function
    End Function
    On aura aussi besoin d'une procédure qui réaffiche les combobox de sélection
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub PrepareForUpdate()
      cbxSelClub.Visible = True
      cbxSelPlayer.Visible = True
    End Sub
    On englobe alors tout le code du bouton Valider dans un bloc IF... End If qui renvoie un message si les données ne sont pas valides. On en profite pour réafficher les combobox de sélection grâce à la procédure PrepareForUpdate vue plus haut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Private Sub Cbt_Valider_Click()
      Dim NewData As Boolean
     
      If DatasAreOk() Then
        PrepareForUpdate
        If mTableRow Is Nothing Then
          Set mTableRow = Range("t_Joueurs").ListObject.ListRows.Add
          NewData = True
        End If
        ControlsToValues
        SortDatas
        If NewData Then
          cbxSelClub.Value = cbxClub.Value
          cbxSelPlayer.List = GetPlayersByClub(cbxSelClub.Value)
          cbxSelPlayer.ListIndex = cbxSelPlayer.ListCount - 1
        End If
      Else
        MsgBox "Les données ne sont pas valides"
      End If
    End Sub
    3. Pour la suppression, on ajoute un bouton Cbt_Delete avec le code suivant pour supprimer la ligne dans la table et vider les contrôles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub Cbt_Delete_Click()
      Dim Result As VbMsgBoxResult
     
      If Not mTableRow Is Nothing Then
        Result = MsgBox("Voulez-vous supprimer l'enregistrement?", vbYesNo)
        If Result = vbYes Then
          mTableRow.Delete
          ClearControls
        End If
      Else
        MsgBox "Aucun joueur n'est sélectionné"
      End If
    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...
    ---------------

  16. #16
    Nouveau membre du Club
    Homme Profil pro
    RETRAITE
    Inscrit en
    Août 2018
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : RETRAITE

    Informations forums :
    Inscription : Août 2018
    Messages : 32
    Points : 26
    Points
    26
    Par défaut
    Bonjour Pierre,

    Avec le fichier en telechargement, c est plus explicite pour moi.

    Pas à Pas, c'est vrai que c'est plus intuitif, peut être pas tout mais c'est déjà ça

    Cordialement

  17. #17
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 942
    Points
    55 942
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par xababaTT Voir le message
    Bonjour Pierre,

    Avec le fichier en telechargement, c est plus explicite pour moi.
    Les modifs ne sont pas bien lourdes, mais voilà le fichier en pièce jointe


    Citation Envoyé par xababaTT Voir le message
    Pas à Pas, c'est vrai que c'est plus intuitif, peut être pas tout mais c'est déjà ça

    Cordialement
    Ce pourquoi je suis allé dans le détail de ce projet, c'est que je vois trop souvent sur le forum des userform liés à des données avec du code vba mal foutu. Il y a bien entendu d'autres façons d'écrire le code que la mienne, mais j'insiste sur le fait que le projet doit être découpé en fonctions ou procédures par finalité. C'est quelque chose sur lequel je veux insister, en me disant qu'il n'y aura pas que toi qui liras cette discussion.

    Si on observe les deux procs suivantes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub PrepareForNew()
      cbxSelClub.Visible = False
      cbxSelPlayer.Visible = False
    End Sub
     
    Sub PrepareForUpdate()
      cbxSelClub.Visible = True
      cbxSelPlayer.Visible = True
    End Sub
    on aurait pu écrire la suivante, qui fait le même job
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub ToggleVisibility(Value As Boolean)
      cbxSelClub.Visible = Value
      cbxSelPlayer.Visible = Value
    End Sub
    Mais cette apparente amélioration cache en fait un problème d'analyse, car la finalité des procédures n'est plus la même. La finalité de PrepareForNew est de préparer le userform pour un nouvel encodage (le nom est explicite), alors que la finalité de ToggleVisibility est de basculer une propriété de contrôles pour les afficher ou les masquer. Si demain ou dans six mois, la préparation pour un nouvel encodage demande plus de traitement, il sera bien plus simple de modifier PrepareForNew (on ne touchera en fait qu'à cette fonction) alors qu'avec ToggleVisibility, soit on devra travailler en amont dans le code appelant, soit on s'aventurera à faire faire à cette fonction des choses qui n'ont rien à voir avec sa finalité première.

    J'espère que ces exemples d'échanges de données entre tables et userforms permettront, à toi et à d'autres, d'avoir une vision plus claire des mécanismes, simples au demeurant, à mettre en place dans le cadre d'un développement professionnel pérenne et évolutif à moindre coût
    Fichiers attachés Fichiers attachés
    "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...
    ---------------

  18. #18
    Nouveau membre du Club
    Homme Profil pro
    RETRAITE
    Inscrit en
    Août 2018
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : RETRAITE

    Informations forums :
    Inscription : Août 2018
    Messages : 32
    Points : 26
    Points
    26
    Par défaut
    Bonjour Pierre,

    Merci énormément pour votre aide sur ce sujet.Mon projet est maintenant à 90 % terminer.

    Juste encore, besoin de votre aide sur le fichier joint. Celui-ci est la finalité du projet, la problématique est que je ne peux pas avoir accès pour afficher les feuilles masquées car cette fonction est desactivée.

    Le but étant, que je puisse voir comment sont structurées les sources pour arriver à ce résultat qui est à 99 % la finalité que je recherche.

    Merci d'avance

    lien de partage : https://mon-partage.fr/f/7EVaFumL/

    Cordialement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Toutes versions] Ctrl + double click dans un userform
    Par astragor dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 20/07/2017, 00h08
  2. double click et userform
    Par lps02 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 27/03/2012, 22h26
  3. [VB.NET] DataGrid et double click
    Par mic56 dans le forum Windows Forms
    Réponses: 15
    Dernier message: 01/11/2006, 04h37
  4. [C#] [WinForms] Double click ListBox
    Par fxp17 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 11/04/2005, 14h58
  5. OnMouseUp et double click
    Par DBBB dans le forum Composants VCL
    Réponses: 3
    Dernier message: 14/12/2004, 16h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo