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 :

boucle sur controls MSFORMS [XL-MAC 2016]


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2016
    Messages
    306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2016
    Messages : 306
    Par défaut boucle sur controls MSFORMS
    bonjour,

    Le problème: pourquoi dans mon code ci-dessous, le if ne filtre pas correctement mes controls ?
    Le but: lorsque le togglebutton3 n'est pas enfoncé décoche toutes les checkbox du frame1 sinon coche tous les checkbox du frame1

    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
    Private Sub toggleButton3_click()
    Dim ctrl As Object
    Dim NumeroLabel As String
     
        For Each ctrl In Me.Frame1.Controls 'Boucle sur tout les contrôles de l'userform
                If TypeOf ctrl Is MSForms.CheckBox Then
                NumeroLabel = Mid(ctrl.Name, 9, Len(ctrl.Name) - 8)
                    If ToggleButton3.Value = True Then
                    Me.Frame1.Controls("CheckBox" & NumeroLabel).Value = True
                    Else
                    Me.Frame1.Controls("CheckBox" & NumeroLabel).Value = False
                    End If
                End If
        Next ctrl
    End Sub
    Ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If TypeOf ctrl Is MSForms.CheckBox Then
    j'ai du toggleButton qui passe alors que cela ne devrait pas

    qqun serait m'expliquer et résoudre mon pb SVP ?
    Merci

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    993
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 993
    Par défaut
    Salut, essaie avec cette légère modif. On vérifie si le nom du contrôle contient bien la chaîne "CheckBox" avant de le traiter. Cela pourrait empêcher le traitement de contrôles indésirables.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    For Each ctrl In Me.Frame1.Controls 'Boucle sur tout les contrôles de l'userform
        If TypeOf ctrl Is MSForms.CheckBox And InStr(1, ctrl.Name, "CheckBox") > 0 Then
            NumeroLabel = Mid(ctrl.Name, 9, Len(ctrl.Name) - 8)
            If ToggleButton3.Value = True Then
                ctrl.Value = True
            Else
                ctrl.Value = False
            End If
        End If
    Next ctrl

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 545
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 545
    Par défaut
    peut-être utiliser If TypeName(ctrl) = "CheckBox" Then"

  4. #4
    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 171
    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 171
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Ce n'est bien entendu pas la réponse à votre question mais je me permets une petite remarque sur ce genre de ligne de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     If ToggleButton3.Value = True Then
                    Me.Frame1.Controls("CheckBox" & NumeroLabel).Value = True
    Il est plus simple et plus rapide d'écrire et sans If et cela vous évite le Else
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.Frame1.Controls("CheckBox" & NumeroLabel).Value =ToggleButton3.Value
    A lire éventuellement mon billet sur ce sujet VBA - De la mauvaise utilisation d'un If...Then...Else pour modifier une propriété Booléenne

    Si c'est l'inverse que vous voulez, il suffit d'ajouter le Not

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.Frame1.Controls("CheckBox" & NumeroLabel).Value = Not ToggleButton3.Value
    [EDIT]
    Voir cette discussion avec comme objet boucle sur les controles dans un frame pour parcourir les contrôles d'un Frame et en testant avec TypeName
    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

  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 171
    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 171
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Ce code fonctionne. Attention que j'ai changé le nom de certains contrôles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub toggleButton1_click()
      Dim ctrl As Object
      Dim NumeroLabel As String
      For Each ctrl In Me.Frame1.Controls 'Boucle sur tout les contrôles de l'userform
          If TypeName(ctrl) = "CheckBox" Then
             ctrl.Value = ToggleButton1.Value
          End If
      Next ctrl
    End Sub
    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 éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2016
    Messages
    306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2016
    Messages : 306
    Par défaut
    Bonjour Franc, umfred, Philippe Tulliez,

    Déjà merci pour vos interventions.

    @umfred + Philippe: La méthode TypeName(ctrl) est plus favorable et fonctionne mieux que typeof ctrl Is MSForms.checkbox
    => je suis débutant et je ne sais pas pourquoi TypeName fonctionne ou est plus approprié que MSForms, mais bon le principal c'est que ça fonctionne avec TypeName

    @Franc => je pars donc sur du TypeName c'est mieux

    @Philippe, ok avec
    Me.Frame1.Controls("CheckBox" & NumeroLabel).Value =ToggleButton3.Value je ne l'avais pas perçu. Donc cela élimine effectivement un if et 3 lignes de code, c'est toujours bon à prendre.

    Mon problème est résolut. Merci encore

  7. #7
    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 171
    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 171
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Le TypeOf fonctionne parfaitement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub toggleButton1_click()
      Dim ctrl As Object
      For Each ctrl In Me.Frame1.Controls 'Boucle sur tout les contrôles de l'userform
          If TypeOf ctrl Is msforms.CheckBox Then ctrl.Value = ToggleButton1.Value
      Next ctrl
      Set ctrl = Nothing
    End Sub
    Si le changement de couleurs et de texte d'un ToggleButton vous intéresse, vous pour consulter mon billet Fonction générique pour modifier la couleur et le texte d'un ToggleButton
    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

  8. #8
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2016
    Messages
    306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2016
    Messages : 306
    Par défaut
    Bonjour Monsieur Philippe,

    J’essayerai demain si ça fonctionne.
    En revanche tout ce matin j’ai bataillé sur .backcolor du togglebutton et j’ai peur de froisser certains, mais ça ne marche pas
    Si le changement de couleurs et de texte d'un ToggleButton vous intéresse, vous pour consulter mon billet Fonction générique pour modifier la couleur et le texte d'un ToggleButton
    Sujet sur le .backcolor problème de «*fond grisé*»
    Ici: http://www.developpez.net/forums/d80...-togglebutton/
    J’ai bataillé ce matin et non ce n’est pas au point !
    J’ai un tooglebutton qui par ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Togglebutton1.backcolor=IIF(Togglebutton1.value,vbRed,vbGreen)
    Togglebutton1.Caption=IIF(Togglebutton1.value,*«*KO »,«OK»)
    En gros lorsque j’enfonce le bouton (car je décide mettre un «*KO*» sur le,togglebutton), il doit se colorier en rouge sauf que c’est rouge en plus pale, puis lorsque j’appuis à nouveau (je décide de passer du «*KO*» vers du «*OK*») alors on voit durant moins d’1s le togglebutton passé d’un rouge pale à un rouge vif pour finir à du vert.
    Comme je ne sais pas résoudre cela j’ai joué sur le forecolor 😞

    Mais on dérive un peu du sujet 😃

  9. #9
    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 171
    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 171
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    n revanche tout ce matin j’ai bataillé sur .backcolor du togglebutton et j’ai peur de froisser certains, mais ça ne marche pas
    Je peux vous certifier que cela fonctionne parfaitement. Je ne publie rien que je n'ai testé. En revanche d'après la discussion vous avez un MAC et tout ne fonctionne pas sur MAC comme Windows (par exemple les ActiveX)
    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

  10. #10
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2016
    Messages
    306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2016
    Messages : 306
    Par défaut
    J’ai essayé aussi sur pc, mais je ferai screeshot car dur à me croire 😀

  11. #11
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2016
    Messages
    306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2016
    Messages : 306
    Par défaut
    Voila
    Je clique dans le togglebutton il passe a mon vbred
    Nom : BF37442F-BFB0-4E43-9B6C-15AA5227112A.jpeg
Affichages : 609
Taille : 38,9 Ko

    Je reclique pour basculer
    Avant de passer au vert il passe par un rouge Furtif plus foncé
    Nom : 4A105143-AFD4-473A-91AD-DB2FD20FAA6A.jpeg
Affichages : 601
Taille : 43,4 Ko
    Pour arriver au vert
    Nom : B503550D-9F1B-4E03-8223-3006D9944E77.jpeg
Affichages : 607
Taille : 26,2 Ko

    Pourquoi ça ne marche pas j’ai rouge pale et non le rouge vif demandé par vbred ?
    Explication ou solution avez vous ?

  12. #12
    Membre émérite Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 508
    Par défaut
    Salut testes comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With Togglebutton1
        .BackColor = IIf(.Value = True, vbRed, vbGreen)
        .Caption = IIf(.Value = True, "ON", "OFF")
    End With

  13. #13
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2016
    Messages
    306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2016
    Messages : 306
    Par défaut
    Hier, 21h28
    Valtrase
    Salut testes comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With Togglebutton1
    .BackColor = IIf(.Value = True, vbRed, vbGreen)
    .Caption = IIf(.Value = True, "ON", "OFF")
    End With
    non pareil, je constate que
    lorsque je clique une fois dans le togglebutton, cela le fait passé en rouge pale
    lorsque je clique dans le togglebutton MAIS que je ne relache pas le bouton de la souris le rouge pale passe à un rouge vif (et c'est cette couleur que j'ai demandé !)
    lorsque je relache le clique de la souris alors le rouge vif passe au vert

    j'ai essayé sur un PC, une nouvelle feuille excel et dans un userform1 j'ai mais uniquement un togglebutton1 cela me produit le même effet

  14. #14
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 545
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 545
    Par défaut
    ça a l'air d'être le comportement normal du contrôle malheureusement pour la couleur.
    Si tu tiens à la couleur, une possible alternative serait d'utiliser un bouton normal (et utiliser le backgroundcolor pour définir/récupérer l'état)

  15. #15
    Membre émérite Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 508
    Par défaut
    Salut le fil,
    Peut-être simplement parce que le bouton-bascule à le focus testes en envoyant le focus sur un autre contrôle

    Sinon j'ai eu l'ocasion d'utiliser ceci : WorksheetsVBA - Switcher control for VBA userform

  16. #16
    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 171
    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 171
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    lorsque je clique une fois dans le togglebutton, cela le fait passé en rouge pale
    lorsque je clique dans le togglebutton MAIS que je ne relache pas le bouton de la souris le rouge pale passe à un rouge vif (et c'est cette couleur que j'ai demandé !)
    lorsque je relache le clique de la souris alors le rouge vif passe au vert
    Avez-vous tester le code que j'ai publié dans mon billet Fonction générique pour modifier la couleur et le texte d'un ToggleButton ?

    Chez moi cela fonctionne parfaitement

    Illustration

    Nom : ToggleButtopn_On_Off.gif
Affichages : 611
Taille : 19,4 Ko


    Fichier de démonstration
    Fichiers attachés Fichiers attachés
    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

  17. #17
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2016
    Messages
    306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2016
    Messages : 306
    Par défaut
    bonjour Philippe,

    j'ai testé votre macro sur mon pc, mais j'ai toujours le problème lors de la transition votre Vert qui est un peu grisé deviendra un vert plus vif de manière fugitif. Je pense et comme l'a dit Valtrase cela est inhérent au togglebutton.

    Je vais me contenter de ça, merci aussi pour vos aides (votre code est super dur pour moi)

    je voudrais cloturer le sujet car j'en ai un nouveau à ouvrir

  18. #18
    Membre émérite Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 508
    Par défaut
    Salut le fil
    Bon il est évident que pour savoir que le bouton bascule est activer la couleur doit changer c'est un mix entre le vert et le gris.
    En bidouillant un peu avec deux images, une verte l'autre rouge, on arrive au résultat.
    D'abord mettre la propriété BackStyle du bouton sur transparent, ensuite créer deux images verte et rouge, leur donner la même taille que le bouton, on aligne les trois et on les groupe. Ensuite il ne reste plus qu'a jouer sur la propriété visible des images.

    Pièce jointe 638046

  19. #19
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2016
    Messages
    306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2016
    Messages : 306
    Par défaut
    Ok Valtrace, je tente cette idée… merci

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

Discussions similaires

  1. Boucle sur Control : Ordre des controls dans la Liste
    Par juanpa dans le forum Général VBA
    Réponses: 5
    Dernier message: 05/02/2015, 00h16
  2. Boucle sur controles et .tag associé
    Par pleskyd dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 14/10/2011, 17h13
  3. [AC-2003] boucle sur le nom de controles
    Par piere42 dans le forum IHM
    Réponses: 1
    Dernier message: 01/04/2009, 12h17
  4. [C#] Boucle sur les controles
    Par stailer dans le forum Windows Forms
    Réponses: 3
    Dernier message: 10/05/2006, 08h48
  5. [JSP/WebSphere] Boucle de controle sur un FTP
    Par benben13 dans le forum Websphere
    Réponses: 10
    Dernier message: 30/08/2005, 16h18

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