[VBA Word] : case à cocher

Résolu
Bonjour,

Je galère avec Word, j'aimerais réaliser une macro VBA, mais je n'y connais rien...
Voici ce que j'aimerais faire :

dans un document Word, j'ai plusieurs tableau représentant chacun un test.
Chaque test dispose de trois cases à cocher : OK, KO, NON TESTE

J'aimerais savoir comment faire une macro pour compter le nombre de test OK, KO et NON TESTE et l'afficher dans des champs TOTAUX en fin de document.

Si quelqu'un pouvait m'aider ?

Merci d'avance
Configuration: Windows 2000
Internet Explorer 6.0

6 réponses

  1. Bonjour,

    1) Est-ce que tes cases à cocher ont été insérées via "Boite à outils contrôles" ou via boites à outils "Formulaires" ?

    2) Dans le cas ou tes caches à cocher ont été insérées via "Boite à outils contrôles", as tu mis la propiété "TripleState" à True ?

    3) Es tu sur que que ce sont des cases à cocher et non pas des radio-boutons ?

    @+
    1. Bonjour et merci de ta réponse :

      1- les cases à cocher ont été insérées via la boite à outils Formulaires.
      2- si la case à cocher
      3- il s'agit bien de cases à cocher et non de radio-boutons.

      Pour mon document, je peux tout à fait utiliser une case à cocher par test (avec la fameuse option TripleState correspondant à mes état OK, KO et NON TESTE), dans ce cas, il me faudrait savoir comment compatibiliser les cases à OK, KO etc... pour faire le compte rendu des tests à la fin.
    2. @speedy31Tout d'abord, il faut que tu utilise les objets CheckBox de la "Boite à Outils Contrôles", sinon cela ne marchera pas.

      Tu définit la propriéte "Name" de chaque CheckBox ainsi : ckb1, ckb2, ckb3, ..., ckb20.

      Tu définit la propriéte "TripleState" de chaque CheckBox à True.

      A partir de là, chaque CheckBox pour être affecté de 3 valeur :

      pas coché = NON TESTE = False

      coché = TEST OK = True

      coché grisé = TEST PAS OK = Null.

      Voici un bout de code que tu pourras adapté à ta guise :

      Sub TestValueCkb()
      
      Dim Ctrl As Variant
      Dim Controle As InlineShape
      Dim Check As MSForms.CheckBox
      
      With ActiveDocument
          For Each Controle In .InlineShapes
              If StrComp(Left(Controle.OLEFormat.Object.Name, 3), "ckb", vbTextCompare) = 0 Then
                  Set Check = Controle.OLEFormat.Object
      
                  If IsNull(Check.Value) Then
                     Ctrl = 1
                  Else
                     Ctrl = Check.Value
                  End If
      
                  Select Case Ctrl
                       Case True 'TEST OK
                            MsgBox Controle.OLEFormat.Object.Name & " True", vbOKOnly, ""
                       Case False 'TEST PAS OK
                            MsgBox Controle.OLEFormat.Object.Name & " False", vbOKOnly, ""
                       Case 1 'PAS DE TEST
                            MsgBox Controle.OLEFormat.Object.Name & " Null", vbOKOnly, ""
                  End Select
              End If
          Next
      End With
      
      Set Controle = Nothing
      Set Check = Nothing
      
      End Sub
  2. Bonjour,

    Ta macro fonctionne à merveille, même dans plusieurs tableaux, je te le confirme !

    Par contre, j'ai eu un problème ce matin, en voulant utiliser ta macro dans mon document définitif.
    Je place mes CheckBox, copie-colle ta macro, mais rien à faire... j'avais toujours l'erreur :
    Variable objet ou variable bloc With non définie (erreur 91)

    Pourtant, tout fonctionne parfaitement dans mon essai de document réalisé hier soir.
    J'ai cherché un bon bout de temps, et j'ai fini par trouver...un truc de fou...

    Dans le template de document que j'utilise (qui est assez complexe, y des sections, des champs, des commentaires,des tableaux, bref, tout un paquet d'objets), il y a en première page le logo de la boite. je me suis aperçu que le fait d'enlever ce logo solutionnait mon problème.
    En cherchant encore, j'ai trouvé la manip suivante :
    Clic droit sur l'image / Objet Image / Convertir....
    Là, je sélectionne "Activer comme...." et dans la liste je choisi "Image Microsoft Word".
    Et là, j'enregistre le doc, et c'est gagné...

    Voilà, je pense que ta boucle qui parse les objets du documents ne devait pas aimer de tomber sur l'image dans un format qu'elle ne connaissait pas, et cette manip permet de lire correctement l'objet image...enfin c'est ce que je pense.

    Donc voilà, super grand merci, maintenant, c'est NICKEL, mon doc est fini, j'ai mes 300 checkbox dans pleins de tableaux, et cela fonctionne à merveille, à la fin, tout est calculé automatique.

    MERCI !
    1. J'avais oublié que j'avais Word sur le PC de ma femme.
      Je viens donc de tester ta fonction : CA MARCHE !!!

      Excellent, un grand merci, je vais ainsi pouvoir faire exactement ce que je souhaitais !
      Vraiment super !
      1. Bonsoir,

        Les pb vont commencer lorsque tu vas aborder ce sujet :

        dans un document Word, j'ai plusieurs tableau représentant chacun un test.
        Chaque test dispose de trois cases à cocher : OK, KO, NON TESTE


        Car pour l'instant la procédure comptabilise ttes les checkbox sur un document ...
    2. De retour à la maison où je n'ai pas Excel, je testerai cela demain matin.
      J'exécute la procédure en pas à pas avec le debuggeur Visual Basic, directement depuis le code que tu m'as donné.

      Je teste cela demain matin et te tiens au courant.
      Merci, j'appréci ton coup de main !
      1. J'avais essayer ceci en vain :

        Private Sub UpdateCompteurs(Obj As CheckBox)

        If TypeOf Obj Is CheckBox Then

        Select Case objName.Value
        Case True: objName.Caption = "OK"
        compteurOK = compteurOK + 1
        Case False: objName.Caption = "KO"
        compteurKO = compteurKO + 1
        Case Else: objName.Caption = "NOT TESTED"
        compteurNT = compteurNT + 1
        End Select
        End If
        TextBox1.Value = compteurOK

        End Sub

        Private Sub CheckBox1_Change()

        UpdateCompteurs (ActiveDocument.FormFields("CheckBox1").CheckBox)

        End Sub

        Mais l'appel de ma fonction UpdateCompteurs retourne systématiquement "Incompatibilité de type". Je ne parviens pas à passer ma fameuse CheckBox dont la propriété Name est pourtant bien "CheckBox1" à ma fonction UpdateCompteurs...
        Peut-être que je m'y prends carrément mal ?

        En tout cas ta méthode semble 100 fois mieux, car avec la mienne, je devrais appeller ma méthode dans le code de chaque checkbox, avec ta méthode, c'est fait en une seule fois...
        1. En incluant tes variables compteur cela devrait donner ceci :

          Sub TestValueCkb()
          
          Dim Ctrl As Variant
          Dim Controle As InlineShape
          Dim Check As MSForms.CheckBox
          Dim cptOK As Integer
          Dim cptKO As Integer
          Dim cptNT As Integer
          Dim Msg As String
          
          cptOK = 0
          cptKO = 0
          cptNT = 0
          
          ActiveDocument.Activate
          
          With ActiveDocument
              For Each Controle In .InlineShapes
                  If StrComp(Left(Controle.OLEFormat.Object.Name, 3), "ckb", vbTextCompare) = 0 Then
                      Set Check = Controle.OLEFormat.Object
          
                      If IsNull(Check.Value) Then
                         Ctrl = 1
                      Else
                         Ctrl = Check.Value
                      End If
          
                      Select Case Ctrl
                           Case True 'TEST OK
                                'MsgBox Controle.OLEFormat.Object.Name & " True", vbOKOnly, ""
                                cptOK = cptOK + 1
                           Case False 'TEST PAS OK
                                'MsgBox Controle.OLEFormat.Object.Name & " False", vbOKOnly, ""
                                cptKO = cptKO + 1
                           Case 1 'PAS DE TEST
                                'MsgBox Controle.OLEFormat.Object.Name & " Null", vbOKOnly, ""
                                cptNT = cptNT + 1
                      End Select
                  End If
              Next
          End With
          
          Msg = "Nb Test OK = " & cptOK & Chr(10)
          Msg = Msg & "Nb Test KO = " & cptKO & Chr(10)
          Msg = Msg & "Nb non testé = " & cptNT
          
          MsgBox Msg, vbOKOnly, "Résultat test"
          
          Set Controle = Nothing
          Set Check = Nothing
          
          End Sub
          


          Tu ne m'as pas dit comment tu executais la procédure ?
        2. @ShaBooJe viens de m'apercevoir de p'tit beug ;p

          Si on part sur ces conditions :


          pas coché = NON TESTE = False

          coché = TEST OK = True

          coché grisé = TEST PAS OK = Null.


          le code suivant :

                      Select Case Ctrl
                           Case True 'TEST OK
                                'MsgBox Controle.OLEFormat.Object.Name & " True", vbOKOnly, ""
                                cptOK = cptOK + 1
                           Case False 'TEST PAS OK
                                'MsgBox Controle.OLEFormat.Object.Name & " False", vbOKOnly, ""
                                cptKO = cptKO + 1
                           Case 2 'PAS DE TEST
                                'MsgBox Controle.OLEFormat.Object.Name & " Null", vbOKOnly, ""
                                cptNT = cptNT + 1
                      End Select
          


          est faux

          il faux avoir ceci :

                      Select Case Ctrl
                           Case True 'TEST OK
                                'MsgBox Controle.OLEFormat.Object.Name & " True", vbOKOnly, ""
                                cptOK = cptOK + 1
                           Case False 'PAS DE TEST
                                'MsgBox Controle.OLEFormat.Object.Name & " False", vbOKOnly, ""
                                cptNT = cptNT + 1
                           Case 2 'TEST PAS OK
                                'MsgBox Controle.OLEFormat.Object.Name & " Null", vbOKOnly, ""
                                cptKO = cptKO + 1
                      End Select
          


          de plus le test suivant :
                      If IsNull(Check.Value) Then
                         Ctrl = 1
                      Else
                         Ctrl = Check.Value
                      End If
          


          doit etre remplacé par :

                      If IsNull(Check.Value) Then
                         Ctrl = 2
                      Else
                         Ctrl = Check.Value
                      End If
          
      2. J'ai le message d'erreur suivant en exécutant ta procédure :

        Variable objet ou variable bloc With non définie (erreur 91)

        Merci en tout cas pour ton aide, je sens qu'on va y arriver !
        1. Tu executes la procédure de quelle manière ?