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 :

procédure ou fonction commune à plusieurs UserForm


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    823
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 823
    Par défaut procédure ou fonction commune à plusieurs UserForm
    Bonjour à tous,

    Je vous contact aujourd'hui car j'aurai besoin de faire une manip un peut spécifique et je fais appel à vous pour m’aider.

    Contexte

    J'ai trois UserForm qui contiennent chacun une ListBox, cependant ils ne sont pas appelés pour la même raison.

    Comment créer une procédure ou une fonction commune pour déterminer par exemple le nombre de colonnes, leur largeur … ou d’autres propriétés sans avoir à la répéter dans chaque propriétés des 3 UserForm ??

    Bien sûr créer une procédure pour chaque UserForm, c’est une solution basique, mais je souhaiterai testé une procédure générique ou commune à tous les formulaire du projet.

    Voici le code dans chaque Private Sub UserForm_Initialize :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       MyUserform = "MyNameForm" …
       PropriétésListBoxUserForm
    Et dans un module standard :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Public MyNameForm As String
    Sub PropriétésListBoxUserForm()
            MyNameForm.ListBox1.ColumnCount = 3
            MyNameForm.ListBox1.ColumnWidths = "70;70;70"
            MyNameForm.Entetes.ColumnCount = 3
            MyNameForm.Entetes.ColumnWidths = "70;70;70"
        End If
    End Sub
    Mais lorsque je charge un des trois UserForm j’ai le message suivant :
    ”Erreur de compilation” Argument non facultatif

    D’où vient l’erreur ?

    Après de multiples essais et recherches je ne trouve pas de solution.

    Merci d’avance pour votre aide.

    Sincères salutations @+.

  2. #2
    Membre Expert Avatar de Nain porte koi
    Homme Profil pro
    peu importe
    Inscrit en
    Novembre 2023
    Messages
    1 000
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : peu importe

    Informations forums :
    Inscription : Novembre 2023
    Messages : 1 000
    Par défaut
    Hello,

    je pense (pas sûr) que la réponse serait dans un module de classe
    https://tissotemmanuel.developpez.co...les-de-classe/
    JièL
    Membre des AMIS
    Anti Macro Inutilement Superfétatoire

  3. #3
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 107
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Comme en principe les propriétés ColumnCount et ColumnWidths dépendent de la liste des données, il est tout à fait possible de prévoir une procédure placée dans un module standard avec comme arguments l'objet ListBox ou ComboBox et l'objet Range (liste de données qui doit être affichée dans le ListBox ou ComboBox

    Exemple pour les arguments
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub LoadListBox(ctrlListBox As Object, ByVal ListRange As Range)
      ' Ici le code
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    823
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 823
    Par défaut
    Bonjour,

    Merci pour vos réponses.

    Nain porte koi je n’ai pas fait le test de passer par un module de classe, je ne suis pas certain que cela allégera le nombres de lignes de codes, si c’est pas le cas autant choisir une solution basique et créer une procédure pour chaque UserForm.

    Mr TULLIEZ votre solution est plus intéressante mais je ne vois pas comment la mettre en œuvre avec un tableau structuré ?

    Dans mon projet les trois UserForm contiennent chacun 1 ListBox (Entetes) pour les entêtes et 1 ListBox(ListBox1) pour les données ils sont appelés pour des raisons différentes.

    La procédure commune doit définir les propriétés nombre et taille des colonnes des 2 ListBox au chargement de chaque UserForm.

    Et récupérer dans la ListBox (Entetes) les noms de colonnes du tableau structuré avec cette ligne de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .entetes.List = Sheets("BDD").ListObjects(1).HeaderRowRange.Value
    Si mes explication ne sont pas assez claires je peux joindre un classeur épuréde mon projet.

    @+

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 107
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je ne comprends pas trop que représente le ListBox pour les en-tête ?
    On ne peux associer une ligne de titre à un ListBox ou ComboBox qu'à la seule condition d'utiliser la propriété RowSource de ces objets.
    La solution que je peux proposer modifie les propriétés ColumnCount, ColumnWidths du ListBox défini par l'argument ctrlListBox et recalcule la propriété Width du UserForm où se trouve le ListBox ou ComboBox.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    823
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 823
    Par défaut
    Voici une petite explication.

    La ListBox (Entetes) sert uniquement pour afficher les noms des colonnes du tableau structuré (Tableau1) voici le code en dur pour l’UserForm1 à l’initialisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.Entetes.List = Sheets("BDD").ListObjects(1).HeaderRowRange.Value
    Cette ListBox(Entetes) et la ListBox1 ont les mêmes nombre et tailles de colonnes.

    Nom : Capture d'écran 2025-01-28 112757.png
Affichages : 79
Taille : 31,5 Ko

    J’utilise cette méthode qui me parait simple et plus intéressante à mettre en œuvre que des Labels ou TextBox à ajuster
    pour les titres des colonnes de la Listbox1 ou la propriété ColumnHeads à True !

  7. #7
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 107
    Billets dans le blog
    53
    Par défaut
    Bonjour,

    Voici une fonction générique qui fait le job

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    Sub InitListBox(ctrlListBox As Object, _
                    ByVal ListRange As Range, _
                    Optional ResizeForm As Boolean = True)
      ' Author : Philippe Tulliez (https://magicoffice.be/)
      ' Initialisation du ListBox
      '  Modifie les propriétés suivantes du ListBox ou ComboBox
      '   ColumnCount
      '   ColumnWidths
      '   List
      '  Modifie la propriété Width du UserForm si ResizeForm est à True (Default)
      ' Arguments
      '   ctrListBox     : (ListBox) Ctrl ListBox à initialiser
      '   ListRange      : Liste traitée par le ListBox --> Propriété RowSource
      Dim tcol() As String, C As Long, tw As Double
      With ctrlListBox
      .List = ListRange.Value
      .ColumnCount = ListRange.Columns.Count ' Nombre de colonnes dans ListBox
       ReDim tcol(.ColumnCount - 1)
       ' Calcul largeur des colonnes et le place dans un string
       For C = 1 To .ColumnCount
           tcol(C - 1) = CStr(ListRange.Cells(1, C).Width): tw = tw + tcol(C - 1)
       Next
      .ColumnWidths = Join(tcol, ";")
      .ListIndex = -1
       '
       DoEvents
       ' Rectifie la largeur du ListBox si ResizeForm = True (Default)
      .Width = tw + UBound(tcol) + 10
       If ResizeForm Then
       .Parent.Width = .Left + .Width + 30
       End If
      End With
    End Sub
    Exemple d'une procédure qui invoque InitListBox

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Main()
      Const TableName As String = "t_Data" ' Nom du tableau structuré
      Dim oRange As Range
      Set oRange = Range(TableName)
      With UserForm1
       InitListBox ctrlListBox:=.lst_Header, ListRange:=oRange.ListObject.HeaderRowRange, ResizeForm:=False
       InitListBox ctrlListBox:=.lst_Data, ListRange:=oRange, ResizeForm:=True
      .Show
      End With
      Set oRange = Nothing
    End Sub
    Illustration
    Si l'on souhaite le redimensionnement automatique du UserForm par rapport à la largeur du ListBox, celui-ci doit être dans la partie gauche du UserForm sans autres contrôles à sa droite.
    Nom : 250128 UserForm InitUserform.png
Affichages : 70
Taille : 71,4 Ko
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    823
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 823
    Par défaut
    Bonjour M. THULLIEZ,

    Très bon boulot et bravo pour votre solution.

    J’ai finalement trouvé une solution très simple pour arriver au mon résultat souhaité.

    Dans un module standard :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub PropriétésListBoxUSF(USF)
        USF.entetes.ColumnCount = 3
        USF.entetes.ColumnWidths = "240;75;50"
        USF.ListBox1.ColumnCount = 3
        USF.ListBox1.ColumnWidths = "240;75;50"
        'entêtes ListBox
        USF.entetes.List = Sheets("Feuil1").ListObjects(1).HeaderRowRange.Value
    End Sub
    Et dans chaque UserForm dans le module « Private Sub UserForm_Initialize() » :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call PropriétésListBoxUSF(Me)
    Ça fonctionne nickel chrome.

    Merci pour votre contribution.

  9. #9
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 107
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    C'est effectivement une solution plus courte mais moi, ce qui m'a toujours agacé c'est calculer la largeur des colonnes à afficher dans le ListBox ou ComboBox et donc avec ma fonction, le calcul est automatique et de plus la largeur du ListBox et du UserForm s'adapte automatiquement. J'ai d'ailleurs développé une fonction plus complète pour afficher ou pas certaines colonnes.
    Cela me fait gagner un temps fou dans le développement.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

Discussions similaires

  1. [XL-2019] macro commune a plusieurs userforms
    Par Franc dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 17/11/2021, 11h51
  2. [AC-2013] Fonction commune à plusieurs états
    Par chris76 dans le forum IHM
    Réponses: 2
    Dernier message: 26/09/2014, 17h07
  3. Fonctions communes à plusieurs fichiers
    Par ANOVA dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 08/07/2010, 13h00
  4. Fonction commune à plusieurs champs
    Par scorpion1611 dans le forum Access
    Réponses: 13
    Dernier message: 25/10/2006, 19h55
  5. selection sur une table en fonction de plusieurs ligne
    Par dimdidi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/12/2004, 09h42

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