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 :

Déplacer les options buttons par programmation [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 63
    Points : 48
    Points
    48
    Par défaut Déplacer les options buttons par programmation
    Bonjour,

    j'ai fait une userform, composé de 4 pages architecturées de la même façon, c'est à dire de 20 frames, avec 10 optionbutton à l’intérieur.

    Pour la concevoir, j'ai fait de simple copier coller, car au total, c'est environ 900 ojbets, dont 800 optionbutton

    Mon problème c'est que lors des copier coller, la réindexation automatique de optionbutton ne suit pas l'ordre des précédents. Du coup, l'ordre initiale, (1,2,3, ..., 9 , 10) est mis en désordre quasi aléatoires (2, 1, 3, 4, 7, 8 , 5, 6, 9)

    Au lieu de renommer ou bouger les 800 optionbuttons, je me demandais si je ne pouvais simplement pas leur imposer une position, au moins lorsque j'appelle la userform.

    Ce que j'ai essayé, pour paramétrer la position gauche de l'optionbutton dans la frame:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For i = 1 to 80
        for j = 1 to 10
            userform1.controls("OptionButton" & (i-1) * 10 + j).left = 4 + 10* j
    next j
    next i
    Et malheureusement, j'ai une erreur objet.

    Je me demande si je ne devrai pas indiqué la frame dans laquelle sont les optionbuttton, mais je ne sais pas comment l'écrire car j'aurai deux variables contrôles, la frame et l'optionbutton.
    Est ce possible ? (un truc du style userform1.controls("Frame" & k).controls(("OptionButton" & (i-1) * 10 + j).left = 4 + 10* j)

    Merci de votre aide

  2. #2
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,


    Citation Envoyé par Gautheron Voir le message
    Bonjour,

    j'ai fait une userform, composé de 4 pages architecturées de la meme facon, c'est à dire de 20 frames, avec 10 optionbutton à l'interieur.

    Pour la concevoir, j'ai fait de simple copier coller, car au total, c'est environ 900 ojbets, dont 800 optionbutton
    Moi, j'appelle cela de la torture et/ou une usine à gaz


    Mon problème c'est que lors des copiers collers, la réindexation automatique de optionbutton ne suit pas l'ordre des précédents. Du coup, l'ordre initiale, (1,2,3, ..., 9 , 10) est mis en désordre quasi aleatoires (2, 1, 3, 4, 7, 8 , 5, 6, 9)
    Que ton bouton s'appelle OptionButton300, OptionButton1, Hector, Octave, Nicholas, Jacques, Chirac, Ségolène, Julie, Valérie, François, Gustave ou Effeil, n'a aucune importance en soi. Ce qui compte, c'est de s'assurer que le bouton lance les bonnes procédures.

    Au lieu de renommer ou bouger les 800 optionbuttons, je me demandais si je ne pouvais simplement pas leur imposer une position, au moins lorsque j'appelle la userform.
    Tu les places manuellement une fois pour toute sur la Form. Ensuite, tant que n'y touches pas, ils ne bougent pas.

    Mais, la grande inconnue, c'est quoi la finalité de l'œuvre ? Personnellement, en lisant la question, cela me semble complètement illogique d'obliger un utilisateur normalement constitué de passer en revue 800 options avant d'effectuer un traitement, quel qu'il soit. Même, en supposant que l'utilisateur ne doive passer que sur une seule page, cela signifie de passer en revue 200 options. Cela va être aussi abrutissant que de toujours placer le même rivet sur une chaîne de montage.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 63
    Points : 48
    Points
    48
    Par défaut
    Tu les places manuellement une fois pour toute sur la Form. Ensuite, tant que n'y touches pas, ils ne bougent pas.
    Au delà du coté usine à gaz du projet, la volonté de pouvoir définir par programmation les emplacements des optionbuttons qui se trouvent dans des frames, situées elles memes dans des pages d'un userform, c'est exatement pour éviter de replacer 800 fois des objets !
    A savoir que cette accumulation d'objet est pour simplifier l'usage.

    Mais dans le fond, savoir comment repositionner des objets à volonté est extrêment intéressant et peu permettre de sophistiquer l'utulisation des userform, perfectionner les mises en page en fonction des contenus, etc.

  4. #4
    Membre habitué
    Inscrit en
    Décembre 2008
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 115
    Points : 180
    Points
    180
    Par défaut
    Bonjour
    Pour le code, les formules de calcul dans une zone texte, c'est ....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    For i = 1 to 80
        for j = 1 to 10
            'the formule
            k=(i-1) * 10 + j
            d=4 + 10* j     'celui-ci est moins nécessaire, mais beaucoup mieux pour déboguer
            userform1.controls("OptionButton" & k).left = d
        next j
    next i
    Il faut regarder à quel objet se rapportent les propriétés "Top" et "Left", sinon ça risque d'être surprenant quant le frame va bouger
    Cordialement

  5. #5
    Expert éminent
    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
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Un petit exemple pour positionner les boutons d'option sur le cadre.
    Ici, les contrôles sont positionnés de haut en bas et de droite à gauche et il n'y a que la barre de défilement horizontale pour pouvoir accéder aux bouton cachés.
    Pour mon exemple, les boutons se nomment "OptionButton1", "OptionButton2", "OptionButton3", etc...
    Pour tester, pose autant de boutons d'options dans ton cadre et ouvre la Form. Si tu as plusieurs Frames, tu peux boucler dessus pour positionner tous tes boutons. Pour gérer les valeurs je pense qu'un module de classe est inévitable car 800 procédures à écrire ça va être lourd et fastidieux :
    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    Private Sub UserForm_Initialize()
     
        Dim Haut As Integer
        Dim Gauche As Integer
        Dim Largeur As Integer
        Dim Hauteur As Integer
        Dim Ecart As Integer
        Dim I As Integer
     
        'dimensions des boutons
        Largeur = 130
        Hauteur = 20
     
        'écartement par rapport aux bords et entre eux
        Ecart = 10
     
        'point de départ
        Haut = Ecart
        Gauche = Ecart
     
     
        With Me.Frame1
     
            For I = 0 To .Controls.Count - 1
     
                'les boutons sont sencés être nommés "OptionButton" & l'index
                'comme par exemple "OptionButton1"
                With .Controls("OptionButton" & I + 1)
     
                    'dimensionne les boutons
                    .Width = Largeur
                    .Height = Hauteur
     
                    'positionne les boutons
                    .Top = Haut
                    .Left = Gauche
     
                End With
     
                'incrémente pour le positionnement suivant
                Haut = Haut + Hauteur + Ecart
     
                'contrôle qu'il soit possible de continuer le positionnement vers le bas
                'dans le cas contraire, définie la position pour la rangée suivante
                If Haut + Hauteur + Ecart > .Height Then
     
                    Haut = Ecart
                    Gauche = Gauche + Largeur + Ecart
     
                End If
     
                'si le nombre de rangées dépassent la largeur du cadre, affiche la barre de
                'défilement horizontal pour pouvoir accéder au bouton cachés
                With Me.Frame1
     
                    If Gauche + Largeur + Ecart > .Width Then
     
                        .ScrollBars = fmScrollBarsHorizontal
                        .ScrollWidth = Gauche + Largeur + Ecart
     
                    End If
     
                End With
     
            Next I
     
        End With
     
    End Sub
    Hervé.

  6. #6
    Expert éminent
    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
    Points : 6 871
    Points
    6 871
    Par défaut
    Oups,

    ce n'est pas droite à gauche mais de gauche à droite que les contrôles sont positionnés !

    désolé

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 63
    Points : 48
    Points
    48
    Par défaut
    Fantastique. Merci à tous de vos réponses. Mission accomplie a priori.

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

Discussions similaires

  1. [D7] modification option regional par programmation
    Par kheldoun ahmed dans le forum Delphi
    Réponses: 8
    Dernier message: 24/05/2007, 20h18
  2. Récupérer les options envoyer par un serveur dhcp
    Par nunuschi dans le forum Réseau
    Réponses: 3
    Dernier message: 27/08/2006, 14h24
  3. Réponses: 13
    Dernier message: 09/07/2006, 15h53
  4. Gérer les évènements VBA par programmation
    Par gbuxo dans le forum VBA Access
    Réponses: 14
    Dernier message: 09/05/2006, 11h13
  5. Vous gerez comment les options d'un programme?
    Par n0n0 dans le forum C++Builder
    Réponses: 5
    Dernier message: 17/05/2002, 13h21

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