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 :

Lancement d'une fonction sur la cellule liée d'une case à cocher


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2017
    Messages : 11
    Points : 2
    Points
    2
    Par défaut Lancement d'une fonction sur la cellule liée d'une case à cocher
    Bonjour à tous ! Je suis nouveau sur le forum et je me lance dans vba sur le développement d'une application pour mon stage.

    L'appli fait plein de trucs et est assez complexe, mais l'objet ici, c'est les checkbox:

    J'aimerais que lorsque je clique sur une checkbox, que j'ai créée à l'aide d'une boucle qui active la macro qui suit...

    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
     Sub Inserer_Cases_A_Cocher_Liees(Zoneboutons As Range) 'Sub modifiée récupérée sur https://www.commentcamarche.net/faq/41456-excel-creation-automatique-de-cases-a-cocher-liees-aux-cellules-en-dessous
    Dim rngCel As Range
    Dim ChkBx As CheckBox
     
    For Each rngCel In Zoneboutons
      With rngCel.MergeArea.Cells
        If .Resize(1, 1).Address = rngCel.Address Then
        'Pour ne pas afficher la valeur de la cellule liée, enlevez l'apostrophe en début de ligne suivante :
          .NumberFormat = ";;;"
          Set ChkBx = ActiveSheet.CheckBoxes.Add(.Left, .Top, .Width, .Height)
          With ChkBx
            'valeur par défaut :
            .Value = xlOff 'pourrait être True ou False
            'cellule liée
            .LinkedCell = rngCel.MergeArea.Cells.Address
            'Texte de remplacement
            .Characters.Text = "Exclure"
            'texte
            '.Text = "Toto" ' ou : .Caption = "Toto"
            'bordure :
            With .Border
              'Style de ligne
              '.LineStyle = xlLineStyleNone 'ou xlContinuous 'ou xlDashDot ou xlDashDotDot ou xlDot
              'couleur
              '.ColorIndex = 3  '3 = rouge
              'épaisseur du trait
              '.Weight = 4
            End With
            'accessibles aussi les propriétés .Locked, .Name, .Enabled etc...
          End With
        End If
      End With
    Next rngCel
     
    End Sub
    ... le code affecte cette fonction au bouton, qui s'active à chaque fois que le bouton est cliqué avec le linkedcell comme argument :

    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
    Sub CocherPourExclureLesValeurs(Location As Range)
     
    Worksheets("Template paramétrique").Location.Activate
    If ActiveCell.Value = True Then
        ActiveCell.Offset(0, -2).Cut
        ActiveCell.Offset(0, 1).PasteSpecial (xlPasteValues)
        ActiveCell.Offset(0, -1).Cut
        ActiveCell.Offset(0, 2).PasteSpecial (xlPasteValues)
    ElseIf ActiveCell.Value = False Then
        ActiveCell.Offset(0, 1).Cut
        ActiveCell.Offset(0, -2).PasteSpecial (xlPasteValues)
        ActiveCell.Offset(0, 2).Cut
        ActiveCell.Offset(0, -1).PasteSpecial (xlPasteValues)
    End If
     
    End Sub
    Pour plus de clareté : les checkboxes sont situés au bout de chaque ligne des données utilisées pour afficher un nuage de points abscisse et ordonnée). Cocher le case sur une ligne doit avoir pour effet de sortir les données de la zone prise en compte pour l'affichage. La décocher fait le chemin inverse.

    Le truc c'est que je ne suis meme pas sûr que ce soit possible ; il ne me semble qu'on ne peut affecter à des cases à cocher que des procédures qui n'ont pas d'arguments, mais peut etre que je me trompe ou bien qu'il y a une manière détournée d'aborder le problème ?

    J'espère que c'est clair, et je suis désolé de ne pas pouvoir fournir de fichier, c'est juste qu'il y a des dizaines de macros, qui sont un peu appelées toutes les unes par les autres, donc ça reviendrait à vous faire reprendre tout le projet
    Merci d'avance pour votre aide !

  2. #2
    Membre expérimenté
    Inscrit en
    septembre 2007
    Messages
    1 029
    Détails du profil
    Informations forums :
    Inscription : septembre 2007
    Messages : 1 029
    Points : 1 633
    Points
    1 633
    Par défaut
    Bonjour,

    Lorsque tu crées tes checbox il te faut les associer à un module de classe dans lequel tu mets ta macro dans l'événement chk_Click()

    Par exeemple :
    début procédure création
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim Tbc() As New group  ' instances de classe saisie
        ReDim Tbc(1 To 1)
    après création associer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                Set Tbo(UBound(Tbc)).chk = ChkBx
                ReDim Preserve Tbc(1 To UBound(Tbo) + 1)
    dans le module de classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Public WithEvents chk As MSForms.CheckBox
    Private Sub chk_Click()
    Puis tu affectes ta cellule en fonction de la position CheckBox concernée

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2017
    Messages : 11
    Points : 2
    Points
    2
    Par défaut
    Merci anasecu pour ta réponse,
    Malheureusement je n'ai encore jamais travaillé avec les modules de classe C'est l'occasion d'apprendre mais du coup il va me falloir un peu plus de détails pour comprendre ce que font tes instructions, et ce que je dois ajouter/modifier dans mon code.

    De ce que j'ai compris Tbc() est une sorte de nouvel objet que je dois définir en dessous de mon "dim ChkBx as CheckBox" et qui est une modif de ce dernier (?).
    Je ne saisis pas bien à quoi correspond Tbo ni Redim Preserve. Je sais que c'est pas bien de faire du commentaire détaillé dans un code surtout quand le programme est long, mais est ce que tu pourrais le faire sur celuici a des fins pédagogiques ?

    Merci de ton aide

  4. #4
    Membre expérimenté
    Inscrit en
    septembre 2007
    Messages
    1 029
    Détails du profil
    Informations forums :
    Inscription : septembre 2007
    Messages : 1 029
    Points : 1 633
    Points
    1 633
    Par défaut
    re

    Tbc() est une sorte de nouvel objet que je dois définir en dessous de mon "dim ChkBx as CheckBox"
    C'est tout à fait cela c'est un tableau de tes checkboxs

    Tbo erreur de frappe c'est tbc

    Redim Preserve. tu peux le mettre après Set ChkBx
    ces 2 lignes servent à empiler tes checkbox dans la table utilisée par le module de classe
    set tu introduis ta nouvelle checkbox
    Redim tu agrandis le tableau pour le prochain

    Ton module de classe je le verrais ainsi mais je n'ai pas les moyens de tester sauf à recréer ton classeur :
    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
    Public WithEvents chk As MSForms.CheckBox
    Private Sub chk_Click()
    Dim adr As String   ' adresse cellule de CheckBox traitée
    Dim cel As Range    ' cellule traitée
        With Worksheets("Template paramétrique")
            adr = chk.TopLeftCell.Address
            Set cel = .Range(adr)
            If cel.Value = True Then
                cel.Offset(0, -2).Cut
                cel.Offset(0, 1).PasteSpecial (xlPasteValues)
                cel.Offset(0, -1).Cut
                cel.Offset(0, 2).PasteSpecial (xlPasteValues)
            ElseIf cel.Value = False Then
                cel.Offset(0, 1).Cut
                cel.Offset(0, -2).PasteSpecial (xlPasteValues)
                cel.Offset(0, 2).Cut
                cel.Offset(0, -1).PasteSpecial (xlPasteValues)
            End If
        End With
    End Sub
    Je sais que c'est pas bien de faire du commentaire détaillé
    je trouve que c'est très bien au contraire car le coût de leur présence est minime à côté de l'intérêt apporté.
    comme tu m'avais l'air assez à l'aise je les ai omis.

    Bon tests

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2017
    Messages : 11
    Points : 2
    Points
    2
    Par défaut
    OK!

    Merci de ta réponse.
    J'ai donc ajusté mon code comme suit :
    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
    Sub Inserer_Cases_A_Cocher_Liees(Zoneboutons As Range) 'Sub modifiée récupérée sur https://www.commentcamarche.net/faq/41456-excel-creation-automatique-de-cases-a-cocher-liees-aux-cellules-en-dessous
    Dim rngCel As Range
    Dim ChkBx As CheckBox
    Dim Tbc() As New cChkBx  ' instances de classe saisie
    ReDim Tbc(1 To 1)
     
    For Each rngCel In Zoneboutons
      With rngCel.MergeArea.Cells
        If .Resize(1, 1).Address = rngCel.Address Then
        'Pour ne pas afficher la valeur de la cellule liée, enlevez l'apostrophe en début de ligne suivante :
          .NumberFormat = ";;;"
          Set ChkBx = ActiveSheet.CheckBoxes.Add(.Left, .Top, .Width, .Height)
          Set Tbc(UBound(Tbc)).chk = ChkBx
          ReDim Preserve Tbc(1 To UBound(Tbo) + 1)
          With ChkBx
            'valeur par défaut :
            .Value = xlOff 'pourrait être True ou False
            'cellule liée
            .LinkedCell = rngCel.MergeArea.Cells.Address
            'Texte de remplacement
            .Characters.Text = "Exclure"
            'texte
            '.Text = "Toto" ' ou : .Caption = "Toto"
            'bordure :
            With .Border
              'Style de ligne
              '.LineStyle = xlLineStyleNone 'ou xlContinuous 'ou xlDashDot ou xlDashDotDot ou xlDot
              'couleur
              '.ColorIndex = 3  '3 = rouge
              'épaisseur du trait
              '.Weight = 4
            End With
            'accessibles aussi les propriétés .Locked, .Name, .Enabled etc...
          End With
        End If
      End With
    Next rngCel
     
    End Sub
    Je suis allé me documenter sur le sujet et j'ai créé le module de classe cChkBx dans lequel j'ai inséré 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
    Public WithEvents chk As MSForms.CheckBox
     
    Private Sub chk_Click()
    Dim adr As String   ' adresse cellule de CheckBox traitée
    Dim cel As Range    ' cellule traitée
        With Worksheets("Template paramétrique")
            adr = chk.TopLeftCell.Address
            Set cel = .Range(adr)
            If cel.Value = True Then
                cel.Offset(0, -2).Cut
                cel.Offset(0, 1).PasteSpecial (xlPasteValues)
                cel.Offset(0, -1).Cut
                cel.Offset(0, 2).PasteSpecial (xlPasteValues)
            ElseIf cel.Value = False Then
                cel.Offset(0, 1).Cut
                cel.Offset(0, -2).PasteSpecial (xlPasteValues)
                cel.Offset(0, 2).Cut
                cel.Offset(0, -1).PasteSpecial (xlPasteValues)
            End If
        End With
    End Sub
    J'ai une erreur "Type défini par l'utilisateur non défini" sur WithEvents chk As MSForms.CheckBox

    Qu'ai-je mal compris ? La traduction bancale de l'explication de l'erreur sur http://docs.microsoft.com/fr-fr/offi...pe-not-defined ne m'a pas vraiment apporté d'aide

  6. #6
    Membre expérimenté
    Inscrit en
    septembre 2007
    Messages
    1 029
    Détails du profil
    Informations forums :
    Inscription : septembre 2007
    Messages : 1 029
    Points : 1 633
    Points
    1 633
    Par défaut
    Bonsoir Baudouin dsr,

    J'avais encore laissé une faute de frappe : utiliser le copier / coller c'est mieux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
          ReDim Preserve Tbc(1 To UBound(Tbc) + 1)

    J'ai une erreur "Type défini par l'utilisateur non défini" sur WithEvents chk As MSForms.CheckBox
    Cette ligne doit être en tête de module avant les sub comme celle que tu as dans le module de classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim Tbc() As New cChkBx  ' instances de classe saisie
    En étant insérée dans la sub elle n'est connue que de la sub : c'est vrai que l'erreur est loin d'être limpide.

    Qu'ai-je mal compris ?
    Tu as tout compris mais je ne t'avais pas suffisamment précisé la syntaxe.

    Bon courage à toi

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2017
    Messages : 11
    Points : 2
    Points
    2
    Par défaut
    J'avais saisi que si le Dim Tbc() machin était dans un sub il n'était lu que si le sub était lu, mais puisque le sub était la boucle qui créait les checkboxes je croyais que c'était bon.

    J'ai modifié la faute de frappe que j'avais laissée passer (oups) et déplacé le Dim Tbc() As New cChkBx juste en dessous de mon option explicit sur le Module principal.
    Mais j'ai toujours la même erreur que je ne comprends pas au même endroit

    Merci de votre aide

  8. #8
    Membre expérimenté
    Inscrit en
    septembre 2007
    Messages
    1 029
    Détails du profil
    Informations forums :
    Inscription : septembre 2007
    Messages : 1 029
    Points : 1 633
    Points
    1 633
    Par défaut
    Avec option explicit normalement la faute de frappe aurait dû être signalée.


    j'ai toujours la même erreur que je ne comprends pas au même endroit
    Quant cette erreur se produit elle : lors du clic sur une checkbox ?

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2017
    Messages : 11
    Points : 2
    Points
    2
    Par défaut
    C'est vrai qu'il aurait du me le signaler ...

    L'erreur se produit au moment de créer les checkboxes (donc au moment où le code appelle la sub "insererlescasesacocherliees". Les cases ne sont pas encore créées quand le code s'arrête
    D'ailleurs l'appel du sub qui crée les checkboxes se fait dans la fin de celui qui insère les données dans ma feuille "template paramétrique" et crée le nuage de points, et ces données ne sont pas saisies. J'en déduis que l'erreur se fait avant même l'execution du code ligne à ligne dans une sorte de prévérification (?). Ca fait sens ?

  10. #10
    Membre expérimenté
    Inscrit en
    septembre 2007
    Messages
    1 029
    Détails du profil
    Informations forums :
    Inscription : septembre 2007
    Messages : 1 029
    Points : 1 633
    Points
    1 633
    Par défaut
    L'erreur se produit au moment de créer les checkboxes
    Je suppose que ton code est dans un ou des modules
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim Tbc() As New cChkBx
    Doit être en tête de module avant les sub et tu peux essayer de le remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Tbc() As New cChkBx
    afin de voir s'il est pris en compte

  11. #11
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2017
    Messages : 11
    Points : 2
    Points
    2
    Par défaut
    C'est bien ce que j'ai fait (j'avais essayé de le passer en public hier ça n'avait pas marché)

    Voilà le contenu de l'en-tête de mon module 1 (l'unique module "classique") avant toutes les sub (+ la fonction d'appel des variables de position dans mon fichier excel):

    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
    Option Explicit
     
    Public Tbc() As New cChkBx 'instances de classe saisie
     
    Public BDD_Lig_En_Tetes As Integer
    Public BDD_Col_Ss_Lot As String
    Public BDD_Col_Nom_PdC As String
    Public BDD_Col_IDG_PdC As String
    Public Compat_Col_Ss_Lot As String
    Public Compat_Lig_Questions As Integer
    Public Compat_Lig_Type_Data As Integer
    Public Template_Cel_Prix As String
    Public Template_Cel_Nom As String
    Public Template_Col_Metriques As String
    Public Template_Col_Valeurs As String
    Public Template_Plage_Img As String
    Public Template_Plage_Etiquette As String
    Public Int_Param_Col_Questions As String
    Public Int_Param_Col_Saisies As String
    Public BDD_J_Lig_Art_Voulu As Integer
    Public BDD_J_Lig_En_Tetes As Integer
    Public Template_Param_Cel_Metrique As String
    Public Template_Param_Plage_Data As String
    Public Template_Param_Col_X As String
    Public Template_Param_Col_Y As String
    Public Template_Param_Plage_Etiquette As String
     
     
    Function Get_Param(Nom_Param As String)   'Renvoie la première valeur trouvée du paramètre recherché via la fauille "Paramètres"
     
    Get_Param = ""
    Get_Param = Application.VLookup(Nom_Param, Worksheets("Paramètres").Range("A:B"), 2, False)
     
    End Function
     
    Sub Dim_Variables_Parametres() 'Permet de définir les variables publiques principales de positionnement (à appeler à chaque début de sub)
     
    BDD_Lig_En_Tetes = Get_Param("BDD_Lig_En_Tetes")
    BDD_Col_Ss_Lot = Get_Param("BDD_Col_Ss_Lot")
    BDD_Col_Nom_PdC = Get_Param("BDD_Col_Nom_PdC")
    BDD_Col_IDG_PdC = Get_Param("BDD_Col_IDG_PdC")
    Compat_Col_Ss_Lot = Get_Param("Compat_Col_Ss_Lot")
    Compat_Lig_Questions = Get_Param("Compat_Lig_Questions")
    Compat_Lig_Type_Data = Get_Param("Compat_Lig_Type_Data")
    Template_Cel_Prix = Get_Param("Template_Cel_Prix")
    Template_Cel_Nom = Get_Param("Template_Cel_Nom")
    Template_Col_Metriques = Get_Param("Template_Col_Metriques")
    Template_Col_Valeurs = Get_Param("Template_Col_Valeurs")
    Template_Plage_Img = Get_Param("Template_Plage_Img")
    Template_Plage_Etiquette = Get_Param("Template_Plage_Etiquette")
    Int_Param_Col_Questions = Get_Param("Int_Param_Col_Questions")
    Int_Param_Col_Saisies = Get_Param("Int_Param_Col_Saisies")
    BDD_J_Lig_Art_Voulu = Get_Param("BDD_j_Lig_Art_Voulu")
    BDD_J_Lig_En_Tetes = Get_Param("BDD_J_Lig_En_Tetes")
    Template_Param_Cel_Metrique = Get_Param("Template_Param_Cel_Metrique")
    Template_Param_Plage_Data = Get_Param("Template_Param_Plage_Data")
    Template_Param_Col_X = Get_Param("Template_Param_Col_X")
    Template_Param_Col_Y = Get_Param("Template_Param_Col_Y")
    Template_Param_Plage_Etiquette = Get_Param("Template_Param_Plage_Etiquette")
     
    End Sub
    Et voilà le contenu de mon unique module de classe "cChkbx" :

    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
    Public WithEvents chk As MSForms.CheckBox
     ' l'erreur surligne en bleu cette partie
    Private Sub chk_Click()
    Dim adr As String   ' adresse cellule de CheckBox traitée
    Dim cel As Range    ' cellule traitée
        With Worksheets("Template paramétrique")
            adr = chk.TopLeftCell.Address
            Set cel = .Range(adr)
            If cel.Value = True Then
                cel.Offset(0, -2).Cut
                cel.Offset(0, 1).PasteSpecial (xlPasteValues)
                cel.Offset(0, -1).Cut
                cel.Offset(0, 2).PasteSpecial (xlPasteValues)
            ElseIf cel.Value = False Then
                cel.Offset(0, 1).Cut
                cel.Offset(0, -2).PasteSpecial (xlPasteValues)
                cel.Offset(0, 2).Cut
                cel.Offset(0, -1).PasteSpecial (xlPasteValues)
            End If
        End With
    End Sub

  12. #12
    Membre expérimenté
    Inscrit en
    septembre 2007
    Messages
    1 029
    Détails du profil
    Informations forums :
    Inscription : septembre 2007
    Messages : 1 029
    Points : 1 633
    Points
    1 633
    Par défaut
    Bonsoir,

    Tout ce que tu as fait est correct.
    J’utilise cela qui fonctionne parfaitement mais je le fait avec des checkbox sur un formulaire.

    Toi tu as tes objets sur la feuille et j'ai pensé que cela fonctionnait de même mais il y a peut-être un hic : je regardes.

  13. #13
    Membre expérimenté
    Inscrit en
    septembre 2007
    Messages
    1 029
    Détails du profil
    Informations forums :
    Inscription : septembre 2007
    Messages : 1 029
    Points : 1 633
    Points
    1 633
    Par défaut
    Bonsoir,

    Bon cela me soulage cela fonctionne car j'ai fait un petit classeur avec le code concerné que je te joins

    Je récupère les checkbox de la feuille et j'ai dû rajouter .object mais dans ton classeur i'object est dans le set.

    Donc je vois encore plus mal ton erreur.
    Fichiers attachés Fichiers attachés

  14. #14
    Membre expérimenté
    Inscrit en
    septembre 2007
    Messages
    1 029
    Détails du profil
    Informations forums :
    Inscription : septembre 2007
    Messages : 1 029
    Points : 1 633
    Points
    1 633
    Par défaut
    Bonsoir,

    J'ai enfin compris ton souci : tu ne créais pas des checkbox mais des cases à cocher qui ne fonctionnent pas en classe.

    je t'ai mis les 2 modules dans le nouveau classeur en scindant création et initialisation de la classe.
    Comme les cut/copy ne fonctionnaient pas chez moi j'ai adapté en les laissant en commentaire.

    à toi de voir si cela correspond à ton désir.
    Fichiers attachés Fichiers attachés

  15. #15
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2017
    Messages : 11
    Points : 2
    Points
    2
    Par défaut
    Bonjour Anasecu, et merci beaucoup du temps que tu as passé là dessus.

    J'ai retiré les cut / paste du mode commentaire pour faire des essais mais quand je clique sur une checkbox cela n'a aucun effet.
    J'ai 2 soucis sur ton fichier en fait :
    - pour réussir à cocher une checkbox je dois double cliquer dessus, puis cliquer sur une autre (c'est uniquement à ce moment là que le cochage apparaît, je m'en suis rendu compte après de longues minutes à croire que le fonctionnement était aléatoire)
    - une fois que la checkbox est cochée (ou décochée), les données ne bougent pas

    J'ai vu que tu avais passé les checkboxes en oleobject (en tout cas c'est le type que tu utilises pour ton test d'intersection au début de la macro de création des cases à cocher), est-ce la raison pour laquelle une fois créés je ne peux plus du tout les modifier, même avec un clic droit ?

  16. #16
    Membre expérimenté
    Inscrit en
    septembre 2007
    Messages
    1 029
    Détails du profil
    Informations forums :
    Inscription : septembre 2007
    Messages : 1 029
    Points : 1 633
    Points
    1 633
    Par défaut
    Bonjour Baudouin dsr

    quand je clique sur une checkbox cela n'a aucun effet.
    Pour que le module classe fonctionne il faut que la macro ini_chk ait été exécutée.
    Je l'ai dissociée pour pouvoir activer s'en recréer les checkbox.

    - pour réussir à cocher une checkbox je dois double cliquer dessus
    un simple clic gauche change la coche de la case


    J'ai vu que tu avais passé les checkboxes en oleobject
    C'est simplement parce que tes cases à cocher ne fonctionnent pas en classe car technologie obsolète.

    est-ce la raison pour laquelle une fois créés je ne peux plus du tout les modifier
    Elles sont parfaitement modifiables et je ne comprend pas ton problème.

    Refait tes tests après exécution de ini_chk (F5 sur la macro dans l'éditeur).

  17. #17
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2017
    Messages : 11
    Points : 2
    Points
    2
    Par défaut
    OK Je pense avoir compris une partie de ce qui se passe :

    Déjà : CA MARCHE, merci BEAUCOUP (il suffisait en effet de faire l'initialisation ihi)

    Ensuite, je te mets des captures en PJ et je les commente :
    (Les points verts marquent la case de la cellule que je viens de cocher)

    Image1 : premier clic sur la checkbox de la ligne 1
    Rien ne se passe (je pense que l'objet est sélectionné mais que l'affichage ne se fait pas)
    Nom : Image1.PNG
Affichages : 27
Taille : 6,9 Ko

    Image2 : second clic sur la checkbox de la ligne 1
    chk_click est lancé correctement mais la case n'est pas encore cochée (je pense que l'objet est activé mais que l'affichage ne se fait toujours pas)
    Aparté du scénario : Dans cette config à chaque fois que je reclique en lig1 chk_click se redéroule et les données changent de côté comme prévu, mais sans modification de l'état de cochage
    Nom : Image2.PNG
Affichages : 27
Taille : 7,1 Ko

    Image3 : premier clic sur la checkbox de la ligne 2
    Rien ne se passe en lig2, mais le cochage de la ligne 1 se fait (C'est toujours en quittant une ligne ou on a fait fonctionner chk_click pour une autre que le cochage se fait)
    Nom : Image3.PNG
Affichages : 27
Taille : 7,1 Ko

    Image4 : Second click sur la checkbox de la ligne 2
    chk_click est lancé correctement mais la case n'est pas encore cochée
    Nom : Image4.PNG
Affichages : 27
Taille : 7,1 Ko


    Si je clique n'import où d'autre que sur la checkbox de la ligne 2 le cochage devient visible en ligne 2

    Tout ceci est bien étrange, on dirait que l'affichage a un clic de retard

    Aussi je m'explique :

    Elles sont parfaitement modifiables et je ne comprend pas ton problème.
    Je ne peux pas faire de clic droit dessus (pour les sélectionner sans lancer la coche) et ainsi les redimensionner ou les déplacer (je sais qu'il ne faut pas le faire étant donné le "intersect", mais c'est pour souligner le comportement inhabituel de l'objet) comme pour un bouton "classique" de lancement de macro. Après c'est pareil je n'ai jamais utilisé d'OLEobject donc c'est peut être normal (?).

  18. #18
    Membre expérimenté
    Inscrit en
    septembre 2007
    Messages
    1 029
    Détails du profil
    Informations forums :
    Inscription : septembre 2007
    Messages : 1 029
    Points : 1 633
    Points
    1 633
    Par défaut
    Tout ceci est bien étrange, on dirait que l'affichage a un clic de retard
    Tu as un souci avec ton système : quelle version même si cela fonctionne depuis 2007 ?
    Ce que tu décris est totalement incohérent : une coche ne se met pas en cliquant ailleurs.

    Je ne peux pas faire de clic droit dessus pour les sélectionner
    Cela me parait normal car les objets ne sont déplaçables et modifiables que si l'on est en mode création dans l'onglet développeur
    et il en est de même pour un bouton activex, seules les formes sont accessibles avec le clic droit sans mode création.

    Comme tu dis c'est tout à fait normal mais en mode création tu as la main si tu veux.

  19. #19
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2017
    Messages : 11
    Points : 2
    Points
    2
    Par défaut
    quelle version même si cela fonctionne depuis 2007 ?
    Lorsque j'ouvre un fichier excel il est écrit "Excel Office 2019"

    Ce que tu décris est totalement incohérent : une coche ne se met pas en cliquant ailleurs.
    Aie ça fait mal ça Pourtant c'est ce que j'observe, je l'ai décrit aussi fidèlement que possible dans mon dernier message

    Cela me parait normal car les objets ne sont déplaçables et modifiables que si l'on est en mode création dans l'onglet développeur
    et il en est de même pour un bouton activex, seules les formes sont accessibles avec le clic droit sans mode création.
    D'accord je comprends mieux merci

  20. #20
    Membre expérimenté
    Inscrit en
    septembre 2007
    Messages
    1 029
    Détails du profil
    Informations forums :
    Inscription : septembre 2007
    Messages : 1 029
    Points : 1 633
    Points
    1 633
    Par défaut
    Pourtant c'est ce que j'observe, je l'ai décrit aussi fidèlement que possible
    Je n'en doute pas mais c'est totalement incohérent :
    - c'est le clic sur la case qui la positionne et qui ensuite déclenche le traitement
    - chez toi le traitement se fait sans que la case soit cochée.

    Avec nos machines multi thread les actions peuvent être parfois décalées
    mais pas au point de pouvoir faire des images sur plusieurs secondes ou minutes

    Si tu étais avec multiplan peut-être mais avec 2019 le ciel me tombe sur la tête.

    Pourrais-tu tester ce classeur sur un autre poste pour confirmer car chez moi je n'ai pas cela.
    Certes je vois des bizarreries parfois, mais à ce point là !!!

    Même avec la version obsolète 2007 conservée cela fonctionne correctement.

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

Discussions similaires

  1. [XL-2013] Automatiser une fonction sur plusieurs cellules différentes
    Par enzo65 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 27/03/2019, 11h57
  2. [XL-2007] Automatiser la modification d'une fonction sur X cellules
    Par Noctis76 dans le forum Excel
    Réponses: 6
    Dernier message: 20/07/2017, 08h43
  3. [XL-2016] Créer une boucle pour action d'une fonction sur des cellules
    Par frenche1 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/06/2017, 23h24
  4. Réponses: 8
    Dernier message: 24/02/2017, 23h10
  5. Forcer le calcul d'une fonction sur des cellules masquées
    Par AAZRO dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/07/2007, 16h34

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