我正在使用VBA用户表单随机生成要发送到Word文档中的值,以提供有关各种数学主题的随机问题(针对我的学生)。
这似乎很好用,除了当我退出用户窗体(me.hide)并发送值并且焦点回到文档中时,每次我移动鼠标时,先前的值仍然会短暂可见。
这仅发生一瞬间。如果没有任何鼠标(或窗口滑块)活动发生,则显示正确发送的值。如果我查看另一个应用程序并在那里进行一些活动,然后返回到Word文档,则显示也很好。
值的翻转在视觉上很烦人。有没有人遇到类似的问题?
要复制:
使用ActiveX文本框和按钮创建Word文档。该按钮激活一个用户窗体,该窗体还包含一个文本框和一个将文本框值发送回文档中的文本框的按钮。
在我的情况下,当单击文档中的按钮时,表单会打开,并且值确实会返回到Word文档,但是当滚动鼠标或在窗口边缘移动滑块时,文本中的前一个值框短暂闪烁到视图中。这是来自文档按钮的代码:
Private Sub cmdOk_Click()
ThisDocument.TextBox1.Value = TextBox1.Value
Me.Hide
End Sub
我正在使用Word 2016和Windows 10。
我尝试使用“新” Word文本框,但是我不知道如何从用户表单与它们进行通信。使用“旧”文本框非常简单。
答案 0 :(得分:1)
ActiveX控件是为VBA用户窗体设计的。可以将它们插入Word文档或Excel电子表格的表面,但是它们并不总是表现最佳。另一方面,内容控件(和旧表单域)是为Word文档的表面设计的。
要写入内容控件,可以使用如下代码:
ActiveDocument.SelectContentControlsByTitle("name").Item(1).Range.Text
更接近您试图确定内容控件的方式可能是:
ActiveDocument.SelectContentControlsByTitle(TextBox1.Name).Item(1).Range.Text = TextBox1.Value
为什么这么复杂:设计内容控件的团队希望避免人们在使用书签和表单字段时遇到的问题,即名称不能在文档中重复。可以为多个内容控件使用相同的名称。因此,不可能使用Document.ContentControls(“ name”)来识别内容控件。
相反,需要使用Document.SelectContentControlByTitle
,它返回内容控件的数组。如果只有一个(或者如果只想要一个),则可以添加.Item([index])
以直接获取单个内容控件。
您可以在UserForm的文本框控件中查询其名称,而不是输入静态名称,如果这样做会使您更轻松。