[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. 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 ?
  3. 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
      
  4. 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 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. 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 !