【问题标题】:Word- VBA- Why do I get a Run Time Error 451 "Property Let Procedure Not Defined And Property Get Procedure Did Not Return Object"?Word-VBA-为什么我会收到运行时错误 451“未定义属性让过程且属性获取过程未返回对象”?
【发布时间】:2020-12-04 00:12:29
【问题描述】:

尽管给了我一个运行时错误 451“Property Let Procedure Not Defined And Property Get Procedure Did Not Return Object”,但以下代码成功运行。

调试器将With oCC.Range.Style("Placeholder Text").Font 标记为罪魁祸首。

我需要对占位符文本应用一种样式,以便在输入或删除值时它不会重置。

缺少什么?

Dim oTable As Table
Dim ocell As Cell
Dim oCC As ContentControl
Dim oNewRow As Row
    Set oTable = ActiveDocument.Tables(1)
    Set oNewRow = oTable.Rows.Add
    Set ocell = oNewRow.Cells(1)
    Set oCC = ActiveDocument.ContentControls.Add(wdContentControlRichText, ocell.Range)
    With oCC
        .DefaultTextStyle = "Style1"
        .Tag = "Test1"
        .Setplaceholdertext , , "test1"
        If oCC.ShowingPlaceholderText Then
             With oCC.Range.Style("Placeholder Text").Font
                                    
                   .Name = "Arial"
                   .Size = 8
                   .ColorIndex = wdRed
                   .Italic = True
            End With
        End If
    End With

【问题讨论】:

  • 您的意思是使用With oCC.Range.Font 吗?一个猜测。
  • 不,我需要对占位符文本应用样式,这样它就不会重置为默认样式
  • With ActiveDocument.Styles("Placeholder Text").Font 有效,但它设置了整个文档的样式,而不仅仅是一个单元格。我想在整个文档中使用不同的占位符文本样式
  • 您要么必须为 oCC.Range 应用新样式,要么设置 oCC 范围的字体属性。

标签: vba ms-word


【解决方案1】:

“我需要为占位符文本应用一种样式,以便在输入或删除值时不会重置它。”

这不是 ContentControls 的工作方式。正如之前向您解释过的,占位符文本在设计上是临时的。您可以在它存在时对其应用格式,但一旦文本消失,您应用的格式也会随之消失。

如果替换占位符文本的文本被删除,则默认格式“占位符文本”样式将应用于内容控件之后显示的任何占位符文本。

如果具有不同的格式对您的项目至关重要,您唯一的选择是在 ThisDocument 模块中创建一个 ContentControlOnExit 事件,该事件需要检查退出的内容控件是否显示占位符文本,然后应用适当的格式.这将要求您找到某种方法来确定应将哪种格式应用于内容控件。

【讨论】:

    【解决方案2】:

    抱歉,VBA 无法做到这一点。对象模型不包括设置占位符样式的方法。这是未修改的富文本内容控件的 XML:

    <w:sdtContent>
        <w:p w14:paraId="13211677" w14:textId="4A21E55A" w:rsidR="00A934F5" w:rsidRDefault="00EB0426" w:rsidP="00857546">
            <w:r w:rsidRPr="00FD3EE5">
                <w:rPr>
                    <w:rStyle w:val="PlaceholderText"/>
                </w:rPr>
                <w:t>Click or tap here to enter text.</w:t>
            </w:r>
        </w:p>
    </w:sdtContent>
    

    起初我以为你可以创建一个自定义样式,然后用 VBA 应用它:

    oCC.Range.Style = "PlaceholderText1"
    

    但这只会改变输入文本的外观,不会改变占位符文本。这与在内容控件属性对话框中设置样式相同。这是运行后的 XML:

    <w:sdtContent>
        <w:p w14:paraId="0686A900" w14:textId="2CAB6B2E" w:rsidR="00A934F5" w:rsidRPr="00332D6D" w:rsidRDefault="00332D6D" w:rsidP="00332D6D">
            <w:pPr>
                <w:pStyle w:val="PlaceholderText1"/>
            </w:pPr>
            <w:r w:rsidRPr="00D90D77">
                <w:rPr>
                    <w:rStyle w:val="PlaceholderText"/>
                </w:rPr>
                <w:t>Click or tap here to enter text.</w:t>
            </w:r>
        </w:p>
    </w:sdtContent>
    

    样式已添加,但占位符样式未更改。当您键入文本时,文本以宏设置的样式显示。

    要解决此问题,请创建多个替代占位符文本样式。 (提示:不要在这些样式名称中使用空格)。然后创建相同数量的内容控件。打开文件以编辑 XML 并将“PlaceHolderText”名称替换为每个内容控件中新样式的名称。

    然后打开文档并将每个内容控件保存为 AutoText/Building Blocks。然后使用 VBA 插入那些样式化的内容控件:

    ActiveDocument.AttachedTemplate.AutoTextEntries("CCStyle1").Insert Where:=oCell.Range, RichText:=True
    

    这是我关于编辑 OOXML 的文章:OOXML Hacking: An Introduction

    【讨论】:

      【解决方案3】:

      所以我想通了。

      使用下面的With ActiveDocument.Styles("Placeholder Text").Font 为整个文档设置占位符文本框架并防止重置。

      Dim oTable As Table
      Dim ocell As Cell
      Dim oCC As ContentControl
      Dim oNewRow As Row
          Set oTable = ActiveDocument.Tables(1)
          Set oNewRow = oTable.Rows.Add
          Set ocell = oNewRow.Cells(1)
          Set oCC = ActiveDocument.ContentControls.Add(wdContentControlRichText, ocell.Range)
          With oCC
              .DefaultTextStyle = "Style1"
              .Tag = "Test1"
              .Setplaceholdertext , , "test1"
              If oCC.ShowingPlaceholderText Then
                   **With ActiveDocument.Styles("Placeholder Text").Font**       
                         .Name = "Arial"
                         .Size = 8
                         .ColorIndex = wdRed
                         .Italic = True
                  End With
              End If
          End With
      

      然后,就我而言,对于文档中的每个后续占位符文本,我可以使用With oCC.Range.Font 分别修改它们的格式,如下所示。

          Set ocell = oNewRow.Cells(2)
          Set oCC = ActiveDocument.ContentControls.Add(wdContentControlRichText, ocell.Range)
          With oCC
              .DefaultTextStyle = "Style2"
              .Tag = "test2"
              .SetPlaceholderText , , "test2"
              If oCC.ShowingPlaceholderText Then
                  **With oCC.Range.Font**
                      .Name = "Arial"
                      .Size = 12
                      .ColorIndex = wdBlack
                      .Italic = True
                  End With
              End If
          End With
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-23
        • 1970-01-01
        • 1970-01-01
        • 2021-11-10
        • 2020-01-05
        • 1970-01-01
        • 1970-01-01
        • 2015-11-04
        相关资源
        最近更新 更多