专栏首页完美ExcelVBA实战技巧06: 复制文本到剪贴板

VBA实战技巧06: 复制文本到剪贴板

可以使用VBA将文本复制到剪贴板,在需要使用时再将其粘贴到合适的地方。

下面的代码使用DataObject对象将指定文本复制到剪贴板:

Sub CopyTextToClipboard()
   Dim objData As New DataObject
   Dim strText As String
   
   strText = "使用VBA复制到剪贴板!"
   
    '设置对象文本为字符串变量指定文本
   objData.SetText strText
    '将对象文本放置到剪贴板
   objData.PutInClipboard
End Sub

注意,上述代码运行前需要添加对“Microsoft Forms 2.0 Object Library”库的引用,方法是在VBE中单击菜单“工具——引用”,在“引用”对话框中找到该库并选取。如果在“引用”对话框中找不到这个库,可以在VBE中单击菜单“插入——用户窗体”命令,先插入一个空白用户窗体,然后再运行上述代码。

还可以使用Windows API来复制文本到剪贴板。

'处理64位和32位Office
#If VBA7 Then
 Private Declare PtrSafe Function GlobalUnlock Lib "kernel32"(ByVal hMem As LongPtr) As LongPtr
 Private Declare PtrSafe Function GlobalLock Lib "kernel32"(ByVal hMem As LongPtr) As LongPtr
 Private Declare PtrSafe Function GlobalAlloc Lib "kernel32"(ByVal wFlags As LongPtr, _
   ByVal dwBytes As LongPtr) As LongPtr
 Private Declare PtrSafe Function CloseClipboard Lib "user32"() As LongPtr
 Private Declare PtrSafe Function OpenClipboard Lib "user32"(ByVal hwnd As LongPtr) As LongPtr
 Private Declare PtrSafe Function EmptyClipboard Lib "user32" ()As LongPtr
 Private Declare PtrSafe Function lstrcpy Lib "kernel32" (ByVallpString1 As Any, _
   ByVal lpString2 As Any) As LongPtr
 Private Declare PtrSafe Function SetClipboardData Lib "user32"(ByVal wFormat As LongPtr, _
   ByVal hMem As LongPtr) As LongPtr
#Else
 Private Declare Function GlobalUnlock Lib "kernel32" (ByValhMem As Long) As Long
 Private Declare Function GlobalLock Lib "kernel32" (ByVal hMemAs Long) As Long
 Private Declare Function GlobalAlloc Lib "kernel32" (ByValwFlags As Long, _
   ByVal dwBytes As Long) As Long
 Private Declare Function CloseClipboard Lib "user32" () AsLong
 Private Declare Function OpenClipboard Lib "user32" (ByValhwnd As Long) As Long
 Private Declare Function EmptyClipboard Lib "user32" () AsLong
 Private Declare Function lstrcpy Lib "kernel32" (ByVallpString1 As Any, _
   ByVal lpString2 As Any) As Long
Private Declare FunctionSetClipboardData Lib "user32" (ByVal wFormat _
   As Long, ByVal hMem As Long) As Long
#End If
 
Const GHND = &H42
Const CF_TEXT = 1
Const MAXSIZE = 4096
 
'复制文本到剪贴板的API函数
'来源:www.msdn.microsoft.com/en-us/library/office/ff192913.aspx
Function ClipBoard_SetData(MyString As String)
 
 Dim hGlobalMemory As Long, lpGlobalMemory As Long
 Dim hClipMemory As Long, X As Long
 
  '分配可移动的全局内存
 hGlobalMemory = GlobalAlloc(GHND, Len(MyString) + 20)
 
  '锁定该块以获取该内存的远指针
 lpGlobalMemory = GlobalLock(hGlobalMemory)
 
  '复制字符串到该全局内存
 lpGlobalMemory = lstrcpy(lpGlobalMemory, MyString)
 
  '解锁该内存
 If GlobalUnlock(hGlobalMemory) <> 0 Then
   MsgBox "不能解锁内存位置. 复制中止."
   GoTo OutOfHere2
 End If
 
  '打开剪贴板复制数据.
 If OpenClipboard(0&) = 0 Then
   MsgBox "不能打开剪贴板. 复制中止."
   Exit Function
 End If
 
  '清空剪贴板
 X = EmptyClipboard()
 
  '复制数据到剪贴板
 hClipMemory = SetClipboardData(CF_TEXT, hGlobalMemory)
 
OutOfHere2:
 If CloseClipboard() = 0 Then
   MsgBox "不能关闭剪贴板."
 End If
End Function
 
Sub CopyTextToClipboard()
 Dim strText As String
 
 strText = "这里使用VBA复制文本到剪贴板!"
 
  '放置文本到剪贴板
  ClipBoard_SetData strText
End Sub

本文分享自微信公众号 - 完美Excel(excelperfect),作者:fanjy

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一起学Excel专业开发17:Excel工时报表与分析系统开发(2)——创建特定应用加载宏

    在《一起学Excel专业开发16:使用表驱动的方法管理工作表用户接口》中,我们已经创建了表驱动的用于接口工作簿的工作表。

    fanjy
  • VBA实战技巧04: 一个用于两个列表区域比较的自定义函数

    本文整理自https://fastexcel.wordpress.com/,有兴趣的朋友可以研究一下。

    fanjy
  • 问与答71: 如何使用VBA打印PDF文件?

    A:在《VBA小技巧04:使用VBA获取能够打开指定文件的EXE程序》中,我们介绍了一个自定义函数ExePath,可以获取能够打开指定文件的EXE程序的路径。这...

    fanjy
  • .NET中的密钥加密

    本教程将演示如何通过System.Security.Cryptography在.NET Framework 1.1中实现对称加密/密钥加密。

    MelodyS
  • vb.net 连接MYSQL数据库,需要MySql.Data.dll连接控件!

    '---------------------------------------------------------------------------...

    巴西_prince
  • VB6.0用GDI+保存图像为BMP\JPG\PNG\GIF格式终结版。

    鉴于之前在http://blog.csdn.net/laviewpbt/article/details/756547发布的代码很匆忙,也存在不少错误,现发布比较...

    用户1138785
  • VB.NET 仿spy++拖拽图标获取窗体句柄

    巴西_prince
  • VBA解析VBAProject 04——run length encoding

    在VBAProject中,dir流以及VBA模块代码流都使用了run length encoding的算法进行压缩。

    xyj
  • 类模块——举例

    前面使用Open 进行的文件操作,使用起来不是很方便,但是FileSystemObject里的TextStream使用起来就比较方便了,知道了类之后,就可以使用...

    xyj
  • VBA拆分表格

    还是接着上一次的例子,分年龄段统计人数工作完成后,你又接到任务需要将总表根据年龄段拆分为多个分表。

    xyj

扫码关注云+社区

领取腾讯云代金券