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 :

Caption checkbox feuille dans variable public [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Invité
    Invité(e)
    Par défaut Caption checkbox feuille dans variable public
    Bonsoir,

    J'ai 45 checkbox sur une feuille (checkbox activex), je voudrai récupérer le caption dans une variable public à réutiliser dans une autre macro.

    Voici le code d'une seule checkbox sur la feuille (le code est le même pour les 45 checkboxs)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Dim App, etat
     
    Private Sub Chk17_Click()
    etat = Chk17.Value
    App = Chk17.Caption
    If etat = True Then
    MsgBox App & " est en service"
    testOn
    ElseIf etat = False Then
    MsgBox App & " est hors-service"
    testOff
    End If
    End Sub
    Je parviens pas à récupérer le caption pour executer la macro ci-dessous
    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
    Public App
    Sub testOn()
    Dim myRange As Range, myCell As Range
    MsgBox App
    With Sheets("bd")
       'aa = "tt16"
      Set myRange = Columns(7).Find(App, lookat:=xlPart)
      If Not myRange Is Nothing Then
        Set myCell = myRange
         Do
           myRange.Offset(, 5).Value = "En Service"
          Set myRange = Columns(7).FindNext(myRange)
        Loop Until myRange.Address = myCell.Address
      End If
      End With
      MsgBox "terminé!"
    End Sub
    En vous remerciant par avance, par la même occasion est-il possible d'avoir un seul code pour les 45 checkbox_clic?

    Cordialement,

  2. #2
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Enlève Dim App du module de la feuille

    Module de la feuille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub Chk17_Click()
     
    App = Chk17.Caption
    If Chk17.Value Then
        MsgBox App & " est en service"
        TestOn
    Else
        MsgBox App & " est hors-service"
        TestOff
    End If
    End Sub
    Module standard
    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
    Option Explicit
     
    Public App As String
     
    Sub TestOn()
    Dim myRange As Range, myCell As Range
     
    MsgBox App
    With Worksheets("bd")
        'aa = "tt16"
        Set myRange = .Columns(7).Find(App, lookat:=xlPart)
        If Not myRange Is Nothing Then
            Set myCell = myRange
            Do
                myRange.Offset(, 5).Value = "En Service"
                Set myRange = .Columns(7).FindNext(myRange)
            Loop Until myRange.Address = myCell.Address
            Set myCell = Nothing
        End If
        Set myRange = Nothing
    End With
    MsgBox "Terminé!"
    End Sub

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonsoir Mercatog,

    Toujours aussi efficace. Entre nous, je t'envie un peu. Je te remercie beaucoup. J'ai beaucoup appris de toi. Merci.

    Je suis à la recherche d'une solution à mon problème actuel. J'ai pensé à la fonction find et c'est pour cette raison que j'ai ouvert cette discussion.

    les 45 checkboxs que j'ai mis sur la feuille représentent des appareils (répartis le long de lignes électriques, si tu t'en souviens),
    je voudrai suivant le cas en service ou hors service reporter ou effacer le nom (caption) sur des lignes.

    Les noms sont en colonne G et sont déjà mis pour toutes cellules=ps ou ps/ji ou cps de la colonne F.
    Je voulais avec find récupérer le numero de ligne, puis récupérer n=cells(ligne,3)&cells(ligne,4)&(int(cells(ligne,5)
    et utiliser une autre fois find pour trouver n et si cells(ligne,6)= ji ou adf reporter ou effacer le nom.
    Je doute d'y parvenir ainsi car j'ai effectué des tests et find ne fait aucune différence entre PS, PS/JI, CPS et JI.
    C'est pour cela que j'ai rajouter en colonne L, les mots en service et hors service, pour essayer de trouver une solution.

    Je t'avoue que j'ai essayé ta fonction mais sans y parvenir. Si tu veux bien jeter un coup sur mon fichier j'ai mis un cas concret.

    Je te suis déjà très reconnaissant. Merci beaucoup.

    Bonne fin de soirée.

    http://cjoint.com/?0Dma7Zmlodd

    Cordialement

  4. #4
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Bonjour cathodique

    Citation Envoyé par cathodique Voir le message
    Je doute d'y parvenir ainsi car j'ai effectué des tests et find ne fait aucune différence entre PS, PS/JI, CPS et JI.
    C'est pour cela que j'ai rajouter en colonne L, les mots en service et hors service, pour essayer de trouver une solution.
    N'oublie pas le point devant Columns(7).

    La commande FIND n'est pas simple à utiliser, loin de là. Si tu ne la connais pas à fond, mieux vaut s'en tenir à une itération pour faire la recherche.

    Pour faire la différence entre PS, PS/JI, CPS et JI, remplace xlPart par xlWhole.

    Si la valeur recherchée n'est pas le résultat d'une formule, je te conseille d'ajouter LookIn:=xlFormulas, pour maximiser les chances que la recherche donne un résultat.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Set myRange = .Columns(7).Find(App, LookIn:=xlFormulas, Lookat:=xlWhole)

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour Docmarti,

    Je te remercie pour tes conseils. En effet, je ne connais pas à fond la fonction FIND.

    En réalité, je ne suis pas très fort en VBA, je suis constamment soit fourré dans mes fichiers exemples ou sur le net.

    Donc j'abandonne en partie FIND.

    Maintenant, que j'ai mis en colonne L, "en service" et "hors-service", je voudrai parcourir les lignes de cette colonne et récupérer dans une variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cells(Lig,3)&cells(Lig,4)&(int(Lig,5)
    Et pour les lignes répondant à ces critères, si c'est "en service", reporter valeur cellule correspondante colonne G, si c'est "hors-service" effacer les valeurs.

    Je ne sais pas si j'ai été clair, car bien souvent quand je cherche obstinément une solution tout s'embrouille dans ma petite tête.

    Bon week-end.

    Cordialement,
    Dernière modification par AlainTech ; 26/04/2014 à 17h22. Motif: Balises [code]

  6. #6
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Je pourrai te dire si tu as été clair quand je saurai ce que tu veux comme résultat final.

    Alors donne-moi un exemple concret:
    1) l'état de la ligne avant
    2) l'état de la ligne après.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour Docmarti,

    Très souvent une image vaut mieux que mille discours.http://cjoint.com/?0DmtqyTxiUW

    Merci beaucoup.

    Bon dimanche.

    Cordialement,

  8. #8
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Tu reste vague cathodique (comme ta fâcheuse habitude )
    Je m'explique, tu veux inscrire ou effacer le nom de l'appareil coché sur les cellules vides de la colonne J qui répondent à des critères.

    Ce que tu n'arrive pas à expliquer CLAIREMENT, ce sont les critères.

  9. #9
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut

    If you can’t explain it simply, you don’t understand it well enough … (Albert Einstein)

  10. #10
    Invité
    Invité(e)
    Par défaut
    Bonsoir Mercatog,

    Comme je l'ai déjà dit quand je m'obstine à trouver une solution, je deviens brouillon. De plus, je n'ai pas un bac+5 et c'est peut-être l'âge aussi.
    Je m'explique, tu veux inscrire ou effacer le nom de l'appareil coché sur les cellules vides de la colonne J qui répondent à des critères.
    C'est ça mais de la colonne G (non J) et dont la valeur colonne F est "ADF" ou JI. Mais étant donné qu'un appareil peut figurer sur plusieurs lignes, il faut aussi prendre comme critères les colonnes col C (famille) et col D (tronçon) et valeur entière de col E (PK)

    Je joins une image n'est-ce pas clair?

    Bon, je vais faire un effort pour mieux expliquer. Grâce à toi, je suis parvenu à mettre "en service" ou "hors-service" sur les lignes où figure le nom de l'appareil.(si c'est possible de ne pas passer pas cette étape ça serait mieux)

    Un appareil peut être connecté à plusieurs autres, c'est pour cela qu'il y a plusieurs lignes. Le nom de l'appareil Figure déjà en colonne G pour chacune des valeurs PS ou PS/JI ou CPS (ou PS/PG à ne pas prendre en compte) en colonne F.

    exemple où se trouve TT16:
    ligne...........col F.............col G
    44..............PS...............TT16 (ligne 43 à traiter en colF=JI)
    87..............PS...............TT16 (ligne 86 à traiter en colF=JI)
    106............CPS..............TT16 (lignes 105 et 107 à traiter en col F=ADF)

    Critères pour ligne 44 et 43
    ligne.............Col C..............Col D..............Int(Col E)...........Col F...........Col G............Col L
    43................G1.................A/O..............Int(0.07)=0...........JI...............vide.............vide
    44................G1.................A/O..............Int(0.074)=0..........PS..............TT16...........En service

    Donc col C, col D, col E identiques et Col F= JI ou ADF on inscrit en col G, Lig 43 --->TT16 et si on décoche on le retire de ligne 43 seulement et on garde celle de la ligne 44.

    j'ai vérifié beaucoup de cas et je pense qu'on peut ne pas prendre comme critère col F =JI ou ADF, je pense que les critères des colonnes C,D et E sont suffisants.

    Dites-moi si c'est clair ou non.

    En vous remerciant beaucoup.

    Cordialement,

  11. #11
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonsoir,

    (le code est le même pour les 45 checkboxs)
    Déjà, là, je partirai sur un module de classe afin de ne pas avoir 45 fois le même code !
    Je sais, c'est tellement évident pour celui qui sait ce qu'il veut obtenir mais malgré tout tellement difficile de le comprendre pour celui qui ne sait pas !
    J'ai beau relire plusieurs fois tes posts cathodique, désolé mais malgré ça, je n'arrive pas à saisir vraiment ce que tu veux, c'est sûrement dû au fait que c'est le soir et en plus le WE
    Je relirai ça à tête reposée pour voir si je peux apporter une petite contribution

    Hervé.

  12. #12
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Voilà une autre approche, retiens ton souffle
    Comme tu utilises beaucoup de Checkbox, je crois que le mieux est d'utiliser les classes. Ainsi si tu ajoute d'autres appareils, il suffit d'ajouter le nouveau checkbox et de le renommer avec "Chk" comme préfixe.

    Sur un nouveau fichier

    1. Insère un module de classe (par défaut nommé Classe1) et y insère le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Option Explicit
     
    Public WithEvents Chk As MsForms.CheckBox
     
     
    Private Sub Chk_Click()
     
    TestOnOff Chk.Caption, Chk.Value
    End Sub
    2. Dans le module de la feuille m_a:
    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
    Option Explicit
     
    Dim CC() As Classe1
     
    Private Sub Worksheet_Activate()
    Dim CB As OLEObject
    Dim i As Integer
     
    For Each CB In Feuil1.OLEObjects
        If Left(CB.Name, 3) = "Chk" Then
            i = i + 1
            ReDim Preserve CC(1 To i)
            Set CC(i) = New Classe1
            Set CC(i).Chk = CB.Object
        End If
    Next CB
    End Sub
    3. Insère un module standard et y insère le code suivant
    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
    Option Explicit
     
    Sub TestOnOff(ByVal App As String, ByVal Etat As Boolean)
    Dim LastLig As Long, i As Long, j As Long
    Dim Tb
     
    With Worksheets("bd")
        LastLig = .Cells(.Rows.Count, "B").End(xlUp).Row
        Tb = .Range("C2:G" & LastLig)
        For i = 1 To LastLig - 1
            If InStr("JI|ADF", Tb(i, 4)) Then
                If Not Etat Then
                    If Tb(i, 5) = App Then Tb(i, 5) = ""
                Else
                    If Tb(i, 5) = "" Then
                        For j = 1 To LastLig - 1
                            If Tb(j, 5) = App And Tb(j, 1) & "|" & Tb(j, 2) & "|" & Int(Tb(j, 3)) = Tb(i, 1) & "|" & Tb(i, 2) & "|" & Int(Tb(i, 3)) Then Tb(i, 5) = App
                        Next j
                    End If
                End If
            End If
        Next i
        .Range("C2:G" & LastLig) = Tb
    End With
    End Sub
    4. Dans le module ThisWorkbook:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Option Explicit
     
    Private Sub Workbook_Open()
     
    Worksheets("bd").Activate
    End Sub
    PS. Pour un premier test, il faudra absolument sélectionner la feuille bd, car l'instanciation de la classe se fait sur Activation de la feuille m_a

    Fais un test pour te préparer une explication au cas où ça fait ce que souhaaité.

  13. #13
    Invité
    Invité(e)
    Par défaut
    Bonsoir Theze,

    Je te remercie pour ton retour.

    Pour faire une analogie à mon problème. Un disjoncteur (col G) protège un circuit, sur ce circuit sont branchés des prises (col F)
    et leur désignation est PS ou PS/JI ou CPS; Les colonnes C,D et E permettent leur localisation (chambre, sdb ..., pour Col E c'est à quelle distance).
    Les équipements qui seront branchés sur ces prises ont comme désignation JI ou ADF (col F).

    Je voudrai tout simplement mettre en colonne G, par quel disjoncteur est protégé l'équipement considéré.

    Donc si je considère un équipement JI ou ADF (col F), il est branché sur la prise (col F) (désignation PS ou PS/JI ou CPS) , qui se trouve à (col C et col D et Col E) et protéger par disjoncteur (colG).

    Il est certain que je n'arrive pas expliquer ce que je veux obtenir surtout dans le jargon des développeurs car je n'en suis pas un.

    Maintenant pour le module de classe, ne compte pas sur moi. je n'arrive même pas à monter une macro toute simple. Je suis encore au stade du pas à pas.

    Pour te dire, Mercatog m'avait donné un coup de main, et avait utilisé les tableaux. J'ai mis une bonne vingtaine de minutes à appuyer sur la touche F8 et je n'ai rien vu jusqu'à la dernière ligne de code, le résultat était formidable. Mais je n'ai vu aucune étape et ça m'a dérouté. Ce n'est que par la suite que j'ai compris que tout les opérations se traitées en mémoire.

    ça c'est pour l'anecdote, allez merci et bon dimanche.

    Cordialement,

  14. #14
    Invité
    Invité(e)
    Par défaut
    Et dire que tu m'avais dit que je te surestimais.

    Non tu es un véritable AS, et modeste pardessus le marché. je te dis BRAVO, BRAVO,BRAVO.

    Ton code fonctionne très bien à une seule exception, j'ai 2 appareils au même point (ex:TT14-TT18). Même en renommant le caption ça ne fonctionne pas.

    Je te remercie beaucoup.

    Bonne fin de soiré et je te souhaite un très bon dimanche.

    Au fait, pour les calculs sur mon fichier, j'ai réussi à le faire à ma façon sur la base de ton code avec autofiltre et utilisant la fonction sous.total.

    Cordialement,
    Dernière modification par cathodique ; 13/04/2014 à 01h26.

  15. #15
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Quand tu as ce cas de figure (exemple TT14-TT18) et si tu cliques sur la case à cocher correspondant à l'appareil TT18, tu voudrai reporter dans les cellules vides correspondante seulement TT18 ou bien le couple TT14-TT18?

    PS, dans les 2 cas, le code ne sera que légèrement modifié.

  16. #16
    Invité
    Invité(e)
    Par défaut
    Bonjour Mercatog, Le Forum,

    Désolé, mais je n'ai pas pu veiller aussi tard que toi. Je te remercie beaucoup.

    je voudrai que TT18 (CheckBox sur laquelle on a cliqué).

    Bon dimanche.

    Cordialement,

  17. #17
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Modification en ligne 17 du module standard
    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
    Option Explicit
     
    Sub TestOnOff(ByVal App As String, ByVal Etat As Boolean)
    Dim LastLig As Long, i As Long, j As Long
    Dim Tb
     
    With Worksheets("bd")
        LastLig = .Cells(.Rows.Count, "B").End(xlUp).Row
        Tb = .Range("C2:L" & LastLig)
        For i = 1 To LastLig - 1
            If InStr("|JI|ADF|", Tb(i, 4)) Then
                If Not Etat Then
                    If Tb(i, 5) = App Then Tb(i, 5) = ""
                Else
                    If Tb(i, 5) = "" Then
                        For j = 1 To LastLig - 1
                            If Tb(j, 5) Like "*" & App & "*" And Tb(j, 1) & "|" & Tb(j, 2) & "|" & Int(Tb(j, 3)) = Tb(i, 1) & "|" & Tb(i, 2) & "|" & Int(Tb(i, 3)) Then Tb(i, 5) = App
                        Next j
                    End If
                End If
            End If
        Next i
        .Range("C2:L" & LastLig) = Tb
    End With
    End Sub

  18. #18
    Invité
    Invité(e)
    Par défaut
    Bonjour Mercatog, le forum,

    C'est super, c'est exactement ce que je voulais obtenir. Tu as toute ma gratitude et toute ma reconnaissance.

    Ne me dis plus que n'est pas un "AS".

    Bon journée.

    1000 mercis.

    Cordialement,

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

Discussions similaires

  1. [XL-2007] Variable public dans UF
    Par bigboy dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 12/08/2009, 17h23
  2. [PHP 5.3] Récupérer les checkbox cochées dans une variable
    Par Invité dans le forum Langage
    Réponses: 6
    Dernier message: 01/06/2009, 13h25
  3. Rendre une variable public dans mon main
    Par djorfe dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 13/06/2008, 11h49
  4. création dynamique checkbox caption plage feuille cachée
    Par Xiombarg2911 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 06/05/2008, 12h36
  5. Réponses: 1
    Dernier message: 27/02/2007, 12h28

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