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 :

Initialisation objet checkbox ActiveX Word.


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur acousticien
    Inscrit en
    Septembre 2015
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur acousticien
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2015
    Messages : 122
    Par défaut Initialisation objet checkbox ActiveX Word.
    Bonjour,

    Je dispose de plusieurs dizaines de CheckBox ActiveX dans un document Word et je souhaite cocher certaines de ces cases depuis une procédure VBA executée depuis excel.

    Pour tester, les quelques lignes de codes exécutées dans un module Excel fonctionnent parfaitement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    For i = 1 To 5
       If tab_bruit(1, i) Then
          wordDoc.CB_Infr_rout.Value = True
          If i = 1 Then wordDoc.CB_Cat1.Value = True
          If i = 2 Then wordDoc.CB_Cat2.Value = True
          If i = 3 Then wordDoc.CB_Cat3.Value = True
          If i = 4 Then wordDoc.CB_Cat4.Value = True
          If i = 5 Then wordDoc.CB_Cat5.Value = True
       End If
    Next i
    Ayant pas mal d'éléments, je souhaiterais pouvoir initialiser un objet d'après le nom de la variable. Malgré pas mal de recherche je ne trouve pas de solution. Dans l'idéal, ça pourrait ressembler à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    For i = 1 To 5
       If tab_bruit(1, i) Then
          wordDoc.CB_Infr_rout.Value = True
     
          Set chBx = checkbox("CB_Cat" & i) ' ???
          wordDoc.chBx.Value = True
     
       End If
    Next i
    J'ai déjà cherché du côté de word avec une solution de ce type (qui ne marche pas lorsque l'appel se fait depuis Excel...) :

    APPEL DE LA FONCTION :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    For i = 1 To 5
       If tab_bruit(1, i) Then
          wordDoc.CB_Infr_rout.Value = True
          Set obj = getControl("CB_cat" & i, wordDoc)
          If Not obj Is Nothing Then
             obj.Object.Value = True
          End If
       End If
    Next i
    FONCTION :
    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
    Function getControl(name As String, doc As Document) As OLEFormat
     
        Dim ish As InlineShape
     
        For Each ish In doc.InlineShapes
            If ish.Type = wdInlineShapeOLEControlObject Then
                If ish.OLEFormat.Object.name = name Then
                    Set getControl = ish.OLEFormat
                    Exit Function
                End If
            End If
        Next
     
        Set getControl = Nothing
     
    End Function
    "Erreur d’exécution 13 : incompatibilité de type" à la ligne 8...

    En espérant avoir été clair, merci d'avance pour vos conseils.

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Bonjour,

    Peut-être ainsi ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wordDoc.Controls("CB_Cat" & i).Value = True

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur acousticien
    Inscrit en
    Septembre 2015
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur acousticien
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2015
    Messages : 122
    Par défaut
    Bonjour parmi et merci pour ta proposition.

    Malheureusement, ça ne fonctionne pas : Erreur d'exécution 438 Propriété ou méthode non gérée par cet objet...

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Pas évident Word...
    Tu peux peut-être te baser là-dessus (?)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        For I = 1 To ActiveDocument.Fields.Count
    '        MsgBox ThisDocument.Fields.Item(I).OLEFormat.Object.Name
            If I = 1 Then ThisDocument.Fields.Item(I).OLEFormat.Object.Value = True
            If I = 2 Then ThisDocument.Fields.Item(I).OLEFormat.Object.Value = False
        Next

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur acousticien
    Inscrit en
    Septembre 2015
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur acousticien
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2015
    Messages : 122
    Par défaut
    Citation Envoyé par parmi Voir le message
    Pas évident Word...[/CODE]
    En effet il n'est pas toujours facile de trouver comment lier Excel et Word alors même que les même manipulations seraient relativement faciles en restant sous la même application.

    En essayant simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wordDoc.Fields.Item(3).OLEFormat.Object.Value = True
    Une "erreur d'exécution '91' Variable objet ou variable de bloc With non définie" apparaît...

    Comment pourrais-je vérifier que la collection .Fields.Item comprend bien l'ensemble de mes checkbox ?

  6. #6
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Re !

    Avec ma fonction (donné en section VBA Word et avec ta modif), essaye comme ceci :
    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
    Function getControl(name As String, doc As Document) As Variant
     
        Dim ish As InlineShape
     
        For Each ish In doc.InlineShapes
            If ish.Type = wdInlineShapeOLEControlObject Then
                If ish.OLEFormat.Object.name = name Then
                    Set getControl = ish.OLEFormat
                    Exit Function
                End If
            End If
        Next
     
        Set getControl = Nothing
     
    End Function

  7. #7
    Membre confirmé
    Homme Profil pro
    Ingénieur acousticien
    Inscrit en
    Septembre 2015
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur acousticien
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2015
    Messages : 122
    Par défaut
    Génial cerede2000 merci pour cette solution efficace !

  8. #8
    Membre confirmé
    Homme Profil pro
    Ingénieur acousticien
    Inscrit en
    Septembre 2015
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur acousticien
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2015
    Messages : 122
    Par défaut
    Grace à ta fonction ci-dessus, je gère le cochage des checkbox dans mon programme principal de la façon suivante :

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
                For i = 1 To 8 ' on parcours les colonnes
                    If tab_constats(1, i) Then
                        Set obj = getControl(tab_CB(1, i) & "_et1", wordDoc) ' OUI
                    Else
                        Set obj = getControl(tab_CB(1, i) & "_et10", wordDoc) ' NON
                    End If
                    If Not obj Is Nothing Then
                        obj.Object.Value = True
                    End If
                    If tab_constats(2, i) <> "ERREUR" Then
                        Set obj = getControl(tab_CB(1, i) & "_et" & tab_constats(2, i), wordDoc)
                        If Not obj Is Nothing Then
                            obj.Object.Value = True
                        End If
                    End If
                    If tab_constats(3, i) Then
                        Set obj = getControl(tab_CB(1, i) & "_ch11", wordDoc) ' OUI
                    Else
                        Set obj = getControl(tab_CB(1, i) & "_ch101", wordDoc) ' NON
                    End If
                    If Not obj Is Nothing Then
                        obj.Object.Value = True
                    End If
                    If tab_constats(4, i) <> "ERREUR" Then
                        Set obj = getControl(tab_CB(1, i) & "_ch" & tab_constats(4, i) & "1", wordDoc)
                        If Not obj Is Nothing Then
                            obj.Object.Value = True
                        End If
                    End If
                    If tab_constats(5, i) <> "ERREUR" Then
                        Set obj = getControl(tab_CB(1, i) & "_" & tab_constats(5, i), wordDoc)
                        If Not obj Is Nothing Then
                            obj.Object.Value = True
                        End If
                    End If
                Next i
    Cela fonctionne, mais est relativement long. Mon rapport s'édite en 185 secondes avec ce code, contre 15 secondes lorsque cette partie est commentée...

    Pensez-vous qu'il serait possible d'optimiser ce temps de calcul d'une façon ou d'une autre ?

    Merci d'avance !

  9. #9
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Citation Envoyé par flav_cm Voir le message
    Grace à ta fonction ci-dessous, je gère le cochage des checkbox dans mon programme principal de la façon suivante :


    Pensez-vous qu'il serait possible d'optimiser ce temps de calcul d'une façon ou d'une autre ?

    Merci d'avance???
    En n'essayant pas de zigonner des contrôles activex de Word en partant d'Excel. OLE demande beaucoup de ressources et de mémoire.`

    Je te dirais de regarder deux alternatives :

    Un UserForm dans Excel qui permet de définir d'un seul coup les conditions à respecter dans le document Word et ne pas utiliser de ChexBoxes dans Word.

    ou, si tu veux absolument des CheckBoxes dans Word

    De te créer un modèle Word avec des macros.

    et ensuite, tu insères ta fonction comme une nouvelle Sub dans ton modèle Word et tu te sers de ton objet Word.application, que tu ne peux pas éviter dans Excel de toutes façons, et de lui faire lancer par lui ta macro dans ton modèle Word.

  10. #10
    Membre confirmé
    Homme Profil pro
    Ingénieur acousticien
    Inscrit en
    Septembre 2015
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur acousticien
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2015
    Messages : 122
    Par défaut
    Bonjour clementmarcotte et merci pour tes remarques !

    En exécutant ma fonction de recherche d'objet directement dans Word c'est extrêmement plus rapide, mon programme est maintenant à 23s contre 185 auparavant.

    Merci beaucoup.

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

Discussions similaires

  1. Initialisation objet checkbox
    Par flav_cm dans le forum VBA Word
    Réponses: 4
    Dernier message: 19/04/2016, 09h03
  2. Activex Word
    Par sii59000 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 19/10/2005, 14h38
  3. Réponses: 4
    Dernier message: 29/07/2005, 11h47
  4. [MFC] Tester l'initialisation d'un ActiveX
    Par poseidon2 dans le forum MFC
    Réponses: 28
    Dernier message: 22/03/2005, 13h56
  5. [VB6] Modification objet OLE dans Word sous VB
    Par zworg dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 23/02/2004, 08h20

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