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 :

Problème checkbox et cellule boolean


Sujet :

Macros et VBA Excel

  1. #1
    Membre très actif
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Par défaut Problème checkbox et cellule boolean
    Bonjour à tous,

    Alors voilà mon problème: j'ai une checkbox, qui en prend la valeur d'une cellule contenant soit 0 soit 1 (servant de boolean). Le problème c'est que j'obtiens l'erreur
    "La métode Range de l'objet '_Worksheet' a échoué" lorsque j'ai 1 dans la colonne B et 0 dans la colonne C (sur la même ligne). Dans tous les autres cas, cela fonctionne. Je ne vois absolument pas comment résoudre l'erreur.

    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
    Private Sub L1_Click()
        Application.EnableEvents = False
        With Sheets(1).Range("B" & Module1.ligne)
            If Sheets(1).Range("C" & Module1.ligne).Value = False Then
                If .Value = False Then
                    .Value = 1
                Else
                    .Value = 0
                End If
            Else
                Me.L1.Value = 1
            End If
            Me.L1.Value = .Value
        End With
        Application.EnableEvents = True
    End Sub
    Et voilà à quoi ressemble mon fichier (il s'agit d'un fichier de test) :
    Nom : Capture.JPG
Affichages : 431
Taille : 30,3 Ko
    Si quelqu'un sait comment résoudre l'erreur, merci d'avance!

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    712
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

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

    En VBA, True vaut -1:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub test()
        Debug.Print 1 * False
        Debug.Print 1 * True
    End Sub

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    BOnjour,

    J'ai pas tout bien compris, mais comme tu travailles avec des Vrai/Faux et des chiffres 0/1, je pense que le 1 cause problème
    0 = Faux
    -1 = Vrai
    1 <> Vrai <> Faux

    EDIT: J'ai été trop lent...

  4. #4
    Membre très actif
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Par défaut
    Je ne savais, j'essaye donc avec -1.

    Merci beaucoup =)

    [Edit]
    J'ai exactement la même erreur avec -1, ça ne change strictement rien
    [/edit]

  5. #5
    Membre Expert
    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    712
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 712
    Par défaut
    Quelle est la ligne de code sur laquelle le problème survient?

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Et qu'est-ce que L1 ? un Checkbox ?
    si oui, liée à des cellules ?

    Ça prendrait peut-être un peu plus d'explications...

  7. #7
    Membre très actif
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Par défaut
    En fait le problème vient du fait qu'en modifiant la valeur, cela créé une récurrence, causant une boucle infinie, et donc un plantage (au bout d'un moment) à chaque fois que l'on fait appel à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sheets(1).Range("B"&Module1.ligne)
    En gros, au bout d'un certain nombre de boucles, le programme plante sur une nouvelle récurrence.

    J'aimerai donc trouver un moyen d'empêcher l'appel à L1_change() et L1_Click (L1 étant ma checkBox). Chose que Application.enableEvents=False devrait empêche, mais ne fait aucune différence ici.

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Tu pourrais utiliser une variable Booléenne Public
    Tu la mets à True avant de faire L1= .Value et la remet à False après
    Dans ton événement Click ou Change, tu vérifies l'état de cette variable.

  9. #9
    Membre très actif
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Par défaut
    C'est ce que j'ai fait pur contourner le problème , mais ça ne m'explique toujours pas la récurrence alors qu'il ne devrait pas y en avoir :/

  10. #10
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    Bonjour,

    A vue de pif, je dirais que ton événement L1_Change() doit se terminer par un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.EnableEvents = True
    qui annule le False de l'événement _Click.

    Mais sans voir...
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  11. #11
    Membre très actif
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Par défaut
    @AlainTech

    Bonjour,

    Tu n'as pas du tout lu le code, car tout y est.
    Et le problème ne peut pas venir de là, car justement, le but est d'empêcher l'event de se faire en boucle. Le problème est surtout que le Application.EnableEvents=false ne fonctionne pas (et non pas l'inverse).

  12. #12
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour

    Sans préjudice aucun de l'intérêt de ces manoeuvres, ni de leur efficacité ou de leur finalité (en les exécutant donc comme l'en a décidé le demandeur), je n'ai aucun problème avec ceci :

    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
    Private Sub Worksheet_Activate()
      CheckBox1.LinkedCell = "Feuil10!B1"
    End Sub
     
     
    Private Sub CheckBox1_Click()
      Dim toto As Range
      With Sheets("Feuil10")
        Set toto = .Range(CheckBox1.LinkedCell)
        toto.Value = CheckBox1.Value ^ 2
        If toto.Offset(0, 1).Value = 0 Then
           If toto.Value = 0 Then
             toto.Value = 1
           Else
              toto.Value = 0
           End If
        Else
          CheckBox1.Value = 0
        End If
        CheckBox1.Value = toto.Value '* -1
      End With
    End Sub
    qui "travaille" sur la ligne 1 de la feuille "Feuil10"
    Attention : ma checkbox est ici sur une feuille de calcul. Si sur un userform : ce n'est pas la propriété LinkedCrell, mais la propriété Controlsource, qu'il faut utiliser

  13. #13
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    Citation Envoyé par jeanmidudu Voir le message
    Tu n'as pas du tout lu le code, car tout y est.
    Je me permets de te citer:
    Politesse, respect et humilité sont les 3 éléments de base dans une bonne relation d'entraide
    Ne trouves-tu pas que tu affirmes d'une manière manquant d'humilité?

    Pour te montrer que j'ai bien tout lu, je reprends ta phrase:
    J'aimerai donc trouver un moyen d'empêcher l'appel à L1_change() et L1_Click (L1 étant ma checkBox).
    Tu ne nous montres pas le code de L1_Change().

    De plus, dans ton code, tu fais référence à Module1.ligne dont on ne sait pas comment il est généré.

    Il faut que tu saches que j'ai un emploi du temps extrêmement chargé.
    Que, malgré ça, je passe beaucoup de temps en modération du forum (je lis TOUS les messages de Macros et VBA Excel).
    Tout ça ne me laisse que très peu de temps pour répondre à des questions.
    J'en ai pris du temps pour répondre à la tienne car le sujet m'a interpellé.
    J'ai répondu avec l'expérience que j'en ai.
    J'aurais aimé pouvoir tester mais impossible car tu ne montres pas tout.

    Alors, s'il te plaît, ne dis pas que je n'ai "pas du tout lu"...

    Bien cordialement

    Alain

    P.S. Je reste intéressé par le contenu de ton L1_Change() et la façon dont Module1.ligne est créé.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  14. #14
    Membre très actif
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Par défaut
    @AlainTech et @unparia

    Désolé si je vous ai offensés, ce n'était pas mon intention. Je vais donc m'expliquer plus clairement :

    En ce qui concerne le code de L1_change() Je ne l'ai pas donné car je ne l'ai pas modifié. C'était dans le sens où une modification non souhaitée de la checkbox avait lieu, sans intervention de ma part. Pour être exact, c'est l'event qui correspond soit à L1_change() soit à L1_click() que je veux empêcher d'avoir lieu. Certes ma formulation était imprécise, je vous prie de m'en excuser.

    Ensuite en ce qui concerne Module1.ligne, il est crée dans Module1 en variable globale et initialisé à 2 dans mon usf. J'ai un spinButton qui fait incrémenter ou décrémenter sa valeur, de 1 en 1. Si nécessaire, je pourrais vous en fournir le code.

    @unparia
    J'ai essayé ta solution (je travaille avec un usf), mais le résultat reste strictement le même, c'est-à-dire un appel récurrent et infini à la fonction L1_click().

    Je vous suis reconnaissant du temps que vous passez pour moi, je n'arrive pas à imaginer ce que représente le travail d'un modérateur AlainTech, et je te prie de croire que je n'avais pas l'intention d'être agressif. J'avais mal lu et n'avait pas remarqué que tu parlais de L1_change() et non pas de L1_click(). J'espère donc que tu auras compris que je n'utilise pas L1_change() et que donc l'erreur ne peut pas venir de là.

  15. #15
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Si tu utilises les 2 événements _Change() et _Click(), je pense que tu fais une erreur.
    Les 2 sont sensiblement les mêmes.
    C'est possiblement là la source de l'erreur.

  16. #16
    Membre très actif
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Par défaut
    j'expliquais justement au-dessus que je n'en utilise qu'un seul, qui n'est autre que L1_click(). Je n'utilise pas change()

  17. #17
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Désolé, j'ai dû sauter la dernière ligne...
    Si tu utilises la variable booléenne comme mentionnée plus haut, ça fonctionne ?

    Est-ce que tu utilises Application.EnableEvents ailleurs dans le code ?
    J'ai comme l'impression que cette valeur (False au départ) se perd ailleurs dans le code, ce qui fait qu'elle devient True quand elle repasse dans cet événement.
    Est-ce possible ?

  18. #18
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Le code que je t'ai montré a été testé sur un projet neuf et fonctionne sans faille et sans boucle infinie.
    S'il ne fonctionne pas une fois intégré à ton projet, ce ne peut donc être qu'en raison d'autres bouts de code dans ton projet.
    Cherche-les. Je subodore (entre autres hypothèses) des instructions dans un évènement change (non de ta checkbox, mais de ta feuille de calcul), mais tu es bien seul à savoir ce que tu as dans ton projet.
    Je réitère donc : mon code fonctionne, seul, sans faille.

  19. #19
    Membre très actif
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Par défaut
    @parmi
    J'ai en effet contourné le problème via l'utilisation d'une variable booléenne (j'avais trouvé la solution seul), mais je continue de me demander pourquoi sans cette variable j'ai une boucle infinie.
    Il s'agit également de la seule fois où j'utilise Application.EnableEvents dans le code. Il n'est utilisé à aucun autre endroit dans le projet.

    @unparia
    J'ai testé le programme que tu m'as donné seul (en-dehors du projet, avec seulement un usf et une checkbox), j'obtiens toujours la boucle infinie (idem avec mon code). J'ai également d'autres projets sur lesquels ces programmes (le tien comme le mien) fonctionnent correctement. Est-ce que cela pourrait venir d'un des paramètres du projet?
    En ce qui concerne l'utilisation de la feuille, c'est la seule modification qui en est faite.
    Je fournirai le projet complet dans la soirée ou demain, vous pourrez ainsi vérifier mes dires.

  20. #20
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    Bonjour,

    J'ai trouvé!

    Ce qui réactive les Events est le fait d'essayer de donner la valeur 1 à la CheckBox dans cette ligne:
    La CheckBox ne peut accepter cette valeur (ni True, ni False).

    Travaille avec de vraies valeurs booléennes et tu n'auras plus le soucis.

    Je me disais bien que cette discussion me ferait apprendre quelque chose...

    Edit: La suite va m'apprendre que j'avais tort. Application.EnableEvents est inefficace dans un UserForm.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. Problème selectOneItem avec un boolean
    Par toutoune60 dans le forum JSF
    Réponses: 28
    Dernier message: 05/11/2007, 22h23
  2. Problème alignement dans cellule sous IE
    Par mauriceuh dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 12/02/2007, 13h08
  3. [VBA-E] Problème d'offset cellule
    Par GI_GI dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/01/2007, 10h47
  4. [VBA - Excel] Problème de deux cellules sur l'evenement OnChange
    Par champmart dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 10/01/2007, 17h06
  5. [VBA] problème choix de cellule dans feuille excel
    Par beegees dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 01/02/2006, 10h48

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