将多个UserForm文本框的内容复制到剪贴板

时间:2018-03-08 19:58:47

标签: vba word-vba clipboard copy-paste

我使用包含文本框的用户窗体构建了Microsoft Word模板。我想在提交完成的用户表单时将两个文本框的数据分别复制到剪贴板中。只是为了澄清我希望每个文本框都有自己的条目进入剪贴板,以便将来轻松访问。

以下是我使用的代码,但是当我重复该过程时,它会用第二个替换剪贴板中的第一个文本框。任何帮助将不胜感激。

Sub ComandButton_click()
  Dim clipboard As MSForms.DataObject
  Set clipboard = New MSForms.DataObject

  clipboard.SetText Me.TextBox1.value
  clipboard.PutInClipboard
End Sub

编辑(附加背景):

为了访问剪贴板上的信息,我创建了一个自定义QAT。工具栏上的其中一个按钮可打开剪贴板,以便他们可以随时轻松地开始粘贴所需的名称。大多数报告涉及两个人,所以我想将两个文本框的值发送到剪贴板,就像您单独选择并复制每个名称一样。我的第一个想法是为两个文本框的值分配键盘快捷键,但我决定使用剪贴板选项卡。

1 个答案:

答案 0 :(得分:0)

鉴于你告诉我们的内容,我猜你正在调用 Office剪贴板。这与Windows剪贴板不同,后者是您的代码所使用的。 Office剪贴板不向开发人员公开(仅供内部使用,仅供MS使用)。有一种方法可以提供信息,但我不确定它是多么可靠; YMMV(您的里程可能会有所不同)。

UserForm的代码,用于调用负责编写信息的过程:

PutContentOnOfficeClipboard Me.[textBoxName].Value
PutContentOnOfficeClipboard Me.[textBoxName].Value

该过程将文本写入文档的末尾,将其复制,然后再次删除。在我的测试中,这一切都显示在Office剪贴板上:

Sub PutContentOnOfficeClipboard(s As String)
  Dim rng As word.Range

  Set rng = ActiveDocument.Content
  rng.Collapse wdCollapseEnd
  rng.Text = s
  rng.Copy
  rng.Delete
End Sub

如果结果不可靠,那么你需要一种不同的方法。以下是关于替代方法的一些想法......

任务窗口是最佳的,因为它使信息可见的用户。遗憾的是,VBA开发人员无法使用任务窗格。它们可以在VSTO解决方案或Office-JS解决方案中使用,但这可能比您愿意/能够投入到项目中的工作量更大(陡峭的学习曲线,企业部署要求等)。

除了键盘快捷键(除了任何可见界面之外,它还不错):

  • QAT或功能区上的下拉列表
  • QAT或功能区上的两个按钮
  • 使用两个控件修改右键单击(上下文)菜单,您可以根据需要将名称写入其中。 (需要回调宏来进行动态更新)
  • 将条目另存为自动文本/构建块,可能需要结合使用 使用BuildingBlock内容控件(可以过滤以仅显示您的条目;也可以从键盘中有选择地使用自动文本)。
  • 使用按钮创建一个小的非模态UserForm。您可以选择使用Windows API使其“始终在顶部”。