2017-07-20 1 views
0

J'ai des documents Word 2013 contenant de 7 à plus de 100 sections de texte. Par souci de simplicité, je les appellerai bios. Objectif: fournissez une zone de liste déroulante pour chacun, avec 3 options, puis saisissez les sélections après leur choix. Je suis très nouveau à VBA et seulement apprendre par ce que je peux google. Ce que j'ai jusqu'ici est:Ajout de contrôles de contenu et récupération des sélections utilisateur

Sub AddStateDropDown() 
Dim Counter As Integer 
Dim sum As Integer 
Dim maxnumber As Integer 
sum = 0 
Counter = 1 
maxnumber = 31 

Mon document de «terrain de jeu» a 31 bios.

For Counter = 1 To maxnumber Step 1 

sum = Counter + sum 
Selection.Range.ContentControls.Add (wdContentControlDropdownList) 
Selection.ParentContentControl.Title = "Bio " & sum 
Selection.ParentContentControl.Tag = "Approval" & sum 
Selection.ParentContentControl.DropdownListEntries.Clear 
Selection.ParentContentControl.DropdownListEntries.Add Text:="Approve", _ 
    Value:="Approve" 
Selection.ParentContentControl.DropdownListEntries.Add Text:="Hold", Value _ 
    :="Hold" 
Selection.ParentContentControl.DropdownListEntries.Add Text:="Delete", _ 
    Value:="Delete" 
Next Counter 
End Sub 

Malheureusement, cela se traduit par l'erreur « Erreur d'exécution « 4605 ». Cette méthode ou propriété ne sont pas disponibles parce que la sélection actuelle couvre partiellement un contrôle de contenu en texte brut » Au meilleur de À ma connaissance, il s'agit d'une préoccupation concernant l'espace disponible pour le contrôle du contenu, mais je reçois cette erreur peu importe l'espace libre au-dessus, au-dessous ou à côté de mon curseur au démarrage de la macro.

Je suis en train de numéroter les étiquettes ou les titres de cette manière pour le décompte final - Si je comprends bien, je vais avoir besoin d'utiliser SelectContentControlsByTag ou SelectContentControlsByTitle pour récupérer les valeurs sélectionnées. Quelqu'un pourrait-il me aider à surmonter les obstacles de

1) Ajout de plusieurs contrôles de contenu différenciés, de préférence après chaque instance d'un mot ou une phrase (quelque chose pour les répandre à travers le bios)

2) Récupération informations provenant de ces contrôles de contenu

Merci d'avance! StackOverflow a été très utile pour mes nouvelles expériences VBA, mais cette fois, je suis obligé d'écrire ma propre question.

+0

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

+0

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

+0

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. –

Répondre

0

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.