3

我正在编写一个 Excel VBA 宏来将MS Word 表单翻译成各种语言。原始英语短语列在 A 列中,相应的翻译列在列 B、C 等中。在表格的文本部分中用英语替换翻译没有问题,但我正在努力更改占位符文本内容控制。(我应该提到我仅限于使用 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 中运行它,因为我将在其中列出多个翻译。

4

1 回答 1

0

这是该方法的“奇怪之处” SetPlaceholderText。我不记得我曾经见过它表现得如此的原因,但以下内容对我有用。

评论:

它仅在设计模式打开时才对我有效,因此我在示例代码中对其进行了更改。

SetPlaceholderText如果指定了所有参数,则仅适用于“父”文档之外。传递给它们的值可以是未定义的 ( 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
于 2018-12-04T12:54:09.607 回答