#1
|
|||
|
|||
Delete or merge Content controls with the same name
Can you please suggest how to check whether CCs with the same name have the same values?
If yes, delete one of the CCs, if different values - merge values in one CC. |
#2
|
||||
|
||||
You cannot merge content controls - you'd have to move the content from one to the other, then delete the one you move the content from. The approach you'd take for this depends in part on whether the content controls have the same title, or different titles.
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
#3
|
||||
|
||||
Paul has identified the flaw in your requirement, however you may find http://www.gmayor.com/BookmarkandVariableEditor.htm (Content Control Editor Version) useful in identifying similarly named content controls and as an aid to changing their values, and/or deleting unwanted controls.
If you want controls to duplicate values in controls in different parts of the document, then the controls should be mapped and cross referenced. This will do that also.
__________________
Graham Mayor - MS MVP (Word) (2002-2019) Visit my web site for more programming tips and ready made processes www.gmayor.com |
#4
|
|||
|
|||
macropod, gmayor, thank you, I meant the same title.
As an example, two situations I am talking about: 1. Both CCs have title "A" and the same content "Apple". In this case the macro should delete one of the CCs. 2. Both CCs have title "A" but the content of one of the two is "Apple" while of the second is "Orange". In this case the both contents are merged as "Apple, Orange" and moved to one of the CCs, the second is deleted. Is it possible? |
#5
|
||||
|
||||
Try something based on:
Code:
Sub Demo() Dim i As Long, StrTtl As String, StrTxt As String StrTtl = "MyTitle": StrTxt = "|" With ActiveDocument On Error Resume Next For i = .SelectContentControlsByTitle(StrTtl).Count To 2 Step -1 With .SelectContentControlsByTitle(StrTtl)(i) If InStr(StrTxt, "|" & Trim(.Range.Text) & "|") > 0 Then .Range.Text = vbNullString .LockContentControl = False .Delete ElseIf .ShowingPlaceholderText = True Then .Delete Else StrTxt = "|" & Trim(.Range.Text) & StrTxt .Range.Text = vbNullString .LockContentControl = False .Delete End If End With Next With .SelectContentControlsByTitle(StrTtl)(1).Range StrTxt = Replace(StrTxt, "|" & Trim(.Text), "") StrTxt = Left(StrTxt, Len(StrTxt) - 1) StrTxt = Replace(StrTxt, "|", ", ") .Text = Trim(.Text) & StrTxt End With End With End Sub
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
#6
|
|||
|
|||
Thank you, it works as expected for a single title of CCs.
When I try to adapt the code for an array of names (I need to check about 20 differently named CCs and their duplicates) using cycle For ... Next, the result is dissapointing. For example, for two CCs named "A" with contents "1" and "2" and CCs named "B" with contents "3" and "4" the result is CCs "A" with content "12" and "B" with "3, 412". And it is expect "A" with "1, 2" and "B" with "3, 4". What is wrong? Here is the code I have used: Code:
Sub Demo() Dim i, j As Long, StrTtl As String, StrTxt As String, CCnames CCnames = Array("A", "B"): StrTxt = "|" For j = 0 To UBound(CCnames) With ActiveDocument On Error Resume Next For i = .SelectContentControlsByTitle(CCnames(j)).Count To 2 Step -1 With .SelectContentControlsByTitle(CCnames(j))(i) If InStr(StrTxt, "|" & Trim(.Range.Text) & "|") > 0 Then .Range.Text = vbNullString .Delete ElseIf .ShowingPlaceholderText = True Then .Delete Else StrTxt = "|" & Trim(.Range.Text) & StrTxt .Range.Text = vbNullString .Delete End If End With Next With .SelectContentControlsByTitle(CCnames(j))(1).Range StrTxt = Replace(StrTxt, "|" & Trim(.Text), "") StrTxt = Left(StrTxt, Len(StrTxt)) StrTxt = Replace(StrTxt, "|", ", ") .Text = Trim(.Text) & StrTxt End With End With Next |
#7
|
||||
|
||||
Quote:
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
#8
|
|||
|
|||
Quote:
Now the code works as expected Code:
Sub Demo() Dim i, j As Long, StrTtl As String, StrTxt As String, CCnames CCnames = Array("A", "B", "C"): StrTxt = "|" For j = 0 To UBound(CCnames) With ActiveDocument On Error Resume Next For i = .SelectContentControlsByTitle(CCnames(j)).Count To 2 Step -1 With .SelectContentControlsByTitle(CCnames(j))(i) If InStr(StrTxt, "|" & Trim(.Range.Text) & "|") > 0 Then .Range.Text = vbNullString .Delete ElseIf .ShowingPlaceholderText = True Then .Delete Else StrTxt = "|" & Trim(.Range.Text) & StrTxt .Range.Text = vbNullString .Delete End If End With Next With .SelectContentControlsByTitle(CCnames(j))(1).Range StrTxt = Replace(StrTxt, "|" & Trim(.Text), "") StrTxt = Left(StrTxt, Len(StrTxt) - 1) StrTxt = Replace(StrTxt, "|", ", ") .Text = Trim(.Text) & StrTxt StrTxt = "|" End With End With Next End Sub |
#9
|
||||
|
||||
All you needed to do was move 'StrTxt = "|"' to follow the line:
For j = 0 To UBound(CCnames)
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
#10
|
|||
|
|||
Indeed, thank you!
|
Tags |
content controls |
|
Similar Threads | ||||
Thread | Thread Starter | Forum | Replies | Last Post |
Macro to save docx to doc that checks compatibility and converts content controls to static content. | staicumihai | Word VBA | 4 | 10-12-2016 08:23 PM |
Bookmark content controls | silverspr | Word VBA | 24 | 06-14-2016 05:19 AM |
VBA for content controls | ciresuark | Word VBA | 1 | 03-10-2015 03:14 PM |
Content Controls | Sammie0Sue | Word | 6 | 11-06-2013 10:56 PM |
Grouping Content Controls | cksm4 | Word VBA | 2 | 03-01-2011 12:46 PM |