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

VBA Word Discussion :

Userform non modal bloqué après l'avoir utilisé une fois [WD-2016]


Sujet :

VBA Word

  1. #1
    Membre à l'essai
    Femme Profil pro
    Chef de projet production clinique
    Inscrit en
    Octobre 2020
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chef de projet production clinique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Octobre 2020
    Messages : 20
    Points : 12
    Points
    12
    Par défaut Userform non modal bloqué après l'avoir utilisé une fois
    Bonjour à tous,

    J'ai une macro qui met à jour tous les champs (y compris les entêtes) que je souhaite lancer avec un bouton. J'ai essayé de personnaliser le ruban mais la modification ne se retrouve pas pour les autres utilisateurs. J'ai donc décidé de passer par un userform.

    Afin de pouvoir utiliser le document word et laisser afficher le userform à côté, j'ai utilisé le code ci-dessous rattaché à mon document:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub userform_non_modal()
     
            UpdateFields.Show vbModeless
     
    End Sub
    Cela marche bien une 1ère fois mais lorsque je lance la macro, le document à côté n'est ensuite plus disponible ce qui oblige à fermer la fenêtre de l'userform alors que je voudrais qu'elle soit disponible à l'infini.

    Je tiens à préciser que je débute en VB/macro/userform et que j'ai réalisé cela à partir de tuto notamment celui-ci: https://heureuxoli.developpez.com/office/word/userform/

    Pourriez-vous m'aider?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Clairemouth Voir le message
    Bonjour,

    Votre explication n'est pas claire concernant le "document à côté".

  3. #3
    Membre à l'essai
    Femme Profil pro
    Chef de projet production clinique
    Inscrit en
    Octobre 2020
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chef de projet production clinique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Octobre 2020
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    En résumé, je souhaiterais qu'en même temps soit accessible la feuille de texte word (corps de texte) + le userform en haut à droite de l'écran (boîte de dialogue qui comporte mon bouton de lancement macro qui met à jour les champs dans la feuille du texte word).
    J'ai lu que c'était la différence entre les userforms modal (seul le userform est accessible tant qu'il n'a pas été acquitté) et non modal (utilisation libre du texte dans la feuille word ou du userform). C'est pour cette raison que j'ai mis un show vbmodeless.

    Autre question: comment faire pour que mon userform s'ouvre dès l'ouverture du document?

    Désolée si cela n'est pas clair mais je suis très débutante dans tout ce qui touche à l'onglet Développeur que j'ai découvert il y a quelques semaines seulement

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Clairemouth Voir le message
    L'utilisation d'un userform en vbmodeless peut être hasardeuse car vous ne contrôlez plus tout à fait ce que vous faites. De mon point de vue, il faudrait a minima instancier une variable Document de portée publique pour identifier votre document de travail, mais difficile de vous aider sans savoir dans quel contexte vous travaillez.

    Je n'ai pas compris où se situait votre userform :
    • Dans votre Normal.Dot ?
    • Dans un document .docm support ?
    • Dans votre document de travail ?


    Sinon, pour faire apparaître votre userform à l'ouverture du fichier, il vous faut utiliser l'événement Document.Open dans le module ThisDocument. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Option Explicit
     
    Private Sub Document_Open()
     
            LancerLUserform
     
    End Sub
    Et dans un module standard :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    Sub LancerLUserform()
     
        With Userform1
     
             .Show
     
        End With
     
    End Sub
    Nb : Quand vous mettez du code en ligne, sélectionnez votre code et cliquez sur le bouton #. Ce sera plus lisible.

  5. #5
    Membre à l'essai
    Femme Profil pro
    Chef de projet production clinique
    Inscrit en
    Octobre 2020
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chef de projet production clinique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Octobre 2020
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Je pense que mon userform est dans mon document de travail. Sous VB, j'ai l'arborescence Project(avec le nom du document), puis une feuille avec mon userform.

    Le mieux est peut-être que je reprenne depuis le début l'explication de l'objectif car il y a peut-être d'autres solutions pour arriver au but.
    J'ai un cahier des charges avec des mentions qui se répètent à plusieurs endroits dont dans l'entête. Voici dans l'ordre ce que j'ai essayé:
    1. Je suis d'abord passé par les formulaires hérités. J'avais une macro qui me permettait de mettre à jour tous les champs qui se lançaient à la sortie du champs après saisie. Malheureusement, cela ne fonctionne bien qu'en mode "protégé" et ce dernier ne permet pas de mettre des commentaires en interagissant avec le formulaire.
    2. J'ai donc remplacé les formulaires hérités par des propriétés de document pré-établies pour les mentions les plus importantes. J'ai 12 annexes pour lesquels les numéros de révision sont renvoyés dans plusieurs endroits dont les entêtes et pour celles-ci je suis passées par des contrôles de contenus (je n'avais plus de propriétés de document pré-établies disponibles). Ma macro de mise à jour des champs se lançaient dès la sauvegarde du document (macro trouvée en fouillant sur internet). Cela marchait bien mais cela cause trop de ralentissement ==> peut-être qu'une solution serait de l'alléger pour que cela soit plus rapide et presque transparent.
      Voici le code que j'ai dans This Document rattaché au projet du document .docm:

      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
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
       
      Public WithEvents App As Word.Application
       
      Private Sub App_DocumentBeforeSave(ByVal doc As Document, SaveAsUI As Boolean, Cancel As Boolean)
      'MAJ Table des matières
          For t = 1 To ActiveDocument.TablesOfContents.Count
              ActiveDocument.TablesOfContents(t).Update
          Next
      'MAJ tous les champs
          Dim oStory As Object
          Dim oToc As Object
          Dim oSect As Object
          Dim oShape As Shape
          Dim i As Integer
       
          ' Sortir si aucun document ouvert
          If Documents.Count = 0 Then Exit Sub
       
          Application.ScreenUpdating = False
       
          ' Champs du corps du document
          For Each oStory In ActiveDocument.StoryRanges
              oStory.Fields.Update
              If oStory.ShapeRange.Count > 0 Then
                  For Each oShape In oStory.ShapeRange
                      If oShape.TextFrame.HasText Then
                          oShape.TextFrame.TextRange.Fields.Update
                      End If
                  Next
              End If
          Next oStory
          For Each oToc In ActiveDocument.TablesOfContents
              oToc.Update
              oToc.UpdatePageNumbers
          Next oToc
          For Each oToc In ActiveDocument.TablesOfFigures
              oToc.Update
              oToc.UpdatePageNumbers
          Next oToc
       
          i = ActiveDocument.BuiltInDocumentProperties(14) ' nb pages
          If i >= 1 Then
              For Each oSect In ActiveDocument.Sections
                  ' En-têtes
                  oSect.Headers(1).Range.Fields.Update
       
                  ' Pieds-de-page
                  oSect.Footers(1).Range.Fields.Update
              Next oSect
          End If
       
          Application.ScreenUpdating = True
      End Sub
       
       
      Private Sub Document_Open()
          Set App = Word.Application
      End Sub
    3. Comme cela ralentissait trop à chaque sauvegarde (choisie ou automatique), j'ai décidé de mettre un bouton dans le ruban pour la macro MajTousChamps. Cela fonctionnait bien mais malheureusement, le bouton n'est pas disponible pour les autres utilisateurs sans qu'ils doivent faire la manipulation pour l'ajouter eux-mêmes. ==> peut-être que je m'y suis mal prise et qu'on peut rattacher une configuration de ruban au document?

    4. Comme le bouton n'était pas disponible pour les autres utilisateurs, je me suis dit que j'allais passer par un userform pour qu'ils aient le bouton en permanence disponible pour lancer la macro de mise à jour des champs lorsqu'ils en ont besoin. Et là, je bute un peu à cause car c'est nouveau pour moi. D'abord, je n'avais accès qu'au userform tant qu'il n'était pas acquitté ce qui ne convient pas à l'utilisation. Puis, j'ai trouvé qu'il fallait passer en non modal pour pouvoir accès au userform en même temps que le document de travail mais cela ne fonctionne que jusqu'à la 1ère utilisation. ==> Peut-être qu'il y a quelque chose à rajouter pour que l'userform se regénère une fois qu'on l'a utilisé une fois?


    Pour l'instant, j'ai donc 3 pistes (de la plus simple à la plus compliquée) qui me permettraient de résoudre le problème.

    Je ne m'y connais pas en code mais il y a certainement quelque chose à faire de ce côté là (1). Ceci pourrait me permettre d'avoir une macro rapide d'exécution et qui soit rattachée à la sauvegarde du document.

  6. #6
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Salut.

    Comme tu es dans Word, je ne comprends pas l'utilité de variabiliser l'application. Elle est disponible par l'objet Application. Pourquoi passer par une variable?

    J'ai vu passer un Exit Sub. Voici tout le bien que je pense de cette ligne de code...

    Tu mets Exit Sub au cas où aucun document ne serait ouvert, mais juste avant dans la même procédure, tu boucles sur des éléments du document actif => tu as donc forcément au moins un document ouvert, il me semble.

    Comme le dit Eric, la programmation d'un userform modeless est un truc à bien réfléchir, puisque tu vas pouvoir modifier la situation de Word via l'interface, et tu dois donc réfléchir à tout ce que peut réaliser l'utilisateur dans Word et qui va peut-être perturber ton utilisateur. Cela dit, si le seul truc que fait ton userform modeless, c'est appeler une procédure d'un module standard "qui fait le job", je ne vois pas trop ce qui empêcherait qu'il soit appelé à l'envi. Peut-être pourrais-tu détailler l'architecture que tu as mis en place et ce que fait réellement le userform.

    Si, comme j'ai cru le comprendre, ton usf est simplement là pour proposer un bouton déclenchant une macro, il me semble qu'ajouter par code "une barre d'outils" au ruban serait plus simple, moins contraignant et moins casse-gueule en termes de programmation.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Clairemouth Voir le message
    Bonjour,

    Je souscris à ce qu'écrit Pierre ().

    Par rapport aux explications, si le point 3 fonctionne, regardez ce billet dans mon blog pour associer une macro à un bouton dans la barre d'accès rapide. En revanche, pour que ce bouton soit associé au document, il faut que document soit du type .docm. Word-demarrer-macro-associee-document-barre-dacces-rapide
    Attention quand même : Au cas où votre document .docm aurait été sauvegardé depuis un .doc, vous n'aurez pas la possibilité d'associer votre macro au document. Il vous faudra générer un .docm et faire un copier coller de votre document sur le nouveau pour avoir cette possibilité. Il vous faudra également transférer les différents modules (sauf erreur de ma part).

  8. #8
    Membre à l'essai
    Femme Profil pro
    Chef de projet production clinique
    Inscrit en
    Octobre 2020
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chef de projet production clinique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Octobre 2020
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Alors en fait, je suis très novice en la matière (j'ai découvert l'onglet Développeur il y a seulement quelques semaines). Du coup, je me suis contentée de suivre un tuto pour la création d'une macro, puis de copier-coller des macros que j'ai trouvé sur le net: la 1ère pour la mise à jour de la table des matières et la 2ème pour la mise à jour des champs (y compris les entêtes).
    Par conséquent, c'est un peu comme du chinois pour moi et je ne sais pas vraiment ce que je fais:
    • aucune idée pourquoi je passe par une variable. Ceci n'est certainement pas nécessaire mais c'est la méthode que j'ai trouvé dans un tuto et qui a fait que la macro (ou peut-être procédure? vu qu'on est dans This document) fonctionne.
    • exit sub n'est pas de moi. J'avais trouvé effectivement ça bizarre et je me demandais son utilité mais comme je comprends pas tout... j'ai bêtement copié le code fourni... Est-ce qu'il faudrait que je supprime le paragraphe "sortir si aucun document ouvert"?
    • je n'ai certainement pas besoin de tout ce code car par exemple, je n'utilise aucune figure. Les seules choses que j'ai besoin de mettre à jour par macro sont table des matières, entêtes et corps de texte. Le problème est que je ne sais pas quoi supprimer et quoi garder pour que ça continue de marcher. J'avais une macro beaucoup plus rapide et simple initialement mais elle ne fonctionnait pas pour les entêtes (activeDocument.Fields.Update).


    Si la macro reste un peu longue même en l'améliorant, l'idée de rajouter par code une barre d'outil au ruban me plaît bien (c'était ce que j'avais essayé de faire sans code dans l'étape 3 avant de passer au userform mais le bouton n'était pas disponible lors du changement d'utilisateur). Comment fait-on ça? Existerait-il un tuto quelque part?
    PS: merci Eric pour le lien, j'ai regardé mais le lien indique comment créer un bouton dans le ruban et il ne me semble pas que cela réponde au besoin de générer automatiquement le bouton dans le ruban des autres utilisateurs du document.

    Autre idée: au lieu de passer par une macro pour mettre à jour les champs, il est peut-être possible de donner aux contrôles de contenu les mêmes fonctionnalités que les propriétés de document pré-établies = changement dans n'importe quel répétition du champs/signet qui se reporte automatiquement et instantanément dans les autres même les entêtes. J'ai beaucoup de signets différents (au moins une quinzaine) donc je ne sais pas si cela pourrait être réalisé simplement.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Clairemouth Voir le message
    je n'ai certainement pas besoin de tout ce code car par exemple, je n'utilise aucune figure. Les seules choses que j'ai besoin de mettre à jour par macro sont table des matières, entêtes et corps de texte. Le problème est que je ne sais pas quoi supprimer et quoi garder pour que ça continue de marcher. J'avais une macro beaucoup plus rapide et simple initialement mais elle ne fonctionnait pas pour les entêtes (activeDocument.Fields.Update).

    Eh bien, mettez là en ligne.

    Si la macro reste un peu longue même en l'améliorant, l'idée de rajouter par code une barre d'outil au ruban me plaît bien (c'était ce que j'avais essayé de faire sans code dans l'étape 3 avant de passer au userform mais le bouton n'était pas disponible lors du changement d'utilisateur). Comment fait-on ça? Existerait-il un tuto quelque part?
    PS: merci Eric pour le lien, je vais regarder ça (mon document est bien un .docm, pas de problème)

    Avant de vous engager dans du code, testez d'abord la solution dans la barre d'accès rapide, c'est enfantin.
    Nb : La macro reliée au bouton ne doit pas contenir de paramètres.


    Autre idée: au lieu de passer par une macro pour mettre à jour les champs, il est peut-être possible de donner aux contrôles de contenu les mêmes fonctionnalités que les propriétés de document pré-établies = changement dans n'importe quel répétition du champs/signet qui se reporte automatiquement et instantanément dans les autres même les entêtes. J'ai beaucoup de signets différents (au moins une quinzaine) donc je ne sais pas si cela pourrait être réalisé simplement.
    Regardez la réponse concernant la mise en place de renvois dans ce message : https://www.developpez.net/forums/d2.../#post11635314

  10. #10
    Membre à l'essai
    Femme Profil pro
    Chef de projet production clinique
    Inscrit en
    Octobre 2020
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chef de projet production clinique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Octobre 2020
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Je suis désolée mais cette fois-ci, les réponses apportées ne m'aident pas vraiment:
    Comme indiqué dans mes posts précédents, j'avais déjà réussi à créer un bouton dans mon ruban pour lancer la macro depuis mon ordinateur. J'avais procédé de cette façon. Le problème est que ce bouton disparaît lorsque le document est utilisé par d'autres utilisateurs. Est-ce que vous avez une solution pour que les autres utilisateurs aient ce bouton également sans faire cette manipulation sur leur ordinateur?

    Je ne vois pas trop quelles solutions m'apportent votre message sur la mise en place de renvois. Si c'est faire F9 pour la mise à jour, cela n'est pas une solution:
    1) Ce cahier des charges vierge est destiné à être utilisé par de nombreuses personnes en interne et en externe pour générer un cahier des charges par projet. La plupart des utilisateurs ne connaisse pas le raccourci F9 ou alors, il faudrait que je mette un commentaire dans mon document.
    2) Cela ne met pas à jour les entêtes.


    Comme demandé, voici le code plus simple qui est dans ThisDocument du projet du cahier des charge vierge. Il fonctionne bien mais l'absence de mise à jour des entêtes reste un problème :

    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
    Public WithEvents App As Word.Application
     
    Private Sub App_DocumentBeforeSave(ByVal doc As Document, SaveAsUI As Boolean, Cancel As Boolean)
     
    'MAJ Champs corps de texte
    ActiveDocument.Fields.Update
    'MAJ Table des matières
        For t = 1 To ActiveDocument.TablesOfContents.Count
            ActiveDocument.TablesOfContents(t).Update
        Next
     
    End Sub
     
    Private Sub Document_Open()
        Set App = Word.Application
    End Sub

  11. #11
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Perso, plutôt que de créer une usine à gaz pour combler les lacunes des utilisateurs, il me semblerait plus utile de former les utilisateurs à l'outil. Je sais bien que tu n'aimeras pas que je dise cela, mais c'est pourtant, à mon sens, le B.A-BA de l'utilisation d'un outil comme Word, SURTOUT lorsque tu le dis toi-même, tu es débutante en programmation VBA...

    Je ne comprendrai jamais que l'on préfère du code mal ficelé (pas d'attaque personnelle dans mes propos mais bien un simple constat) à la connaissance raisonnable d'un outil, surtout aussi largement utilisé que Word. Je pense sincèrement qu'aucun code VBA n'égalera ce qui a été pensé par les concepteurs de Word.

    Après, si tu aimes le compliqué, il va falloir respecter les règles de programmation VBA, découper ton truc en petits modules testables et essayer de ne pas compliquer l'utilisation par des userforms non modaux qui sont vraiment délicats à manipuler.

    je ne plus trop le temps car je démarre une réunion, mais je vais suivre l'évolution de ce post.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  12. #12
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Clairemouth Voir le message

    Je suis désolée mais cette fois-ci, les réponses apportées ne m'aident pas vraiment:
    Comme indiqué dans mes posts précédents, j'avais déjà réussi à créer un bouton dans mon ruban pour lancer la macro depuis mon ordinateur. J'avais procédé de cette façon. Le problème est que ce bouton disparaît lorsque le document est utilisé par d'autres utilisateurs. Est-ce que vous avez une solution pour que les autres utilisateurs aient ce bouton également sans faire cette manipulation sur leur ordinateur?
    Votre bouton a été placé sur votre Normal.dot et pas sur le document. Vous n'avez pas suivi strictement mon mode opératoire. Dans la liste déroulante de droite, il faut aller chercher votre document. Si votre document n'apparaît pas dans la liste déroulante, c'est parce que votre document est issu d'un .doc. Voir la méthode décrite dans mon précédent mail.


    Je ne vois pas trop quelles solutions m'apportent votre message sur la mise en place de renvois. Si c'est faire F9 pour la mise à jour, cela n'est pas une solution:
    1) Ce cahier des charges vierge est destiné à être utilisé par de nombreuses personnes en interne et en externe pour générer un cahier des charges par projet. La plupart des utilisateurs ne connaisse pas le raccourci F9 ou alors, il faudrait que je mette un commentaire dans mon document.
    2) Cela ne met pas à jour les entêtes.
    Là encore, vous n'avez pas tout lu. Une combinaison de touches peuvent être simulées également par VBA, éventuellement l'enregistreur de macro peut vous apporter la réponse.


    Comme demandé, voici le code plus simple qui est dans ThisDocument du projet du cahier des charge vierge. Il fonctionne bien mais l'absence de mise à jour des entêtes reste un problème :
    Compte tenu des problèmes que mes réponses génèrent, je ne souhaite pas vous embrouiller plus, ce serait contre productif pour votre entreprise.

    Bon courage pour la suite.

  13. #13
    Membre à l'essai
    Femme Profil pro
    Chef de projet production clinique
    Inscrit en
    Octobre 2020
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chef de projet production clinique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Octobre 2020
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Je ne cherche pas à faire compliqué. Je n'ai peut-être pas compris vos réponses:
    Quelle solution proposez-vous pour mettre à jour les champs dans les entêtes?

  14. #14
    Membre à l'essai
    Femme Profil pro
    Chef de projet production clinique
    Inscrit en
    Octobre 2020
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chef de projet production clinique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Octobre 2020
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    J'ai réessayé de créer le bouton dans le ruban comme indiqué dans le tuto du lien. J'ai bien suivi pas à pas à l'identique. A la fin de la procédure, j'ai une fenêtre qui apparaît avec le message:
    "L'emplacement sur le serveur des fichiers préliminaires que vous avez entré pour l'édition en mode hors connexion n'est pas valide ou vous n'êtes pas autorisé à y accéder. Spécifiez un emplacement sur votre ordinateur local."
    Je clique sur OK et je mets "C:\Users\CGL\Desktop\ " C'est certainement à cause ça que cela fonctionne sur mon ordinateur mais dès que j'envoie le document par email et que je l'ouvre (lecture seule), le bouton n'apparaît plus.

    Pour essayer d'apprendre et d'améliorer la macro de mise à jour des champs afin qu'elle prenne en compte les entêtes, j'ai essayé avec l'enregistreur comme vous me l'avez conseillé. Lorsque l'enregistrement est activé, je n'arrive pas à double cliquer pour aller dans les entêtes. Est-ce normal?

  15. #15
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Je te propose ce qui suit, qui vaut ce que ça vaut.

    A l'ouverture du document, on crée une barre de commande munie de son bouton qui permettra d'actualiser les signets;
    On gère un objet Application avec les évènements pour masquer la barre lorsque l'on passe sur un autre document et l'afficher à nouveau lorsque l'on revient sur le document souhaité.


    Voici le code à placer dans un module standard pour créer et supprimer la barre. Pour faire simple, j'y ai mis le code qui sera appelé par clic sur le bouton. Il me semble que le code se lit "tout seul" et a peu besoin d'explications. Tu devras adapter bien évidemment à ton cas pour l'appel de la fonction "qui fait le job" et pour le coeur de celle-ci, bien évidemment.

    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
    Option Explicit
     
    Sub AddCommandBar()
      Dim cb As CommandBar
      Dim Button As CommandBarButton
     
      DeleteBar
      Set cb = ThisDocument.CommandBars.Add("MyBar")
      Set Button = cb.Controls.Add(msoControlButton)
      With Button
        .Caption = "Actualiser signets"
        .OnAction = "ActualizeBookmarks"
        .Style = msoButtonCaption
        .Visible = True
      End With
      cb.Visible = True
    End Sub
     
    Sub DeleteBar()
      Dim i As Long: i = 1
      Dim Found As Boolean
     
      Do While i <= CommandBars.Count And Not Found
        If CommandBars(i).Name = "MyBar" Then
          CommandBars(i).Delete
          Found = True
        End If
        i = i + 1
      Loop
    End Sub
     
    Sub ActualizeBookmarks()
      MsgBox "Les signets ont été actualisés"
    End Sub

    Dans le module ThisDocument, on place le code suivant. Tu remarques que l'on va travailler avec un objet Word.Application variabilisé, car on doit pouvoir en gérer les évènements (WithEvents). Ici aussi, je pense que le code se passe de commentaires.
    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
    Option Explicit
     
    Dim WithEvents App As Word.Application
     
    Private Sub App_WindowActivate(ByVal Doc As Document, ByVal Wn As Window)
      If Doc.Name = "bouton.docm" Then
        CommandBars("mybar").Visible = True
      Else
        CommandBars("mybar").Visible = False
      End If
    End Sub
     
    Private Sub Document_Close()
      DeleteBar
    End Sub
     
    Private Sub Document_Open()
      Set App = Word.Application
      AddCommandBar
    End Sub

    Remarque que déclarer App avec WithEvents te permet de gérer tous les évènements de l'application.

    Nom : 2020-10-29_154150.png
Affichages : 133
Taille : 71,2 Ko


    Une autre technique serait d'ajouter un ruban personnalisé dans le document. C'est un peu plus "touchy" mais ça peut être une orientation intéressante pour soulager le code VBA.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  16. #16
    Membre à l'essai
    Femme Profil pro
    Chef de projet production clinique
    Inscrit en
    Octobre 2020
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chef de projet production clinique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Octobre 2020
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Merci beaucoup pour cette solution. J'ai mis du temps à répondre car j'ai eu des soucis avec la fibre internet depuis.
    Encore merci de votre aide

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

Discussions similaires

  1. [XL-2013] Userform non modal et Refedit: la sélection reste bloquée
    Par V.I.T.R.I.O.L. dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 04/06/2015, 14h59
  2. Pb référence / userform non-modal
    Par DARKALANE dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 01/09/2009, 21h03
  3. [Toutes versions] Userform non modal = plantage d'excel
    Par youn1096 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 14/05/2009, 16h39
  4. [E-02] Comment garder un Userform non Modal affiché ?
    Par Frutchy dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 23/12/2008, 02h36
  5. UserForm non modal mais arrêtant la macro
    Par oohcalme dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/11/2008, 11h11

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