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 :

VBA Excel : syntaxe Forms() [XL-365]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Octobre 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2018
    Messages : 3
    Par défaut VBA Excel : syntaxe Forms()
    Bonjour,

    J'ai cherché plusieurs heures sur différents forums et ai testé différentes solutions proposées mais cela ne fonctionne pas.
    Je m'en remets donc a vous en espérant que quelqu'un pourra m'aider.

    Sous Excel, je veux écrire une fonction en VBA, et l’exécuter a l'aide d'un bouton a partir de différents formulaires.
    Cette fonction aura pour objectif de capter les informations d'une listbox pour la stocker dans un tableau multidimensionnel, puis de faire des opérations dans ce tableau (tri selon une colonne, suppression des doublons, ...) et enfin d'alimenter une listbox avec le résultat du tableau.

    Ainsi, les paramètres de ma fonction sont entre autre le nom de la listbox initiale, la listbox finale, mais aussi le nom des formulaires contenants les listbox. Ceci afin de pouvoir utiliser ultérieurement ma fonction dans différentes situations.

    Dans le code j'utilise donc la syntaxe Controls(MaListe) pour faire référence a la listbox.
    Mais concernant le formulaire, je ne trouve pas la bonne syntaxe.
    J'ai essayé : Forms(xxxx), Userforms(xxxx), VBA.Forms(xxxx), .... rien ne passe.

    Si je code en dur le nom du formulaire, cela fonctionne, mais en variable, cela me renvoie l'erreur
    Sub ou fonction non définie
    sur la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tableau(J, i) = Forms(Form_Ini).Controls(Liste_Ini).Column(J - 1, i - 1)
    En dur le code Tableau(J, i) = Test_Fonction.Controls(Liste_Ini).Column(J - 1, i - 1) fonctionne correctement, mais je ne peux pas m'en satisfaire car ma fonction doit fonctionner dans tous les formulaires.

    L'utilisation de Me.Controls(.......) ne fonctionne pas non plus.

    Voici le code complet de ma fonction.
    J'utilise un formulaire de test pour lancer ma fonction, il se nomme "Test_Fonction".


    Voila, j’espère avoir été suffisamment clair.
    Merci par avance de vos avis et conseils.

    Rodolphe

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    Function Tri_Doublon_Liste_String(Form_Ini, Liste_Ini, Form_Final, Liste_Final, C, L, Index_Col_Tri, Col_Doublon, Sens)
     
    '**************************************************************************
    '   COL_TRI         : si pas de tri "SANS"
    '   COL_DOUBLON     : si pas de suppression doublons "SANS"
    '   SENS            : "ASC" ou "DESC" ou "SANS"
    '   C               : Nb Colonnes
    '   L               : Nb Lignes
    '**************************************************************************
     
    Dim i As Integer, J As Integer, T As Variant, Tableau() As Variant, Tableau2() As Variant
    ReDim Tableau(1 To C, A To L)
    ReDim Tableau2(1 To L, 1 To C)
     
    '**************************************************************************
    '                      REMPLISSAGE TABLEAU
    '**************************************************************************
     
    For i = 1 To UBound(Tableau, 2)
        For J = 1 To UBound(Tableau, 1)
        'Tableau(J, i) = Test_Fonction.Controls(Liste_Ini).Column(J - 1, i - 1)
        Tableau(J, i) = Forms(Form_Ini).Controls(Liste_Ini).Column(J - 1, i - 1)
        Next J
    Next i
     
    '**************************************************************************
    '                      TRI TABLEAU
    '**************************************************************************
     
    For i = 1 To UBound(Tableau, 1)
         For J = 1 To UBound(Tableau, 2) - 1
            If Tableau(Index_Col_Tri, J) > Tableau(Index_Col_Tri, J + 1) Then
                For y = 1 To UBound(Tableau, 1)
                    T = Tableau(y, J)
                    Tableau(y, J) = Tableau(y, J + 1)
                    Tableau(y, J + 1) = T
                Next y
            End If
        Next J
    Next i
     
    '**************************************************************************
    '                            INVERSION TABLEAU
    '**************************************************************************
     
    For i = 1 To UBound(Tableau, 2)
         For J = 1 To UBound(Tableau, 1)
    Tableau2(i, J) = Tableau(J, i)
        Next J
    Next i
     
    '**************************************************************************
    '                            MAJ LISTE
    '**************************************************************************
     
    Forms(Form_Final).Controls(Liste_Final).List() = Tableau2
     
    End Function

  2. #2
    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 162
    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 162
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Si vous souhaitez créer un argument pour passer un contrôle ListBox à une procédure vous pouvez écrire oList As MSForms.ListBox et à l'intérieur de cette procédure vous pourrez utiliser toutes les méthodes et propriétés de cet objet.

    Un exemple de son utilisation dans l'un de mes billets, titré VBA - Fonction qui renvoie une chaîne de caractères des éléments sélectionnés dans un ListBox
    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

  3. #3
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 217
    Par défaut
    Hello,
    Pour pouvoir exploiter la collection VBA.Userforms, il faut que les formulaires (userforms) soit chargés. Ce que j'ai constaté :
    C'est qu'il ne sont pas chargés si on ne le fait pas par la méthode Load ou alors lorsque quand on les utilise comme par exemple avec la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UserForm1.Controls("ListBox1").AddItem "toto"
    Avant l'exécution de cette instruction VBA.Userforms est vide , après il y a Userform1 dans la collection.
    Voici donc un code qui utilise VBA.Userforms pour retrouver un userForm par son nom.

    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
    Function Form(FormName As String) As Object
    Dim Obj As Object
    For Each Obj In VBA.UserForms
            If StrComp(FormName, Obj.Name, vbTextCompare) = 0 Then
                Exit For
            End If
    Next Obj
    Set Form = Obj
    End Function
     
    Sub Test()
    Load UserForm1
    Form("UserForm1").Show
    End Sub
    '
    Sans le Load UserForm1, La fonction Form ne renvoie rien.

    et voici une fonction qui liste tous les noms des formulaires du project VBA du classeur actif.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub ListeDesFormulaires()
    Dim vbc As Object
    For Each vbc In ActiveWorkbook.VBProject.VBComponents
      ' Only if Component type is UserForm
      ' vbext_ct_MSForm = 3
        If vbc.Type = 3 Then
          Debug.Print vbc.Name
        End If
    Next
    End Sub
    '
    Ami calmant, J.P

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Octobre 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2018
    Messages : 3
    Par défaut Merci
    Bonjour

    Merci pour votre, cela fonctionne parfaitement

    Cordialement

    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour,
    Si vous souhaitez créer un argument pour passer un contrôle ListBox à une procédure vous pouvez écrire oList As MSForms.ListBox et à l'intérieur de cette procédure vous pourrez utiliser toutes les méthodes et propriétés de cet objet.

    Un exemple de son utilisation dans l'un de mes billets, titré VBA - Fonction qui renvoie une chaîne de caractères des éléments sélectionnés dans un ListBox

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Octobre 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2018
    Messages : 3
    Par défaut Merci
    Bonjour

    Merci pour votre, cela fonctionne parfairtement.

    Cordialement

    Citation Envoyé par jurassic pork Voir le message
    Hello,
    Pour pouvoir exploiter la collection VBA.Userforms, il faut que les formulaires (userforms) soit chargés. Ce que j'ai constaté :
    C'est qu'il ne sont pas chargés si on ne le fait pas par la méthode Load ou alors lorsque quand on les utilise comme par exemple avec la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UserForm1.Controls("ListBox1").AddItem "toto"
    Avant l'exécution de cette instruction VBA.Userforms est vide , après il y a Userform1 dans la collection.
    Voici donc un code qui utilise VBA.Userforms pour retrouver un userForm par son nom.

    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
    Function Form(FormName As String) As Object
    Dim Obj As Object
    For Each Obj In VBA.UserForms
            If StrComp(FormName, Obj.Name, vbTextCompare) = 0 Then
                Exit For
            End If
    Next Obj
    Set Form = Obj
    End Function
     
    Sub Test()
    Load UserForm1
    Form("UserForm1").Show
    End Sub
    '
    Sans le Load UserForm1, La fonction Form ne renvoie rien.

    et voici une fonction qui liste tous les noms des formulaires du project VBA du classeur actif.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub ListeDesFormulaires()
    Dim vbc As Object
    For Each vbc In ActiveWorkbook.VBProject.VBComponents
      ' Only if Component type is UserForm
      ' vbext_ct_MSForm = 3
        If vbc.Type = 3 Then
          Debug.Print vbc.Name
        End If
    Next
    End Sub
    '
    Ami calmant, J.P

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

Discussions similaires

  1. [XL-2010] Fichier XML en VBA Excel, syntaxe pour insérer un paragraphe et encodage des balises
    Par z0706fm dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/09/2016, 13h33
  2. Envoi de mail en VBA Excel avec mise en forme et choix d'expediteur
    Par amalane dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 24/08/2006, 15h24
  3. [VBA-Excel] Mise en forme d'un classeur
    Par snooopy007 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 25/07/2006, 18h37
  4. [Debutant] VBA EXCEL form comboliste imbriquée
    Par megapacman dans le forum Access
    Réponses: 4
    Dernier message: 10/03/2006, 10h27
  5. [VBA][Excel] mise en forme conditionnelle
    Par titflocon dans le forum Access
    Réponses: 9
    Dernier message: 19/12/2005, 10h13

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