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 :

Modifier la position d'une combobox en VBA [XL-2013]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Amateur
    Inscrit en
    Avril 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Avril 2013
    Messages : 5
    Par défaut Modifier la position d'une combobox en VBA
    Bonjour,
    J'ai un problème sous excel avec une combobox que je voudrai quand je clique sur la flèche, elle s'ouvre en définissant sa position top et sa largeur width.
    Exemple dans le fichier ci-dessous.
    Quand je mets un point d'arrêt sa fonctionne bien les 2 zones de la combobox sont bien alignées, mais en fonctionnement normal, j'ai 2 zones décalées d'affichage de ma combobox.
    J'utilise l'événement ComboBox1_DropButtonClick() pour définir les valeurs de top et width.

    Merci de votre aide

    Classeur1.xlsm

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par mcarnejac Voir le message
    Bonjour,

    Pour supprimer le décalage, mettez le contrôle en AutoSize. Autosize ne règle pas tout, la longueur ne s'ajuste que lorsque l'item a été choisi.
    Si vous souhaitez ajuster la largeur du contrôle en fonction de la taille de la plus longue chaîne, essayez ce code :

    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
     
    Private Sub ComboBox1_DropButtonClick()
     
    Dim I As Integer
    Dim LongueurMaxi As Integer
     
        LongueurMaxi = 0
        For I = 1 To ComboBox1.ListCount
            If LongueurMaxi < Len(ComboBox1.List(I - 1)) Then LongueurMaxi = Len(ComboBox1.List(I - 1))
        Next I
        Select Case LongueurMaxi
            Case Is < 30
                    ComboBox1.Width = 130
            Case Else
                    ComboBox1.Width = 250
        End Select
     
    End Sub
    Les longueurs sont à ajuster en fonction de vos items.

    Cordialement.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Amateur
    Inscrit en
    Avril 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Avril 2013
    Messages : 5
    Par défaut
    Bonjour,
    Merci pour votre réponse, mais c'est pas ce que je cherche à résoudre la largeur uniquement, mais c'est aussi la position de la combobox qui varie par code VBA lorsqu'on clique sur la flèche vers le bas.
    En fait ce qui doit rester à sa position de la combobox c'est le coin supérieur droit quand on clique sur la flèche vers le bas, avec une largeur qui varient.
    Dans mon exemple on se retrouve avec 2 parties décomposées:
    - quand on clique sur la flèche vers le bas de la combobox avec le rectangle de la combobox avec la flèche vers le bas à la bonne position et la bonne largeur donnée par le code VBA,
    - le rectangle contenant les divers choix de la combobox à la bonne largeur mais pas décalé vers la gauche, donc pas aligné avec le rectangle 1ère partie de la combobox avec la flèche.

    J'espère avoir été plus clair.

    Merci de votre aide.
    Cordialement.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par mcarnejac Voir le message
    Avec le code fourni et l'AutoSize, avez-vous toujours le problème de décalage ?
    Sinon, il vous faut faire un calcul Avant-Après de la position Gauche+Longueur et faire que la position Droite (Left+Width) Après, s'aligne avec la position Droite Avant.

    Cordialement.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Amateur
    Inscrit en
    Avril 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Avril 2013
    Messages : 5
    Par défaut
    Oui j'ai toujours le décalage avec l'autosize à true.

    Faire un calcul avant, pas de problème mais comment faire pour que les 2 parties de la combobox prennent en compte ce changement.
    Ce qui est bizarre c'est que quand je mets un point d'arrêt dans le code VBA et dans ComboBox1_DropButtonClick(), les 2 parties se décale bien et sont alignées.

    Cordialement.

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Le fait de modifier la largeur de la ComboBox par un agrandissement vers la gauche dissocie les deux contrôles qui la composent à savoir un TextBox et une ListBox et je ne crois pas que tu puisses trouver une solution dans ce cas là car c'est probablement un couac dans le positionnement de la ListBox sur l'évènement "DropButtonClick".
    Pour que le coté droit du ComboBox reste fixe, il te faut mémoriser sa position avant d'en modifier la largeur :
    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
     
    Private Sub ComboBox1_DropButtonClick()
     
        Dim Pos As Integer
     
        'pour que le coté droit de la ComboBox soit fixe
        Pos = ComboBox1.Left + ComboBox1.Width
     
        If ComboBox1.Width < 112 Then
     
            ComboBox1.Width = 210
            ComboBox1.Left = Pos - ComboBox1.Width
     
        Else
     
            ComboBox1.Width = 110
            ComboBox1.Left = Pos - ComboBox1.Width
     
        End If
     
    End Sub
    Maintenant, si tu tiens vraiment à ce fonctionnement il ne te reste plus qu'à réinventer la ComboBox.
    Une piste, tu poses une ListBox et un TextBox sur ta feuille (la ListBox juste dessous le TextBox) et tu colles le code ci-dessous (pas totalement abouti, à toi de peaufiner) dans le module de la feuille :
    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
     
    Private Sub TextBox1_DropButtonClick()
     
        Dim Pos As Integer
     
        Pos = TextBox1.Left + TextBox1.Width
     
        If TextBox1.Width < 112 Then
     
            TextBox1.Width = 210
            TextBox1.Left = Pos - TextBox1.Width
            ListBox1.Left = TextBox1.Left
            ListBox1.Width = TextBox1.Width
            ListBox1.Height = 130
     
        Else
     
            TextBox1.Width = 110
            TextBox1.Left = Pos - TextBox1.Width
            ListBox1.Left = TextBox1.Left
            ListBox1.Width = TextBox1.Width
            ListBox1.Height = 0
     
        End If
     
    End Sub
     
    Private Sub ListBox1_Click()
     
        TextBox1.Text = ListBox1.List(ListBox1.ListIndex)
        ListBox1.Height = 0
     
    End Sub
    L'évènement "DropButtonClick" n'est pas disponible dans la liste mais est malgré tout géré de même que la propriété "ShowDropButtonWhen".
    Code à mettre dans le module du classeur (code que tu peux exécuter sans forcément fermer et ré-ouvrir le classeur) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Private Sub Workbook_Open()
     
        Feuil1.TextBox1.ShowDropButtonWhen = 2
     
        Feuil1.ListBox1.AddItem ("Premier choix de la liste")
        Feuil1.ListBox1.AddItem ("Deuxième choix de la liste")
        Feuil1.ListBox1.AddItem ("Troisième choix de la liste")
        Feuil1.ListBox1.Height = 0
     
    End Sub

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

Discussions similaires

  1. Modifier la structure d'une table en vba ?
    Par devdev dans le forum VBA Access
    Réponses: 2
    Dernier message: 09/07/2009, 11h25
  2. Est il possible de modifier la position d'une scroll dans iframe
    Par Mho37 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 03/11/2008, 11h05
  3. Comment modifier la position d'une Form avec des RadioButton ?
    Par bionicleman dans le forum Composants VCL
    Réponses: 1
    Dernier message: 18/12/2007, 17h19
  4. Réponses: 2
    Dernier message: 02/07/2007, 19h44
  5. comment modifier le nom d'une colonne via VBA?
    Par Invité dans le forum Access
    Réponses: 6
    Dernier message: 24/11/2005, 15h36

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