2017-08-08 1 views
2

J'ai créé un programme Visual Basic pour Applications dans Microsoft Word (2016, 64bit, Windows 10)Renseignez les zones de texte ContentControl MS-Word à partir des zones de texte UserForm avec le même nom/tag?

Il se compose d'un UserForm avec environ 30 TextBoxes et un bouton d'envoi. Chaque TextBox a un nom et un tag uniques.

J'ai également le même nombre de zones de texte ContentControl dans le document Word, chacune d'entre elles ayant le même titre et la même balise que la zone de texte UserForm correspondante. Qu'est-ce que je suis après est un meilleur moyen de remplir les zones de texte du document à partir des UserForm TextBoxes lorsque l'utilisateur clique sur soumettre. Je le fais actuellement en tapant 3 lignes de code pour chaque TextBox, mais c'est fastidieux. Je copie et colle les 3 lignes de code à chaque fois mais je dois éditer une petite partie de chaque ligne à chaque fois.

J'ai pensé utiliser une boucle, comme indiqué dans le code ci-dessous, où j'utilise une variable x pour copier le TextBox par son nom, mais je ne sais pas comment procéder.

Dim doc As Document 
Dim ccs As ContentControls 
Dim cc As ContentControl 
Set doc = ActiveDocument 

For … 
' Somehow find each text box, put the name of one into variable x then 

    Set ccs = doc.SelectContentControlsByTag(x) 
    Set cc = ccs(1) 
    cc.Range.Text = x.Text 

Next 

Merci d'avance!

Répondre

1

Toutes les zones de texte sont stockés dans une classe de formes que vous pouvez accéder à ceci:

Sub Test() 
Dim shape As Shape 
Dim str As String 

For Each shape In ActiveDocument.Shapes 
    str = "My name is " & shape.Name 
    str = str & " My EditID is " & shape.EditID 
    shape.TextFrame.TextRange.Text = str 
Next 
End Sub 

Vous devez nommer vos zones de texte afin que vous puissiez les identifier comme zones de texte, vous pouvez vérifier si ce sont des zones de texte avant de leur écrire.

+0

Je viens Réécriture de la question. J'espère que c'est mieux! Si vous pensez que c'est le cas et que vous voulez le faire, s'il vous plaît n'hésitez pas! Merci! Vous m'avez déjà aidé à le comprendre, mais je voulais le rendre meilleur au cas où quelqu'un d'autre aurait besoin d'aide dans le futur! Merci aussi de m'avoir sauvé autant d'heures! – James

1

Les TextBoxes UserForm sont accessibles via la classe Controls, tandis que les documents zones de texte ContentControl sont accessibles via la propriété ContentControls ou la fonction SelectContentControlsByTag.

Il n'est pas nécessaire de nommer spécialement les zones de texte car elles sont facilement discernables par type.


Une solution consiste à boucle à travers les ContentControls appropriés et copier par nom/titre:

Private Sub cmdSubmit_Click() 

    Dim cc As Word.ContentControl 

    For Each cc In Word.ActiveDocument.ContentControls 
    If cc.Type = Word.WdContentControlType.wdContentControlText Then 
     cc.Range.Text = Me.Controls(cc.Title).Text 
    End If 
    Next cc 

End Sub 

Si vous utilisez ContentControls de texte riche, alors vous devez remplacer wdContentControlText avec wdContentControlRichText.


Une autre solution consiste à boucle à travers les appropriés TextBoxes et copie par tag:

Private Sub cmdSubmit_Click() 

    Dim doc As Word.Document 
    Dim cc As Word.ContentControl 
    Dim c As MSForms.Control 

    Set doc = Word.ActiveDocument 
    For Each c In Me.Controls 
    If TypeName(c) = "TextBox" Then 
     Set cc = doc.SelectContentControlsByTag(c.Tag)(1) 
     cc.Range.Text = c.Text 
    End If 
    Next c 

End Sub 
+0

Je viens de réécrire la question. J'espère que c'est mieux! Si vous pensez que c'est le cas et que vous voulez le faire, s'il vous plaît n'hésitez pas! Merci! Je l'ai déjà compris mais je voulais le rendre meilleur au cas où quelqu'un d'autre aurait besoin d'aide! – James