我正在尝试根据Excel中的值从预建的MS Word模板的内容控件下拉列表中选择一个选项。我通过将命名范围与模板中的相应标签进行匹配来完成此操作。我能够获取所有的富文本,常规文本和复选框,以成功输入它们各自的值,但是当它进入下拉列表时,它会跳过它。我尝试使用与文本内容控件相同的代码,以便在没有这种运气的情况下继续进行下拉选择。 .Tag匹配所有下拉列表的命名范围...我很困惑。这是代码。同样,除了第一个ElseIf之外,所有代码均有效。
Sub Transfer()
Dim cs As Workbook
Dim wrd As Word.Application
Dim pc As Word.Document
Dim CC As ContentControl
Dim CCTag As String
Dim CStxt As String
Set cs = ThisWorkbook
Set wrd = CreateObject("Word.Application")
Set pc = wrd.Documents.Open("Template Source")
For Each CC In pc.ContentControls
On Error Resume Next
CCTag = CC.Tag
If CCTag <> "" Then
CStxt = Range(CCTag)
If CC.Type = wdContentControlRichText Or CC.Type = wdContentControlText Then
CC.Range.Text = CStxt
ElseIf CC.Type = wdContentControlComboBox Or CC.Type = wdContentControlDropdownList Then
CC.SetPlaceholderText , , CStxt
ElseIf CC.Type = wdContentControlCheckBox Then
CC.Checked = False
If CStxt = "True" Then
CC.Checked = True
ElseIf CStxt = "False" Then
CC.Checked = False
Else
CC.Checked = False
End If
End If
End If
Next CC
End Sub
答案 0 :(得分:0)
首先,建议您通过引用在变量cs
中声明的工作簿/工作表直接引用您的范围,这将确保子例程在正确的工作簿和正确的工作表上执行。
如果我正确理解了您的问题-您想将Excel范围内的一组值转移到匹配的MS Word内容控制框中-问题似乎是您使用的
CStxt = Range(CCTag)
不能将字符串类型(CStxt
)的变量分配给整个单元格范围。执行代码时,这将生成“运行时错误13:类型不匹配”。
为了使此行正常工作,我不得不将其更改为单个值/单元格引用。参见下面的示例;
CStxt = cs.Sheets(1).Range("A1")
在此示例中,单元格A1具有您想要转移到相关MS Word内容控件的值。这样可以使内容控件的显示值等于Excel值,但不会添加到列表中以允许您选择它。
您可以更改对A1的引用,以便您的命名范围是单个单元格。
答案 1 :(得分:0)
您的代码对我有用-假定每个Excel范围都引用一个单元格。但是,您的代码可以进行改进和简化:
Sub Transfer()
Dim wdApp As Word.Application, wdDoc As Word.Document, wdCC As Word.ContentControl
Dim CStxt As String
Set wdApp = CreateObject("Word.Application")
Set wdDoc = wdApp.Documents.Open("Template Source")
For Each wdCC In wdDoc.ContentControls
With wdCC
If .Tag <> "" Then
CStxt = ThisWorkbook.Names(.Tag).RefersToRange.Text
Select Case .Type
Case wdContentControlRichText, wdContentControlText
.Range.Text = CStxt
Case wdContentControlDropdownList, wdContentControlComboBox
.Type = wdContentControlText
.Range.Text = CStxt
.Type = wdContentControlDropdownList
'.SetPlaceholderText Text:=CStxt
Case wdContentControlCheckBox
If CStxt = "True" Then
.Checked = True
Else
.Checked = False
End If
End Select
End If
End With
Next
End Sub
不过,我确实想知道为什么您要修改占位符文本,而不是选择与CStxt相对应的组合框/下拉菜单项。有关更新组合框/下拉列表的简单方法,请参见代码修改。对于组合框,甚至不需要这样做-您只需将',wdContentControlComboBox'移到'wdContentControlText'之后即可。