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 :

Nom form dans une variable pour modifier plusieurs forms [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Service public

    Informations forums :
    Inscription : Février 2008
    Messages : 143
    Points : 106
    Points
    106
    Par défaut Nom form dans une variable pour modifier plusieurs forms
    Bonjour

    je pêche sur ce cas malgré mes recherches.

    Je souhaite ouvrir ou modifier, ou les 2 toute une série de userform car il contienne tous certains éléments commun.
    J'appelle donc mes formulaires : formperm1, formperm2, formperm3,.... formperm12.

    j'ai fait ce code à titre de test mais cela ne fonctionne pas :
    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
     
    Option Explicit
    Dim a As Single
    Dim nform As UserForm
    Dim nume As String
     
    Sub testform()
     
     
    For a = 1 To 12
        nume = "formperm" & a
        Set nform = nume
        nform.Show
        nform.Label1.Caption = "essai"
        nform.Hide
        Set nform = Nothing
    Next
     
    End Sub
    j'ai essayé cela sans succes :
    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
     
    Option Explicit
    Dim a As Single
    Dim nform As UserForm
    Dim nume As String
     
    For a = 1 To 12
        Set nform = "formperm" & a
        nform.Show
        nform.Label1.Caption = "essai"
        nform.Hide
        Set nform = Nothing
    Next
     
     
    End Sub
    il plante sur la ligne du set car "nume" est incompatible. Se que je comprends car nume est une variable de type string et je veux rentrer un objet.
    Comment faire pour pouvoir faire fonctionner ce bout de programme ?

    Petite précision, j'ai pensé à boucler sur l'ensemble des forms mais j'ai peur que se soit trop long car j'ai d'autres formulaires dans mon projet

    j'ai écrit cela :
    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 testform1()
     
    For Each nform In ThisWorkbook.VBProject.VBComponents
        If nform.Type = 3 Then
            If Left(nform.Name, 8) = "formperm" Then
                nform.Show
                nform.Label1.Caption = "essai"
                MsgBox "reussi"
            End If
        End If
        MsgBox "suite"
    Next
    End Sub
    J'ai l'erreur : "la méthode 'vbproject' de l'objet '_workbook' a échoué !!!"

    Avez vous des pistes à me donner ?

    Merci pour votre aide

  2. #2
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 949
    Points
    2 949
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Cette modif restera temporaire...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Essai()
    Dim nom As String, i As Integer, Usf As Object
        For i = 1 To 3
            nom = "formperm" & i
            Set Usf = VBA.UserForms.Add(nom)
            With Usf
                .Label1.Caption = "essai"
                .Show
            End With
        Next
        Set Usf = Nothing
    End Sub
    Faudra fermer tous tes userforms manuellement...
    Cordialement,
    Franck

  3. #3
    Membre régulier
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Service public

    Informations forums :
    Inscription : Février 2008
    Messages : 143
    Points : 106
    Points
    106
    Par défaut on avance mais reste la gestion
    Bonjour et merci à pijaku pour sa proposition,

    Cela fonctionne bien avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Essai()
    Dim nom As String, i As Integer, Usf As Object
        For a = 1 To 12
            nom = "formperm" & a
            Set Usf = VBA.UserForms.Add(nom)
            Load Usf
            Usf.saisnumperm.Caption = "essai"
        Next
        Set Usf = Nothing
        formperm1.Show 0
    End Sub
    Par contre un problème le champ que j'essaie de remplir reste vierge ???
    Normalement l'userform est chargé et devrait se remplir mais là non ?



    Pour la fermeture j'ai essayé cela sans succès non plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Essai()
    Dim nom As String, i As Integer, Usf As Object
        For a = 1 To 12
            nom = "formperm" & a
            Set Usf = VBA.UserForms.Add(nom)
            Load Usf
            Usf.saisnumperm.Caption = "essai"
        Next
        Set Usf = Nothing
        formperm1.Show 0
    End Sub
    Pouvez vous me dire où est mon erreur ?

    Le but de cette manipulation de 12 userform est de remplacer mon multipage qui me fait planter le programme (voir post précédent pour lequel je n'ai pas de solutions).
    Apparement j'effectue trop de manipulation dans le multipage, qui fait planter excel lorsque j'essaie de remplir un objet dans le multipage au final.
    chaque page du multipage est refait dans un userform
    J'ouvre les 12 userforms en masqué sauf 1 et l'utilisateur passera de l'un à l'autre.

    A la fin je récupère les données dans chaque userform et je les fermes tous.

    Cordialement

    Merci pour votre aide,

  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 924
    Points
    55 924
    Billets dans le blog
    131
    Par défaut
    Salut.

    Tout ce que tu exécuteras par code sera temporaire, comme l'a dit Pijaku. Et si derrière ton multipage ou ce que tu veux modifier, tu as du code événementiel, tu vas faire comment, tu vas aussi essayer de modifier le code par du code? Tu y laisseras ta santé


    Perso, je m'armerais de patience et je modifierais mes userforms à la main. Si les userforms sont identiques, je me poserais la question du pourquoi 12 userforms, et je profiterais de l'occasion pour passer mon appli en revue et la (re)mettre d'équerre
    "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
    Membre régulier
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Service public

    Informations forums :
    Inscription : Février 2008
    Messages : 143
    Points : 106
    Points
    106
    Par défaut
    Bonjour,

    Merci Pierre pour ton analyse, je vais passer par une variable tableau public qui gardera en mémoire le contenu des cellules de chaque userform à ce moment là, et je vais charger seulement l'userform demander par l'utilisateur.

    Ensuite pourquoi :
    Si les userforms sont identiques, je me poserais la question du pourquoi 12 userforms
    Je me suis mal expliquée plus bas.
    Avant cette solution j'avais qu'un seul userform qui contenait 1 multipage de 12 pages et des éléments autour. Cette userform était une page de saisi pour l'utilisateur
    Le problème est apparue lorsque j'ai eu fini le programme :
    Excel planté inexplicablement et intempestivement lorsque je remplissais un élément (label ou textbox) dans une des pages du multipage. Et en insérant des STOP ou en faisant une manip sur le code cela refonctionnait.
    J'ai recréé entièrement le multipage sans copier/coller et il a fonctionné normalement. Enfin 3 jours plus tard il s'est mis à planté à un autre endroit. Aux dernières nouvelles, un nouveau point d'entrée le fait planter.
    J'ai contrôler toutes mes variables objet, vérifier tous les points que j'ai trouvé sur internent et déposé un post pour essayer de trouver une solution. Malheureusement sans succés !!!

    C'est ainsi que j'ai essayer de recréer un multipage avec 12 userforms sans multipage dont les éléments autour du multipage sont commum au 12. Par contre le contenu de chaque page est différent et c'est cette différence qu'il y a entre chaque userform.
    J'aurai pu jouer sur la mise en page d'un seul comme je le fais pour certains userform mais mon multipage occupe 80 % de l'userform et le contenu de chaque page est très différent entre chaque page, donc j'ai choisit cette solution.

    Je part du coup sur une variable tableau qui devra garder en mémoire 200 éléments environ (contenu des 12 pages). J'espère que le programme ne va pas être trop ralenti, ainsi un seul userform sera ouvert.

    Si vous avez une meilleure idée à me proposer, je suis à votre écoute.

    Encore merci pour vos conseils

    Au plaisir de vous lire,

  6. #6
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 949
    Points
    2 949
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Si, effectivement, tu as une "souche commune" à tous tes Userforms, et que cette souche, tu veux la "retoucher" (modification des caption des labels etc.), il faut que tu le fasses "en dur", en mode création, pas par du code.

    Par contre, pourrais-tu développer ceci :
    Je part du coup sur une variable tableau qui devra garder en mémoire 200 éléments environ (contenu des 12 pages).
    Cordialement,
    Franck

  7. #7
    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 924
    Points
    55 924
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par pijaku Voir le message
    [...]
    Par contre, pourrais-tu développer ceci :
    Je part du coup sur une variable tableau qui devra garder en mémoire 200 éléments environ (contenu des 12 pages).
    Ca me fait aussi un peu peur, cette phrase
    "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...
    ---------------

  8. #8
    Membre régulier
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Service public

    Informations forums :
    Inscription : Février 2008
    Messages : 143
    Points : 106
    Points
    106
    Par défaut
    bonjour,
    l'userform initial est fait en dur et je remplie, affiche ou masque les labels et testbox en fonction du choix de l'utilisateur.
    Je vous ai joint le fichier excel dans sa totalité avec l'userform qui me pose problème appelé formperm.
    Attention certaines fonctionnalités font appel à des fichiers externes non joint comme pour le mail. Le programme va planter lorsqu'il va aller chercher une image externe.

    C'est une application pour remplir des permissions de voirie quelque soit le modèle.
    L'utilisateur choisit la commune et le modèle se définit seul.
    Par contre l'utilisateur peut définir un modèle différent s'il ne lui convient pas.

    L'userform formperm est mis en forme en fonction du modèle (masqué, affiché des pages du multipage, masqué affiché des labels et textbox, modifié le contenu de certains label ou listbox)
    Il est aussi modifié si certains champs obligatoires sont remplis.
    Cet userform sert pour la saisie et voir les permissions dèjà saisi. C'est à ce titre que je rempli les textbox et vérouille les données.
    DAns cette version le multipage dans formperm, d'après ce que j'ai compris ne supporte pas les changements et fini par me créé un point de plantage : lorsque j'essaie de remplir ou modifier un élément dans le multipage excel se ferme. Je refait le multipage (plusieurs heures de travail) et cela repart quelques jours et le défaut recommence. Je modifie le code (ajouter et supprimer) et cela fonctionne. J'insère un "stop" et le programme ne plante plus.

    Du coup, j'ai abandonné cette solution en supprimant le multipage et en mettant chaque page du multipage dans un userform différent donc 12 userforms
    L'avantage du multipage c'est que les données restent en mémoire lorsque l'utilisateur change de page et on enregistre en fin de demande.
    Dans cette nouvelle solution avec 12 userforms je voulais chargé les 12 userforms et les mettre en masqué ".hide", et affiché seulement l'userform que l'utilisateur souhaite. Ainsi je conserve les données saisies et l'utilisateur navigue d'userform en userform

    Cette solution ne pouvant se faire je vais conserver les données de chaque userform dans une variable public de type tableaux et ouvrir qu'un seul userform à la fois. l'userform sera rempli à partir de la variable jusqu'à enregistrement des données.
    Ainsi je ferme et ouvre l'userform que l'utilisateur veut en chargeant les données depuis la variable.
    Enfin c'est la solution à laquelle je pense !!
    Je vais structurer ma variable tableau avec 12 lignes et 30 à 40 colonnes (1 ligne par données de la page )
    J'espère avoir été clair


    Nom : formpermavecmulti.jpg
Affichages : 148
Taille : 274,6 KoNom : formpermssmulti.jpg
Affichages : 171
Taille : 308,9 Ko

    Le fichier entier :

    permvoirieviergegard.xlsm

    Merci pour votre aide

  9. #9
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 949
    Points
    2 949
    Billets dans le blog
    10
    Par défaut
    Le problème ici, est que l'on n'arrive qu'en fin de fichier.
    A titre personnel, je n'aurais pas le temps de me poser sur tout ton projet pour en comprendre les ramages.

    Pour t'orienter sur la manière de coder avec un Userform, je te laisse voir les billets de Blog de Pierre Fauconnier ici présent...
    Par exemple :
    https://www.developpez.net/forums/bl...tion-userform/
    https://www.developpez.net/forums/bl...-evenementiel/

    La solution de la variable tableau de "stockage" des données déjà saisie n'est pas une bonne idée.
    Autant stocker les informations (après traitement par les différents codes d'appel) directement dans les feuilles concernées.
    Voire même dans une feuille intermédiaire créée pour cela.

    Un collaborateur, sur un projet à 16h00, se voit contraint et forcé de quitter à 17h00 alors que son projet n'est finalisé qu'au 3/4.
    Il fait quoi avec sa variable tableau?

    D'autres sauront mieux t'orienter que moi, c'est certain.

    Bon courage
    Cordialement,
    Franck

  10. #10
    Membre régulier
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Service public

    Informations forums :
    Inscription : Février 2008
    Messages : 143
    Points : 106
    Points
    106
    Par défaut
    Bonjour Pijaku,

    J'ai lu rapidement les 2 liens que tu m'as passé mais je reviendrai les relire très prochainement.
    Dans l'ensemble mon code semble conforme, hormis la sortie du form avec des points intéréssants.
    Je charge mes forms comme l'indique Pierre.

    Effectivement ta suggestion est intéréssante :

    Autant stocker les informations (après traitement par les différents codes d'appel) directement dans les feuilles concernées.
    Voire même dans une feuille intermédiaire créée pour cela.

    Un collaborateur, sur un projet à 16h00, se voit contraint et forcé de quitter à 17h00 alors que son projet n'est finalisé qu'au 3/4.
    Il fait quoi avec sa variable tableau?
    Cela limitera la perte des données en cas de fermeture sauvage.
    J'avoue ne pas y avoir pensé. j'ai créé des fonctions et sub de sauvegardes, recherches appelé par plusieurs autres sub donc cela devrait être facilement faisable.

    Cela va compliquer un peu la navigation mais oui je retient cette solution au final

    Je vais travailler ainsi.

    Merci pour votre aide

  11. #11
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 949
    Points
    2 949
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    1- n'hésite pas à fouiller un peu le blog de Pierre. Il y a d'autres sujets qui traitent de UserForm...

    2- Petite réflexion comme ça, en passant.
    Si ton Multipage fait planter Excel, pourquoi ne pas le faire depuis une feuille Excel.
    Sans multipage.
    Tu te fais un formulaire directement dans la feuille...
    Bon ça signifie revoir une grosse partie du fichier.
    Cordialement,
    Franck

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/10/2007, 12h17
  2. Réponses: 4
    Dernier message: 26/07/2007, 21h56
  3. Réponses: 8
    Dernier message: 29/03/2007, 14h48
  4. Réponses: 3
    Dernier message: 05/02/2007, 09h41
  5. Appel de methode dont le nom est dans une variable
    Par osopardo dans le forum Langage
    Réponses: 1
    Dernier message: 24/11/2005, 20h56

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