[VBA Word] : case à cocher

Résolu
speedy31 Messages postés 6 Statut Membre -  
 speedy31 -
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. ShaBoo Messages postés 406 Statut Membre 50
     
    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 ?

    @+
    4
    1. speedy31
       
      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.
      0
      1. ShaBoo Messages postés 406 Statut Membre 50 > speedy31
         
        Tout 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
        0
  2. speedy31 Messages postés 6 Statut Membre 3
     
    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
    1. ShaBoo Messages postés 406 Statut Membre 50
       
      Tu executes la procédure de quelle manière ?
      0
  3. speedy31 Messages postés 6 Statut Membre 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
    1. ShaBoo Messages postés 406 Statut Membre 50
       
      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 ?
      0
      1. ShaBoo Messages postés 406 Statut Membre 50 > ShaBoo Messages postés 406 Statut Membre
         
        Je 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
        
        0
  4. speedy31
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. speedy31 Messages postés 6 Statut Membre 3
     
    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
    1. ShaBoo Messages postés 406 Statut Membre 50
       
      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 ...
      0
  7. speedy31
     
    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