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 :

Petite question pratique pour utilisation UserForm


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2007
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 896
    Par défaut Petite question pratique pour utilisation UserForm
    Bonjour à tous,

    Ma question est simple, j'ai 9 feuilles dans mon classeur Excel, Est-ce que je peux faire appel au même UserForm pour mes feuilles ? Cela pour éviter de créer 9 formulaires.

    La ComboBox ne fait pas appel aux mêmes données, zone de nom différente dans chaque feuille.
    Merci par avance pour vos réponses

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    Il est par exemple et entre autres toujours possible de déclarer en Public dans un module Standard des Objects, etc ...
    Et d'utiliser ces variables à l'ouverture de ton Userform, précédée (dans ton code qui ouvre le Userform) de l'initialisation de ces variables.

    EDIT : je rappelle au passage également qu'il n'est absolument pas nécessaire d'ouvrir un Userform pour agir tant sur ses propriétés que sur celles des contrôles qu'il contient. Cette méthode affranchit alors de l'utilisation de variables publiques dans un module standard.

    Etc ...

    Voilà donc quelques bases. Le reste n'est que question de choix de stratégie, etc ...

  3. #3
    Membre éprouvé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2007
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 896
    Par défaut
    Merci pour ta réponse, je vais réfléchir à tout ça et voir ce que je peux faire.
    Bonne journée
    René

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bien
    Le mieux est sans aucun doute que tu fasses ce que j'ai moi-même fait à mes tous débuts, à savoir des petits tests simples sur des objets simples dans un projet simple.

    J'ajoute une autre méthode : une procédure paramétrée d'ouverture de l'userform (les paramètres étant les variables objets ou autres qu'il devra utiliser)

    J'ajoute enfin que rien n'interdit le "panachage" de ces trois méthodes.

    A partir de là -->> le reste relève de la création, du sens de l'organisation et de la conception (autre section du forum)

  5. #5
    Membre éprouvé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2007
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 896
    Par défaut
    Merci pour tout ces bons conseils. Je vais essayer de réaliser cela tout seul avec les aides que je trouverais sur le forum, aide déjà formulée par les contributeurs.

  6. #6
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par RENE14 Voir le message
    Ma question est simple, j'ai 9 feuilles dans mon classeur Excel, Est-ce que je peux faire appel au même UserForm pour mes feuilles ? Cela pour éviter de créer 9 formulaires.
    Il vaudrait mieux poser la question inverse : qu'est-ce qui pourrait empêcher ton userform de s'appliquer aux autres feuilles ?

    La ComboBox ne fait pas appel aux mêmes données, zone de nom différente dans chaque feuille.
    Fais un paramétrage.

    Dans le début du code qui lance l'exécution dans ton userform (le bouton qui déclenche vraiment l'utilisation des données saisies dans le userform), tu repères quelle est la feuille active avec ActiveSheet. A l'aide d'un Select Case ou d'une boucle de recherche, tu lui fixe un numéro qui servira d'indice pour les paramètres.

    Tu crées des variables de paramétrages indexé suivant l'indice décrit juste avant et dans lesquels tu mets les éléments qui varient d'une feuilles à l'autre : positions de cellules destination, nom de zone, etc.
    Ca peut même être rempli dans une feuille Excel de paramètres (à mon sens, c'est la version la plus

    Le B.A.BA du codage modulaire et réutilisable.

  7. #7
    Membre éprouvé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2007
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 896
    Par défaut
    Bonjour Menhir,

    Merci pour ta réponse. Voilà ce que j'ai fait avec mes connaissances. Il y a certainement mieux à faire, mais j'ai fait selon mon intuition.

    Pour alimenter la Combo à l'activation d'une feuille :

    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 Worksheet_Activate()
    Dim vCellule As Object
    Load UF1
        For Each vCellule In ActiveSheet.Range("A2:A250")
            If vCellule.Value = "" Then Exit For
            UF1.CmbCat.AddItem vCellule.Value
    Next
        UF1.CmbCat.ListIndex = -1
     
    UF1.Show
     
    End Sub
    Pour le remplissage de la feuille active :

    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
     
    Private Sub CmbOK_Click()
    Dim vLigne As Long
     
    With ActiveSheet
    If Range("E25") = "" Then
        Range("E25").Select
        vLigne = 1
    Else
        Range("E24").End(xlDown).Select
        vLigne = Selection.Value + 1
        ActiveCell.Offset(1, 0).Range("A1").Select
      End If
     
      ActiveCell.Value = vLigne
      ActiveCell.Offset(0, 1).Value = Me.CmbCat.Value
      ActiveCell.Offset(0, 2).Value = Me.TxtFS.Value
      ActiveCell.Offset(0, 3).Value = Me.TxtNb1.Value
      ActiveCell.Offset(0, 4).Value = Me.TxtHF.Value
      ActiveCell.Offset(0, 5).Value = Me.TxtNb2.Value
     
      Me.CmbCat.ListIndex = -1
      Me.TxtFS.Value = ""
      Me.TxtNb1.Value = ""
      Me.TxtHF.Value = ""
      Me.TxtNb2.Value = ""
      End With
    End Sub

  8. #8
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Plusieurs points de ton code sont à reconsidérer.
    Prenons déjà le tout premier , à savoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For Each vCellule In ActiveSheet.Range("A2:A250")
            If vCellule.Value = "" Then Exit For
            UF1.CmbCat.AddItem vCellule.Value
    Next
    Pourquoi une telle boucle ?
    Je t'ai conseillé des tests simples avec des choses simples dans un projet simple. Prends ce chemin et tu t'en porteras mille fois mieux.
    Je te suggère ce tout petit projet comme exemple) :
    un bouton de commande commandbutton1 sur la feuille Feuil1 d'un classeur tout neuf, avec des données en colonne A
    et ce code pour le bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub CommandButton1_Click()
      UserForm1.ComboBox1.RowSource = "Feuil1!A2:A100"
      UserForm1.Show
    End Sub
    sur un userform Userform1 : une combobox combobox1

    Clique maintenant sur le bouton de commande mis sur ta feuille et regarde ...

    Voilà ce que j'entends par l'apprentissage sur la base de tests isolés et simples. C'est AINSI, que tu apprendras vite.

    Je t'ai par ailleurs dit qu'il aurait beaucoup de choses à dire du code que tu montres.
    Je ne vais pas en faire ici l'inventaire, mais pointer quand-même du doigt ce qui est moche et révèle la non compréhension (essentielle) des bases :
    C'est quoi, ta variable vCellule ? -->> une cellule, donc ... un objet Range. Précise-le donc : VBA te remerciera d'avoir mâché une partie de son travail --->>
    Voilà : mets-toi sur de tels rails, peu à peu. Tu t'en féliciteras vite.

  9. #9
    Membre éprouvé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2007
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 896
    Par défaut
    Donc ça c'est mieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Private Sub Worksheet_Activate()
    Load UF1
        UF1.CmbCat.RowSource = ActiveSheet.Range("A2:A250") 'parce que les donnée sont différentes pour chacune des feuilles
        UF1.CmbCat.ListIndex = -1 'Pour que l'UF s'affiche une ligne au-dessus de la première donnée
    UF1.Show
     
    End Sub

  10. #10
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    NON !
    La propriété RowSource est une chaîne de caractères, pas un objet !
    ActiveSheet.Range("A2:A250") n'est pas une chaîne de caractères, mais un objet Range !

    Et à quoi sert ton Load UF1 ---->> A RIEN (je te l'ai dit aujourd'hui même : nul besoin de charger ou ouvrir un userform pour ... etc .... Peine perdue ?????)
    Le seul fait de montrer (Show) provoque en outre ipso-facto le chargement

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

Discussions similaires

  1. [XL-2013] Question pratique pour MAJ de code à distance
    Par GADENSEB dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 31/08/2017, 09h11
  2. Réponses: 3
    Dernier message: 22/12/2011, 22h33
  3. [EJB] Quelles bonnes pratiques pour utiliser les transactions "en ligne"?
    Par kisitomomotene dans le forum Java EE
    Réponses: 1
    Dernier message: 12/12/2011, 20h22
  4. Petite question de bonne pratique pour débutant :)
    Par nabodix dans le forum Débuter
    Réponses: 4
    Dernier message: 04/02/2009, 12h58
  5. SSIS Petite question pratique
    Par geof dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 19/12/2007, 14h11

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