如何使用Access/VBA复制到剪贴板?

问题描述 投票:0回答:7

在 Access2003/2007 中使用 VBA。

如何将字符串变量的内容复制到剪贴板?

此站点建议创建一个零长度的文本框,将字符串复制到文本框,然后运行

DoCmd.RunCommand acCmdCopy
。啊。我的意思是,我们可以沿着这条路走下去。但仍然。呃。

虽然 MS 知识库文章 向我们展示了如何做到这一点,但它涉及许多 Windows API 调用。唷。

只有这两个选择吗?

windows ms-access clipboard vba
7个回答
65
投票

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

9
投票

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 认识到此限制的参考资料。

-吉姆


7
投票

我无法通过第一个 Google 结果弄清楚如何使用该 API。幸运的是,某个地方的一个线程向我指出了这个链接: http://access.mvps.org/access/api/api0049.htm

效果很好。 :)


3
投票

简单的两行代码:

没那么复杂,我不明白为什么网上找到的解决方案都这么复杂。

Sub StoreData()

  Set objCP = CreateObject("HtmlFile")
  objCP.ParentWindow.ClipboardData.SetData "text", "Some text for clipboard"

End Sub

0
投票

此处列出了许多示例,但似乎没有一个示例涵盖了使用也适用于 Access 和 Excel 32 位和 64 位的 API 的直接方法。

我不想窃取其他人的工作成果,所以我指向一篇有解决方案的文章。

https://stackoverflow.com/a/35512118/1898524


0
投票

按照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

0
投票

设置功能

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

结束功能

© www.soinside.com 2019 - 2024. All rights reserved.