La semaine est presque terminée. Il est temps de faire quelques progrès. Veuillez copier le code suivant dans un module standard dans une copie de votre document avec les bios de test.
Option Explicit
Enum Ncb ' Context button
' 27 Jul 2017
NcbCap
NcbCmd
NcbEvaluate = 0
NcbApprove
NcbReject
NcbHold
NcbReport
NcbA = 80
NcbH = 87
NcbR = 97
NcbRep = 720
End Enum
Private Sub DelContextControl()
' 06 Oct 2016
' ===================================================
' Use this sub to DELETE the context control
' ===================================================
Dim Doc As Document
Dim Ctl As CommandBarControl
Dim Del As Boolean
Set Doc = ActiveDocument
CustomizationContext = Doc
Do
Set Ctl = CommandBars("Text").Controls(1)
Del = (Ctl.Tag = BtnSpecs(NcbEvaluate, NcbCap))
If Del Then Ctl.Delete
Loop While Del
End Sub
Private Sub TestSet()
' ===================================================
' Use this sub to SET the context control
' ===================================================
SetContextControl ActiveDocument
End Sub
Sub SetContextControl(Doc As Document)
' 27 Jul 2017
Dim Cbar As CommandBar
Dim Bctl As CommandBarControl
Dim Fid As Variant
Dim i As Long
CustomizationContext = Doc
Set Cbar = CommandBars("Text")
Set Bctl = Cbar.Controls(1)
If Not (Bctl.Tag = BtnSpecs(NcbEvaluate, NcbCap)) Then
Set Bctl = Cbar.Controls.Add(msoControlPopup, , , 1)
With Bctl
.Caption = BtnSpecs(NcbEvaluate, NcbCap)
.Tag = BtnSpecs(NcbEvaluate, NcbCap)
.BeginGroup = True
Fid = Array(NcbA, NcbR, NcbH, NcbRep)
For i = NcbApprove To NcbReport
With .Controls.Add(Type:=msoControlButton)
.Caption = BtnSpecs(i, NcbCap)
.FaceId = Fid(i - NcbApprove)
.OnAction = BtnSpecs(i, NcbCmd)
End With
Next i
End With
End If
End Sub
Private Function BtnSpecs(Bid As Ncb, _
Cid As Ncb) As String
' 27 Jul 2017
Dim Specs As String
Select Case Cid
Case NcbCap
Specs = "Evaluate Bios,Approve,Reject,Hold,Report"
Case NcbCmd
Specs = ",Approve,Reject,Hold,Report"
End Select
BtnSpecs = Split(Specs, ",")(Bid)
End Function
Sub Approve()
' 27 Jul 2017
WriteComment NcbApprove
End Sub
Sub Hold()
' 27 Jul 2017
WriteComment NcbHold
End Sub
Sub Reject()
' 27 Jul 2017
WriteComment NcbReject
End Sub
Private Sub WriteComment(TxtId As Ncb)
' 27 Jul 2017
ActiveDocument.Comments.Add Selection.Range, UCase(BtnSpecs(TxtId, NcbCap))
End Sub
Sub Report()
' 27 Jul 2017
MsgBox "Create the report"
End Sub
Maintenant, exécutez la procédure TestSet
(F5). Cette procédure appelle simplement le sous SetContextControl
. C'est "Test" parce que peut-être vous trouverez un meilleur moyen dans le futur. Je n'aime pas l'utilisation de ActiveDocument
(peut faire beaucoup de dégâts si exécuté sur le mauvais document), et je n'aime pas que les utilisateurs courent en appuyant sur F5.
Cette procédure ajoutera un contrôle au menu contextuel du contenu d'ActiveDocument, c'est-à-dire son corps (sans les en-têtes et pieds de page). Si, pour une raison quelconque, vous souhaitez supprimer le contrôle, exécutez le sous-DelContextControl
. Notez que le contrôle est disponible dans le document où il est installé uniquement, pas dans l'application. Si vous voulez qu'il reste dans le document, vous devez l'enregistrer.
Le menu contextuel est disponible avec le bouton droit de la souris lorsque vous êtes dans sa portée, c'est-à-dire dans le corps du document. Lorsque vous faites un clic droit tout en opérant ailleurs, vous aurez un menu contextuel différent. Le contrôle que le code ajoute est le premier dans le menu. Il s'appelle "Évaluer les Bios". Notez que tout sur ce contrôle est négociable. Tout est dans le code. Tout cela peut être modifié à votre goût ou vos exigences.
Le contrôle est de type popup, ce qui signifie qu'il ouvre une liste déroulante à sa droite. Là, vous pouvez sélectionner "Approuver", "Rejeter", "Attente" ou "Rapport".Lorsque vous cliquez sur l'un des trois premiers choix, un commentaire sera ajouté avec le contenu indiqué. Lorsque vous cliquez sur le quatrième bouton, la prochaine tâche vous sera rappelée.
Parole attache des commentaires à un Range
. Le code utilise le Selection.Range
à cette fin. Ainsi, vous pouvez sélectionner le titre de la bio ou l'identifiant unique avant d'insérer le commentaire. Si vous ne faites pas attention à votre sélection, vous pouvez joindre le commentaire à la mauvaise bio. C'est un domaine qui pourrait être amélioré.
Un autre domaine concerne la question des commentaires multiples. Étant donné que les commentaires identifient le commentateur, vous pouvez en fait avoir plusieurs commentaires. Sinon, vous pouvez vous assurer qu'un seul commentaire existe pour chaque bio. Ce problème a été traité par StackOverflow: in VBA (word) how do I add a comment to a range only if no comments exist?
En fonction de votre flux de travail, vous devrez peut-être diviser votre document en sections, une bio par section. J'espère que ce ne sera pas nécessaire, mais si c'est le cas, c'est quelque chose qui pourrait être fait lors de la préparation du document pour commenter, peut-être en même temps que le contrôle du contexte est installé.
De même, peut-être supprimé le contrôle de contexte par le même code qui crée le rapport. Cela implique de créer un document (peut-être à partir d'un modèle, peut-être à partir de zéro), de boucler tous les commentaires dans le document de test, de compter leur nature et d'écrire le résultat dans le nouveau document de rapport. Ce n'est pas difficile, mais c'est un autre jour de travail.
BTW, je ne me souviens que vous avez rejeté l'idée d'utiliser des commentaires. Si la facilité d'utilisation ne vous convainc pas de ce système, veuillez rechercher les fonctions fournies par Word pour masquer et afficher les commentaires. Mais même si cela ne vous convainc pas, la même macro qui crée le commentaire pourrait faire quelque chose de très différent, ce qui signifie que la facilité d'utilisation fournie par le menu contextuel pourrait être maintenue. Les possibilités ne manquent pas, mais pour que l'intervenant puisse voir l'association entre bio et évaluation aussi immédiatement que le commentaire Word, il faudrait beaucoup plus de programmation que ce que vous voyez ci-dessus.
Ceci est un grand projet. Je ne sais pas comment offrir de l'aide sans m'engager. Par conséquent, je dois m'abonner à votre solution avant de proposer de l'aide. Veuillez décrire l'apparence du résultat. Est-ce que chaque bio du document aura une liste déroulante? Le résultat, avec les commentaires sélectionnés, sera-t-il imprimé? Les valeurs à additionner seront-elles affichées (par exemple, Approve = 3, Hold = 1, Delete = 0)? Comment et où le total sera-t-il montré? – Variatus
Considérez les alternatives suivantes. (A) Utilisez Word "Commentaires" au lieu de contrôles de contenu. Vous pourriez les semi-automatiser en quelque sorte. (B) Utilisez un seul contrôle de contenu pour apparaître à côté de la sélection en cours, écrivez le résultat dans un "document de rapport" séparé et colorez la sélection pour montrer que c'est fait. (C) Créez un formulaire utilisateur dans lequel vous pouvez appeler bios, un à la fois, avec les boutons Suivant et Précédent si vous le souhaitez, et écrivez le commentaire soit sur le document (texte ou commentaire) ou sur un "doc. – Variatus
Chaque bio aura une liste déroulante, mais rien ne devra être imprimé. Les valeurs derrière les étiquettes n'auront pas besoin d'être affichées; le but principal de ceci est de créer une table/Excel qui montre la sélection pour chaque bio et compte le nombre de chaque sélection. Actuellement, la pratique consiste à ajouter manuellement un commentaire à l'identifiant unique de chaque bio, puis à les saisir manuellement dans un fichier Excel séparé. Je ne suis pas contre l'utilisation de commentaires tant que l'objectif final peut être atteint, mais je ne suis pas sûr de savoir comment cela pourrait fonctionner. –