我正在编写一个Excel VBA宏,以将MS Word Form转换为各种语言。原始的英语短语列在A列中,而相应的翻译则列在B列,C列等中。用表格的文本部分替换英语翻译没有问题,但是我在changing the Placeholder text中苦苦挣扎内容控件。 (我应该提一下,我只能使用Office 2010,因为这是公司仍然可以使用的功能。)
这是我的代码:
Dim frm As Word.Document, cc As ContentControl
Set frm = Documents.Open("C:\[document]", False)
If frm.FormsDesign = False Then 'make sure doc is in Design Mode
frm.ToggleFormsDesign
End If
For Each cc In frm.ContentControls
If cc.Type = 1 Then 'this is for textboxes
cc.SetPlaceholderText , , "phldr 1"
Else 'this is for all other controls: eg, drop-downs
cc.SetPlaceholderText , , "phldr 2"
End If
Next cc
运行此命令时,占位符文本(原始英语形式为“输入文本”之类的东西)会完全消失,而不会替换为预期的占位符文本。
我尝试从另一个 Word 文档(而不是从Excel)运行代码,即不是从表单本身运行代码,
但是,如果我以原始格式插入此代码(进行了适当的更改,例如将“ frm”更改为“ ThisDocument”),则可以正常工作。换句话说,当VBA模块位于同一(Word)文档中时,我可以成功使用SetPlaceholderText方法。但是我真的很想从Excel中运行它,因为这是我将列出多个翻译的地方。
答案 0 :(得分:0)
这是SetPlaceholderText
方法的“怪胎”。我不记得我曾经见过它能像以前那样工作的原因,但是以下对我有用。
备注:
仅当“设计模式”未启用时,它才对我有用,因此我在示例代码中对其进行了更改。
SetPlaceholderText
仅在指定 all 参数的情况下才能在“父”文档之外运行。传递给它们的值可以不确定(Nothing
),但是对象模型需要全部三个。
If doc.FormsDesign = True Then 'make sure doc is NOT in Design Mode
doc.ToggleFormsDesign
End If
For Each cc In doc.Contentcontrols
If cc.Type = 1 Then 'this is for textboxes
cc.SetPlaceholderText Range:=Nothing, BuildingBlock:=Nothing, Text:="phldr 1"
Else 'this is for all other controls: eg, drop-downs
cc.SetPlaceholderText Range:=Nothing, BuildingBlock:=Nothing, Text:="phldr 2"
End If
Next cc