从内容控件下拉列表中自动选择

时间:2020-06-09 20:00:32

标签: excel vba ms-word

我正在尝试根据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

2 个答案:

答案 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'之后即可。