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 :

VBA: Cocher automatiquement checkbox en fonction de chiffre


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 21
    Points : 6
    Points
    6
    Par défaut VBA: Cocher automatiquement checkbox en fonction de chiffre
    Bonjour, bonsoir,

    J'aimerais savoir si c'est possible, selon le numéro de la colonne (décidé par l'utilisateur), cocher ou décocher (automatiquement) les checkbox en fonction des numéros (de 1 à 4) dans la colonne selon la légende dans le document.

    Pour activer les checkbox manuellement avec ce code ça va :
    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
     
       'Dim o As Integer
       'For o = 1 To 10
       If Target.Value = 1 Then
       Sheets("Feuil2").OLEObjects("CheckBox" & o).Enabled = True
       Sheets("Feuil2").OLEObjects("CheckBox" & o).Object.Value = False
       ElseIf Target.Value = 2 Then
       Sheets("Feuil2").OLEObjects("CheckBox" & o).Enabled = True
       Sheets("Feuil2").OLEObjects("CheckBox" & o).Object.Value = True
       ElseIf Target.Value = 3 Then
       Sheets("Feuil2").OLEObjects("CheckBox" & o).Enabled = False
       Sheets("Feuil2").OLEObjects("CheckBox" & o).Object.Value = False
       ElseIf Target.Value = 4 Then
       Sheets("Feuil2").OLEObjects("CheckBox" & o).Enabled = False
       Sheets("Feuil2").OLEObjects("CheckBox" & o).Object.Value = True
       End If
    Mais c'est pour faire en sorte de qu'ils s'activent/désactivent automatiquement dans une sorte de boucle.

    En d'autre mots, est-il possible de faire coché/décoché des checkbox automatiquement en fonction de chiffre?

    dsl si je ne suis pas très clair, mais j'ai mis un exemple dans ce fichier...

    Merci...
    Fichiers attachés Fichiers attachés

  2. #2
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Bonjour,

    je n'ouvre jamais de fichier xls joint...

    Je vais donc me contenter du code montré, sans préjudice du reste (pointeur vers tes objets, que j'aurais plutôt vu avec la collection Shapes ...)

    ce que tu as écrit (toutes tes conditions) se résume à ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if target.value < 5 then
      Sheets("Feuil2").OLEObjects("CheckBox" & o).Enabled =  CBool(target.value And 1)
       Sheets("Feuil2").OLEObjects("CheckBox" & o).Object.Value =  Not CBool(target.value And 1)
    end if

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 21
    Points : 6
    Points
    6
    Par défaut
    Merci pour cette optimisation!

    Aurait-tu un moyen de les faire fonctionner en boucle...?

    J'ai 10 checkbox a cocher/décocher en fonction d'une colonne de 10 chiffres comment faire?

    J'ai essayer avec une boucle For dans Private Sub Worksheet_Change(ByVal Target As Range) mais cela change tout les checkbox pour la valeur dans le target.value

    Y'aurait-il un autre moyen?

    Merci...

  4. #4
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    Salut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim o As Integer
    'Select Case Target.Address
    For o = 1 To 10     ' à adapter
        Sheets("Feuil1").OLEObjects("CheckBox" & o + 4).Object.Value = (Target.Value = 2 Or Target.Value = 4)
        Sheets("Feuil1").OLEObjects("CheckBox" & o + 4).Object.Enabled = (Target.Value = 1 Or Target.Value = 2)
    Next o
    Il faudrait aussi tester avant que Target soit bien la case C2.

    A++
    Qwaz

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 21
    Points : 6
    Points
    6
    Par défaut
    Oui j'ai tester... ça fonctionne...

    En fait tout ce que j'essaye de faire est de mettre ce code dans une boucle, pour que je ne soit obliger de changer le code du "case" pour chaque checkbox à chaque fois :
    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
     
    Private Sub Worksheet_Change(ByVal Target As Range)
    Select Case Target.Address
            Case "$A$10"
                If Target.Value = 1 Then
                Sheets("Feuil1").CheckBox1.Enabled = True
                Sheets("Feuil1").CheckBox1.Value = False
                End If
                If Target.Value = 2 Then
                Sheets("Feuil1").CheckBox1.Enabled = True
                Sheets("Feuil1").CheckBox1.Value = True
                End If
                If Target.Value = 3 Then
                Sheets("Feuil1").CheckBox1.Enabled = False
                Sheets("Feuil1").CheckBox1.Value = False
                End If
                If Target.Value = 4 Then
                Sheets("Feuil1").CheckBox1.Enabled = False
                Sheets("Feuil1").CheckBox1.Value = True
                End If
            Case "$A$11"
                If Target.Value = 1 Then
                Sheets("Feuil1").CheckBox2.Enabled = True
                Sheets("Feuil1").CheckBox2.Value = False
                End If
                If Target.Value = 2 Then
                Sheets("Feuil1").CheckBox2.Enabled = True
                Sheets("Feuil1").CheckBox2.Value = True
                End If
                If Target.Value = 3 Then
                Sheets("Feuil1").CheckBox2.Enabled = False
                Sheets("Feuil1").CheckBox2.Value = False
                End If
                If Target.Value = 4 Then
                Sheets("Feuil1").CheckBox2.Enabled = False
                Sheets("Feuil1").CheckBox2.Value = True
                End If
            Case "$A$12"
                If Target.Value = 1 Then
                Sheets("Feuil1").CheckBox3.Enabled = True
                Sheets("Feuil1").CheckBox3.Value = False
                End If
                If Target.Value = 2 Then
                Sheets("Feuil1").CheckBox3.Enabled = True
                Sheets("Feuil1").CheckBox3.Value = True
                End If
                If Target.Value = 3 Then
                Sheets("Feuil1").CheckBox3.Enabled = False
                Sheets("Feuil1").CheckBox3.Value = False
                End If
                If Target.Value = 4 Then
                Sheets("Feuil1").CheckBox3.Enabled = False
                Sheets("Feuil1").CheckBox3.Value = True
                End If
            Case "$A$13"
                If Target.Value = 1 Then
                Sheets("Feuil1").CheckBox4.Enabled = True
                Sheets("Feuil1").CheckBox4.Value = False
                End If
                ...
                ...
                ...
        End Select
    End Sub
    J'ai essayer avec plusieurs sortes de boucles mais sans succès, quelqu'un aurait-il une idée?

    Merci!

  6. #6
    Membre expérimenté Avatar de laetitia
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 281
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 281
    Points : 1 512
    Points
    1 512
    Par défaut
    bonjour le fil le forum tu peus simplifier comme cela a condition que tu res pecte la chronologie je pars de a 10 a a 1000 pour les cellules & lesCheckBox que tu vas rajoutees je suis parti sur ton dernier exemple
    a10=CheckBox1
    a11=CheckBox2
    a12=CheckBox3
    ect...
    Option Explicit
    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
    Dim i As Byte, x As Byte, z As Byte, obj As OLEObject
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Application.Intersect(Target, Range("A10:A19")) Is Nothing Then
    z = ActiveCell.Row: If z = 10 Then x = Left(z, 1) Else x = Right(z, 1) + 1
     i = ActiveCell.Value
    For Each obj In ActiveSheet.OLEObjects
    If Right(obj.Name, 1) = x And i = 1 Then obj.Object.Value = False
    If Right(obj.Name, 1) = x And i = 2 Then obj.Object.Value = True
    If Right(obj.Name, 1) = x And i = 3 Then obj.Object.Value = False
    If Right(obj.Name, 1) = x And i = 4 Then obj.Object.Value = True
    If Right(obj.Name, 1) = x And i = 1 Then obj.Object.Enabled = True
    If Right(obj.Name, 1) = x And i = 2 Then obj.Object.Enabled = True
    If Right(obj.Name, 1) = x And i = 3 Then obj.Object.Enabled = False
    If Right(obj.Name, 1) = x And i = 4 Then obj.Object.Enabled = False
     Next obj: End If
    End Sub
    on peut encore simplifier en groupant les conditions mais pas le temps!!!!

    une version simplifie
    Option Explicit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim i As Byte, x As Byte, z As Byte, obj As OLEObject
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Application.Intersect(Target, Range("A10:A19")) Is Nothing Then
    z = ActiveCell.Row: x = Right(z, 1) + 1: i = ActiveCell.Value
    For Each obj In ActiveSheet.OLEObjects
    If Right(obj.Name, 1) = x And (i = 1 Or i = 3) Then obj.Object.Value = False
    If Right(obj.Name, 1) = x And (i = 2 Or i = 4) Then obj.Object.Value = True
    If Right(obj.Name, 1) = x And (i = 1 Or i = 2) Then obj.Object.Enabled = True
    If Right(obj.Name, 1) = x And (i = 3 Or i = 4) Then obj.Object.Enabled = False
    Next obj: End If
    End Sub

  7. #7
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    Salut
    a mon avis tu as un problème de logique dans ton code jp222.
    Il te faut bien comprendre a quoi servent les codes événementiels que tu utilises et les paramètres qui leur sont associés.
    Ainsi lorsque tu utilises
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheet_Change(ByVal Target As Range)
    Il faut bien comprendre que cette evenement va se declencher a chque fois que tu va modifier une des cellule de ton tableau.
    Donc il n'est pas utile de boucler sur toutes les cellule de ton tableau, puisque tu sais quelle cellule vient d'etre modifiée, cette cellule c'est Target.
    Il faut donc créer ton code autour de taget en lui trouvant sa case a cocher associée (si target correspond a a10 -> case a coché est la n°1)Tu n'as ainsi pas besoin d'aller verifier l'etat des autre cases, il ne change pas puisque le seul contenu qui est changé est cellui de Target
    Refais un code en tenant compte des ses informations stp.
    a++
    Qwaz

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 21
    Points : 6
    Points
    6
    Par défaut
    Avec quoi comme codes événementiels de début?

    Worksheet_SelectionChange(ByVal Target As Range) ???

    Merci laetitia

    Vu mes connaissance de débutant en vb pourrais tu m'expliquer quel sont les effets de ces manipulations pcq je ne comprends pas très bien ce bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If Not Application.Intersect(Target, Range("A10:A1000")) Is Nothing Then
    z = ActiveCell.Row: If z = 10 Then x = Left(z, 1) Else x = Right(z, 1) + 1
     i = ActiveCell.Value
    merci encore

  9. #9
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    Salut
    J'ai pas trop le temps le matin mais voila ce que je veux dire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Worksheet_Change(ByVal Target As Range)
      'Attention ici il faudrat verifier avec intersect que l'on se trouve bien a minima sur la ligne 10.
            Sheets("Feuil1").OLEObjects("CheckBox" & Target.row-9).Object.Value = (Target.Value = 2 Or Target.Value = 4)
            Sheets("Feuil1").OLEObjects("CheckBox" & Target.row-9).Object.Enabled = (Target.Value = 1 Or Target.Value = 2)
     
    End Sub
    Je concidere qu'on commence a la ligne 10 et que la case a cocher ligne10 est la n°1, ligne 11 case a cocher 2 ....

    Tu vois ici quand tu modifie une des cellules du tableau Worksheet_change est appelé et te donne Target qui represente la cellule qui vient d'etre modifié.
    A++
    Qwaz

  10. #10
    Membre expérimenté Avatar de laetitia
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 281
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 281
    Points : 1 512
    Points
    1 512
    Par défaut
    bonjour le fil bravo Qwaz ton code super il fallait penser a target row

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 21
    Points : 6
    Points
    6
    Par défaut
    Ouais super ça marche parfait!!!
    Merci Qwazerty!
    Effectivement avec Target.Row ca fonctionne impeccable!

    Une dernière chose si je vous dérange pas trop...
    J'ai plusieurs colonnes de chiffre avec lesquels les checkbox peuvent s'activer et je voudrais seulement qu'il y en ai une seule qui fonctionne à la fois.
    Mais je ne réussi pas avec cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
         
    If Sheets("Feuil2").Range("C6").Value = 1 Then 'numéro qui détermine la colonne à utiliser
       Sheets("Feuil2").Range("A10:A20").Select 'section de la colonne à activer ou sélectionner .!?
            Sheets("Feuil1").OLEObjects("CheckBox" & Target.Row - 9).Object.Value = (Target.Value = 2 Or Target.Value = 4)
            Sheets("Feuil1").OLEObjects("CheckBox" & Target.Row - 9).Object.Enabled = (Target.Value = 1 Or Target.Value = 2)
    End If
    If Sheets("Feuil2").Range("C6").Value = 2 Then
       Sheets("Feuil2").Range("B10:B20").Select
       ... etc
    Auriez-vous une autre méthode?
    Merci encore!

  12. #12
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    Salut
    Est je compris ce que tu cherches a faire si je te dis
    tu as plusieur rangé de checkbox (une par colonne) ? et en fonction d'une valeur (en C6) tu veux interagir avec l'un ou l'autre des checkbox contenus dans cette colonne precisé par C6?

    Si c'est ce que tu veux faire il va faloir donner un nom diferent a tes checkbox par colonne.
    Ensuite dans la macro a la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "checkbox" & Target.row
    il faudra modifier une variable ou tu stockeras le nom du checkbox (en fonction de la valeur de C6)Par exemple
    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
    Dim NomCheck As string
    Select case [C6]
      case 1
        NomCheck = "CheckBoxA" 'il faudra re,omer tous les checkbox contenue dans la colonne A checkboxA1,checkboxA2,3,4,....
      case 2
        Nomcheck = "CheckBoxB" 'pareil pour les nom des checkbox colonne B
    '...
    End Select
    'puis
    Worksheet_Change(ByVal Target As Range)
      'Attention ici il faudrat verifier avec intersect que l'on se trouve bien a minima sur la ligne 10.
            Sheets("Feuil1").OLEObjects(NomCheck & Target.row-9).Object.Value = (Target.Value = 2 Or Target.Value = 4)
            Sheets("Feuil1").OLEObjects(NomCheck & Target.row-9).Object.Enabled = (Target.Value = 1 Or Target.Value = 2)
     
    End Sub
    Mais bon ca risque d'etre lourd a mettre en place, peut etre qu'avec une implatation des checkbox en dynamique.
    Ou peut etre encore que l'amie Laetitia va nous sortir un petit Module de Class qui va bien
    A++
    Qwaz

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 21
    Points : 6
    Points
    6
    Par défaut
    A peu près cela, mais en fait j'ai disons 3 colonnes de chiffres pour 1 colonne de checkbox.
    Et c'est selon le numéro de la colonne (déterminé par l'utilisateur) que ça va modifier automatiquement les checkbox en fonction de la colonne qui sera déterminée par ce numéro. (L'utilisateur n'aura pas a modifier les numéros dans les colonnes)

    Donc la boucle ne devrait-elle pas être à l'intérieur de chaque checkbox ou dans la cellule du numéro de la colonne? , car c'est ça l'événement déclencheur!


  14. #14
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    Salut
    Ha ok, ben laetitia t'as donné une solution pour cela plus haut en utilisant Intersect, car non seulllement du dois verifier la colonne mais aussi la ligne, car si tu venais a modifier une cellule d'une ligne n'ayant pas de checkbox ca va planter.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    If Intersect(Range(Cells(10, [C6].Value), Cells(20, [C6].Value)), Target) Then
            Sheets("Feuil1").OLEObjects(NomCheck & Target.row-9).Object.Value = (Target.Value = 2 Or Target.Value = 4)
            Sheets("Feuil1").OLEObjects(NomCheck & Target.row-9).Object.Enabled = (Target.Value = 1 Or Target.Value = 2) 
    End if
    Je n'est pas le temps de tester mais ce doit etre ca, tu fera en sorte de remplacer 10 et 20 par les numero de ta 1er et derniere ligne (c faisable automatiquement essai de trouver, au moins pour la derniere ligne, on peut supposer que me 1er sera toujours la meme)
    Le but du If est de tester si Target fais parti de la colonne indiqué par C6 et des ligne comprise de 10 a 20.
    A++
    Qwaz

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 21
    Points : 6
    Points
    6
    Par défaut
    Oui, mais cela ne vas pas faire en sorte de modifier automatiquement les checkbox au changement du numéro de colonne.

    Dans mon projet, les chiffres dans les colonnes, une fois final, ne changeront plus, c'est seulement le numéro de la colonne qui changera et c'est sur cette valeur qu'il faudrait se baser pour appliquer le changement vous comprenez?

    Voici un genre de pseudo code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Si il y a un changement du # de la colonne (soit 1,2 ou 3) Alors
    Pour chaque Checkbox dans la feuille 1 
    Aller regarder la valeur correspondante au # de la colonne et 
    appliquer les chiffres automatiquement aux checkboxs qui sont dans 
    ce # de colonne
    Fin

  16. #16
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    Salut
    Ha ben dans ce cas la faut que tu travailles sur le onchange de la cellule C6, donc toujours dans ThisWorkBook_Open, il te faut rajouter un If intersect... en 1er, qui teste si Target est bien la case C6.
    Puis ensuite dans cette "boucle" IF tu boucles sur toutes les case de la colonne pointée par C6 et tu changes les valeurs des checkbox en conséquence.
    Aller j'ai pas le temps le matin donc essais de coder ça dans la journée, avec les onformations qui t'on etait donné avant tu dois pouvoir le faire, n'oublies pas l'aide excel, les tutoriel et les recherches sur dev.com .
    A++
    Qwaz

  17. #17
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 21
    Points : 6
    Points
    6
    Par défaut
    du genre quelque chose comme ca ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Dim obj As OLEObject
    If Range("C6").Value = 1 Then
        If Not Intersect(Target, Range("A10:A19")) Is Nothing Then
        For Each obj In Sheets("Feuil1").OLEObjects
        Sheets("Feuil1").OLEObjects("CheckBox" & Target.Row - 9).Object.Value = (Target.Value = 2 Or Target.Value = 4)
        Sheets("Feuil1").OLEObjects("CheckBox" & Target.Row - 9).Object.Enabled = (Target.Value = 1 Or Target.Value = 2)
    Next obj
        End If
    End If
    If Range("C6").Value = 2 Then
        If Not Intersect(Target, Range("B10:B19")) Is Nothing Then
        ...

  18. #18
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    Salut
    Non, tu dois faire quelque chose comme ca
    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
    'Dans le OnChange
    Dim Thecell As Range
     
    If Intersect(Target,[C6]) Then
       'On change tout les check box en fonction de la nouvelle colonne a prendre en compte
       'Je concidere que le tableau commence ligne 10
       For each TheCell In Range(Cells(10,[C6].Vaue),cells(rows.Count,[C6].Value)
           'On met a jour le checkbox suivant la mm logic
           OLEObjects(NomCheck & TheCell.row-9).Object.Value = (TheCell.Value = 2 Or TheCell.Value = 4)
           OLEObjects(NomCheck & TheCell.row-9).Object.Enabled = (TheCell.Value = 1 Or TheCell.Value = 2) 
       Next
     
    ElseIf Intersect(Range(Cells(10, [C6].Value), Cells(20, [C6].Value)), Target) Then
       OLEObjects(NomCheck & Target.row-9).Object.Value = (Target.Value = 2 Or Target.Value = 4)
       OLEObjects(NomCheck & Target.row-9).Object.Enabled = (Target.Value = 1 Or Target.Value = 2) 
    End if
    A vérifier, je n'ai pas excel, mais ça ne doit pas être loin de ce que tu cherches a faire.
    J'ai viré les Sheets("Feuil1") danvant les OLEObject, a verifier si ca marche, mais si ca ne marque pas il faudra utiliser Target.Sheet (un truc comme ca) pour que ton code puisse etre porté sur une autre feuille sans avoir d'adaptation a faire.
    A++
    Qwaz

  19. #19
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 21
    Points : 6
    Points
    6
    Par défaut
    Merci pour ce bout de code! On y est presque!!!

    Voila, j'ai mis ton code que j'ai modifier légèrement
    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 Worksheet_Change(ByVal Target As Range)
    'Dans le OnChange
    Dim Thecell As Range
     
    If Intersect(Target, [C6]) Then
       'On change tout les check box en fonction de la nouvelle colonne a prendre en compte
       'Je concidere que le tableau commence ligne 10
       For Each Thecell In Range(Cells(10, [C6].Value), Cells(Rows.Count, [C6].Value))
           'On met a jour le checkbox suivant la mm logic
           Sheets("Feuil1").OLEObjects("Checkbox" & Thecell.Row - 9).Object.Value = (Thecell.Value = 2 Or Thecell.Value = 4)
           Sheets("Feuil1").OLEObjects("Checkbox" & Thecell.Row - 9).Object.Enabled = (Thecell.Value = 1 Or Thecell.Value = 2)
       Next
     
    ElseIf Intersect(Range(Cells(10, [C6].Value), Cells(20, [C6].Value)), Target) Then
       OLEObjects("Checkbox" & Target.Row - 9).Object.Value = (Target.Value = 2 Or Target.Value = 4)
       OLEObjects("Checkbox" & Target.Row - 9).Object.Enabled = (Target.Value = 1 Or Target.Value = 2)
    End If
    End Sub
    Ca fonctionne, c'est a dire que ça modifie les valeurs dans les checkbox quand je change le numéro de la colonne, mais il y a une erreur quand je fais ce changement...

    Impossible de lire la propriété OLEObjects de la classe Worksheet

    et ça surligne en jaune la ligne que j'ai mis en gras dans le code.

    C'est peut être à cause de l'événement Worksheet_Change?

  20. #20
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 21
    Points : 6
    Points
    6
    Par défaut
    Voilà!

    Ce n'était qu'une question du "Rows.Count" ça me donnais des numéro de ligne quasiment jusqu'à l'infinie alors que les cellules qui comprenait une valeur arrêtait à 19 (selon mon tableau)

    Alors j'ai simplement mis la valeur fixe à la place et tout marche très bien!

    Voici le résultat:

    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 Worksheet_Change(ByVal Target As Range)
     
    'Dans le OnChange
    Dim Thecell As Range
     
    If Intersect(Target, [C6]) Then
       'On change tout les checkbox en fonction de la nouvelle colonne a prendre en compte (C6 étant le numéro de la colonne)
       'Je considère que le tableau commence ligne 10
       For Each Thecell In Range(Cells(10, [C6].Value), Cells(19, [C6].Value)) 'Tableau entre la ligne 10 et 19
           'On met à jour le checkbox suivant la même logique
           Sheets("Feuil1").OLEObjects("Checkbox" & Thecell.Row - 9).Object.Value = (Thecell.Value = 2 Or Thecell.Value = 4)
           Sheets("Feuil1").OLEObjects("Checkbox" & Thecell.Row - 9).Object.Enabled = (Thecell.Value = 1 Or Thecell.Value = 2)
       Next
    End If
    End Sub
    Merci beaucoup Qwaz et laetitia pour leurs excellentes réponses qui m'ont permis d'avancer mon projet à grand pas et d'en apprendre d'avantage!

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

Discussions similaires

  1. Réponses: 17
    Dernier message: 24/06/2008, 10h16
  2. fonction where dans VBA et recupération de lettre et de chiffre
    Par moimemessssssssss dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 13/04/2008, 21h55
  3. Réponses: 2
    Dernier message: 14/09/2006, 14h24
  4. cocher une checkbox en fonction de son nom
    Par boss_gama dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 08/09/2006, 16h42
  5. [débutante] Cocher automatiquement d checkbox
    Par baillador dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 30/05/2006, 12h16

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