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 :

Modification d'un UserForm dès son ouverture [XL-2019]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2020
    Messages : 9
    Par défaut Modification d'un UserForm dès son ouverture
    Bonjour à tous, je débute en VBA et je suis coincé avec mon UserForm (modifierProduit).

    Je m'explique: j'aimerai qu'en ouvrant celui-ci (après avoir cliqué sur un bouton) il s'ouvre à une position définit et que certain de ses composants (Label , ComboBox, ...) soit apparents aussi avec chacun leur position (Height, Left, Top, Width).

    Ensuite j'aimerai qu'en cliquant sur un bouton, certain des composants soient cachés et que d'autres apparaissent à des positions différentes.
    Comme mon nombre de composant est assez important, j'ai décidé de créer une fonction (majPosition) qui récupère les informations d'une autre fonction (SetPosition) et qui change les valeurs de : Height, Left, Top, Width et Visible pour un composant choisi (aussi bien la fenêtre de mon UF que ses composants).

    J'ai cherché sur internet et j'ai lu qu'on pouvait utiliser le fonction "Me" mais j'ai l'impression que celle-ci ne concernce que les UF et pas ses composants.

    PS: j'ai bien créé un type position que j'ai mis dans mon module:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Type Position
        Hauteur As Single
        Gauche As Single
        Haut As Single
        Large As Single
        Voir As Boolean
    End Type
    Voici mon code si vous savez m'aider...

    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
    Dim posLabel_ancienMP As Position, posmodifierProduit As Position
     
     
    Private Sub UserForm_Initialize()
     
        posmodifierProduit = SetPosition(1, 48, 18, 18, True)
        Call majPosition(posmodifierProduit, modifierProduit.Height, modifierProduit.Left, modifierProduit.Top, modifierProduit.Width, modifierProduit.Visible)
     
        posLabel_ancienMP = SetPosition(18, 48, 18, 18, True)
        Call majPosition(posLabel_ancienMP, Label_ancienMP.Height, Label_ancienMP.Left, Label_ancienMP.Top, Label_ancienMP.Width, Label_ancienMP.Visible)
     
    End Sub
     
    Private Function majPosition(element As Position, H As Single, L As Single, T As Single, W As Single, V As Boolean)
     
        H = element.Haut
        L = element.Gauche
        T = element.Haut
        W = element.Large
        V = element.Voir
     
    End Function
     
     
    Private Function SetPosition(Hauteur As Single, Gauche As Single, Haut As Single, Large As Single, Voir As Boolean) As Position
     
        SetPosition.Hauteur = Hauteur
        SetPosition.Gauche = Gauche
        SetPosition.Haut = Haut
        SetPosition.Large = Large
        SetPosition.Voir = Voir
     
    End Function

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 410
    Par défaut
    Bonjour.

    Je viens de faire un petit test avec le code suivant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub CommandButton1_Click()
        Me.TextBox1.Left = Me.TextBox1.Left + 10
    End Sub
    Et mon contrôle TextBox1 c'est déplacé de 10 unités (des twips ? pas sûr de ce dont se sert Excel pour les mesures) vers la droite à chaque appuis du bouton jusqu'à même sortir du formulaire.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2020
    Messages : 9
    Par défaut
    Bonsoir,

    Merci à vous pour votre réponse, j'ai essayé d'ajouter la commande Me. dans la fonction majPosition mais j'ai maintenant une erreur de compilation m'indiquant que mes méthodes n'existaient pas.

    Avez-vous une idée pour faire reconnaître à cette fonction que mes H, L, T, W et V sont en réalité des modifierProduit.Height, modifierProduit.Left, ...

    Voir le code ci-après :

    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
     
    Dim posLabel_ancienMP As Position, posmodifierProduit As Position
     
     
    Private Sub UserForm_Initialize()
     
        posmodifierProduit = SetPosition(1, 48, 18, 18, True)
        Call majPosition(posmodifierProduit, modifierProduit.Height, modifierProduit.Left, modifierProduit.Top, modifierProduit.Width, modifierProduit.Visible)
     
        posLabel_ancienMP = SetPosition(18, 48, 18, 18, True)
        Call majPosition(posLabel_ancienMP, Label_ancienMP.Height, Label_ancienMP.Left, Label_ancienMP.Top, Label_ancienMP.Width, Label_ancienMP.Visible)
     
    End Sub
     
    Private Function majPosition(element As Position, H As Variant, L As Variant, T As Variant, W As Variant, V As Variant)
     
        Me.H = element.Haut
        Me.L = element.Gauche
        Me.T = element.Haut
        Me.W = element.Large
        Me.V = element.Voir
     
    End Function
     
     
    Private Function SetPosition(Hauteur As Single, Gauche As Single, Haut As Single, Large As Single, Voir As Boolean) As Position
     
        SetPosition.Hauteur = Hauteur
        SetPosition.Gauche = Gauche
        SetPosition.Haut = Haut
        SetPosition.Large = Large
        SetPosition.Voir = Voir
     
    End Function
    A+

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 410
    Par défaut
    Bonjour.

    Je suis désolé mais je ne saisi pas ce que tu veux faire avec ce code car il ne fait référence à aucun contrôle sur le formulaire.
    Là tu as utilisé un Type qui est une structure interne de ton code et tu change ses valeurs donc à priori il ne se passe rien sur ton formulaire.
    En gros tu te parles de toi à toi.

    Si tu veux déplacer et redimentionner un contrôle, personnellement je ferai quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private sub MAJPositionControle(prmControl as Control, prmPositionHaut as long, prmPositionGauche as long, prmHauteur as long, prmLargeur as long)
         prmControl.top=prmPositionHaut
         prmControl.Left=prmPositionGauche
         prmControl.Height=prmHauteur
         prmControl.Width=prmWidth
    end sub
    Exemple d'utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    call MAJPositionControle(me.Text1, 10, 20, 1000, 500) 'Va placer le contrôle Text1 à la position 10, 20 avec une hauteur de 1000 et une largeur de 500.
    En passant l'intérêt des Type est de manipuler toute une structure de données en un seul élément donc quand tu t'en sers comme paramètre tu peux écrire quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private sub MAJPositionControl(prmControl as control, prmInfoPosition as Position)
    Évidement dans le code de la procédure, tu peux récupérer les attributs individuels.

    Tu fais l'appel comme ceci par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    call MAJPositionControl(me.TonControlProduit, posModifierProduit)
    Personnellement je trouve me. très cool maintenant mais cela m'a pris un peu de temps à l'apprivoiser.

    Note : le préfixe prm est un truc à moi qui veut dire Paramètre est qui me permet de savoir que cette variable vient de l'extérieur de ma procédure ou fonction.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  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 170
    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 170
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    j'ai essayé d'ajouter la commande Me. dans la fonction majPosition mais j'ai maintenant une erreur de compilation m'indiquant que mes méthodes n'existaient pas.
    Cela signifie que la fonction n'est pas présente dans le module du UserForm mais dans un module standard.
    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 régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2020
    Messages : 9
    Par défaut
    Bonjour,


    Merci pour vos réponse, mais je n'y arrive toujours pas...

    J'ai utilisé ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Sub UserForm_Initialize()
     
        Call MAJPositionControle(Me.Label_ancienMP, 18, 48, 18, 18)
    End Sub
     
    Private Sub MAJPositionControle(prmControl As Control, prmHauteur As Double, prmPositionGauche As Variant, prmPositionHaut As Variant, prmLargeur As Double)
         prmControl.Top = prmPositionHaut
         prmControl.Left = prmPositionGauche
         prmControl.Height = prmHauteur
         prmControl.Width = prmLargeur
    End Sub
    Avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Type Control
        Hauteur As Double
        Gauche As Variant
        Haut As Variant
        Large As Double
    End Type
    J'ai alors une erreur de compilation avec un type d'argument ByRef incompatible sur cette ligne :

    Call MAJPositionControle(Me.Label_ancienMP, 18, 48, 18, 18, True)

    J'ai pourtant bien vérifier et c'est bien le nom de ma zone de texte de mon UserForm (qui s'appelle modifierProduit)...

    A+

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

Discussions similaires

  1. Donner une valeur à une textbox dès son ouverture et modification
    Par Skynee dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 20/04/2019, 13h33
  2. Rapport imprimé lors de son ouverture
    Par charleshbo dans le forum Access
    Réponses: 3
    Dernier message: 09/05/2006, 16h50
  3. Réponses: 3
    Dernier message: 27/04/2006, 14h29
  4. Erreur sur ma requête à son ouverture
    Par ghan77 dans le forum Bases de données
    Réponses: 7
    Dernier message: 23/01/2006, 16h46
  5. Réponses: 6
    Dernier message: 20/10/2005, 08h59

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