Word-VBA-为什么会出现运行时错误451“;未定义属性Let过程,且属性Get过程未返回对象";?

Word-VBA-为什么会出现运行时错误451“;未定义属性Let过程,且属性Get过程未返回对象";?,vba,ms-word,Vba,Ms Word,尽管给我一个运行时错误451“Property Let Procedure Not Defined And Property Get Procedure Not Return Object”,下面的代码还是成功地工作了 调试器将oCC.Range.Style(“占位符文本”).Font标记为罪魁祸首 我需要对占位符文本应用样式,以便在输入或删除值时不会重置占位符文本 少了什么 Dim oTable As Table Dim ocell As Cell Dim oCC As ContentCont

尽管给我一个运行时错误451“Property Let Procedure Not Defined And Property Get Procedure Not Return Object”,下面的代码还是成功地工作了

调试器将oCC.Range.Style(“占位符文本”).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

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

ContentControls不是这样工作的。如前所述,占位符文本在设计上是临时的。您可以在占位符文本存在时对其应用格式,但一旦文本消失,就可以对其应用格式

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


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

很抱歉,这在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>
但这只会更改输入文本的外观,而不会更改占位符文本。这与在“内容控件属性”对话框中设置样式相同。以下是运行该对话框后的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>

下面是我关于编辑OOXML的文章:

所以我不知怎么搞明白了


将下面的
与ActiveDocument.Styles(“占位符文本”).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
然后,在我的例子中,对于文档中的每个后续占位符文本,我可以分别使用带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

您是否打算将
与oCC.Range.Font
一起使用?猜一猜。不,我需要将样式应用于占位符文本,以便它不会重置为默认样式
与ActiveDocument.style(“占位符文本”).Font
可以工作,但它设置了整个文档的样式,而不仅仅是一个单元格。我希望在整个文档中有不同的占位符文本样式。您必须将新样式应用于oCC.Range或将字体属性设置为oCC Range。
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
    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