[VBA Word] : case à cocher [Résolu/Fermé]

Signaler
Messages postés
6
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
20 septembre 2007
-
 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

6 réponses

Messages postés
392
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
5 septembre 2009
49
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 76687 internautes nous ont dit merci ce mois-ci

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.
Messages postés
392
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
5 septembre 2009
49 > 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
Messages postés
6
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
20 septembre 2007
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 !
Messages postés
392
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
5 septembre 2009
49
Tu executes la procédure de quelle manière ?
Messages postés
6
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
20 septembre 2007
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...
Messages postés
392
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
5 septembre 2009
49
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 ?
Messages postés
392
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
5 septembre 2009
49 >
Messages postés
392
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
5 septembre 2009

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
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 !
Messages postés
6
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
20 septembre 2007
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 !
Messages postés
392
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
5 septembre 2009
49
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 ...
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 !