在 Access2003/2007 中使用 VBA。
如何将字符串变量的内容复制到剪贴板?
此站点建议创建一个零长度的文本框,将字符串复制到文本框,然后运行
DoCmd.RunCommand acCmdCopy
。啊。我的意思是,我们可以沿着这条路走下去。但仍然。呃。
虽然 MS 知识库文章 向我们展示了如何做到这一点,但它涉及许多 Windows API 调用。唷。
只有这两个选择吗?
VB 6 提供了一个
Clipboard
对象,使这一切变得极其简单和方便,但不幸的是,VBA 无法提供该功能。
如果是我,我会走 API 路线。没有理由害怕调用本机 API;该语言为您提供了这样做的能力是有原因的。
但是,更简单的替代方法是使用
DataObject
类,它是 Forms 库的一部分。如果您已经在应用程序中使用表单库中的功能,我只建议您采用此路线。 仅添加对此库的引用来使用剪贴板似乎有点愚蠢。
例如,要将一些文本放置在剪贴板上,您可以使用以下代码:
Dim clipboard As MSForms.DataObject
Set clipboard = New MSForms.DataObject
clipboard.SetText "A string value"
clipboard.PutInClipboard
或者,将文本从剪贴板复制到字符串变量中:
Dim clipboard As MSForms.DataObject
Dim strContents As String
Set clipboard = New MSForms.DataObject
clipboard.GetFromClipboard
strContents = clipboard.GetText
social.msdn.microsoft.com 网站上的用户 Leigh Webber 发布了使用 Windows API 实现易于使用的剪贴板界面的 VBA 代码:
http://social.msdn.microsoft.com/Forums/en/worddev/thread/ee9e0d28-0f1e-467f-8d1d-1a86b2db2878
您可以在这里获取 Leigh Webber 的源代码
如果此链接未通过,请在 Office 开发人员中心 > Microsoft Office 开发人员论坛 > Word 开发人员部分中搜索“VBA 剪贴板对象”。
我创建了这两个类,运行了他的测试用例,它在 Windows 7 64 位下的 Outlook 2007 SP3 32 位 VBA 中完美运行。它很可能适用于 Access。 提示:要重命名类,请在 VBA“项目”窗口中选择类,然后单击菜单栏上的“查看”并单击“属性窗口”(或直接按 F4)。
在他的课程中,这就是从剪贴板复制到/从剪贴板复制的内容:
Dim myClipboard As New vbaClipboard ' Create clipboard
' Copy text to clipboard as ClipboardFormat TEXT (CF_TEXT)
myClipboard.SetClipboardText "Text to put in clipboard", "CF_TEXT"
' Retrieve clipboard text in CF_TEXT format (CF_TEXT = 1)
mytxt = myClipboard.GetClipboardText(1)
他还提供了其他操作剪贴板的功能。
它还克服了 32KB MSForms_DataObject.SetText 限制 - 这是 SetText 经常失败的主要原因。但是,请记住,不幸的是,我还没有找到有关 Microsoft 认识到此限制的参考资料。
-吉姆
我无法通过第一个 Google 结果弄清楚如何使用该 API。幸运的是,某个地方的一个线程向我指出了这个链接: http://access.mvps.org/access/api/api0049.htm
效果很好。 :)
没那么复杂,我不明白为什么网上找到的解决方案都这么复杂。
Sub StoreData()
Set objCP = CreateObject("HtmlFile")
objCP.ParentWindow.ClipboardData.SetData "text", "Some text for clipboard"
End Sub
此处列出了许多示例,但似乎没有一个示例涵盖了使用也适用于 Access 和 Excel 32 位和 64 位的 API 的直接方法。
我不想窃取其他人的工作成果,所以我指向一篇有解决方案的文章。
按照David的想法,如果你想传递一个参数,它必须是双引号的。
Public Sub SetClipboardText(ByVal Text As String)
Dim QuotedText As String
QuotedText = """" & Text & """"
Set HtmlFileObject = CreateObject("HtmlFile")
HtmlFileObject.ParentWindow.ClipboardData.SetData "text", Eval(QuotedText)
End Sub
设置功能
Function set_clipboard_text(str_text)
On Error GoTo err_handler
Dim MSForms_DataObject As Object
Set MSForms_DataObject = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
MSForms_DataObject.SetText str_text
MSForms_DataObject.PutInClipboard
Set MSForms_DataObject = Nothing
set_clipboard_text = True
Exit Function
err_handler:
Debug.Print "error in set_clipboard_text function. Err: " &
Err.DESCRIPTION
set_clipboard_text = False
End Function
获取函数
Function get_clipboard_text()
Dim MSForms_DataObject As Object
Set MSForms_DataObject = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
MSForms_DataObject.GetFromClipboard
get_clipboard_text = MSForms_DataObject.GetText
结束功能