• VBA 剪切板


    在VBE中,插入一个类模块(注意是类模块,不是标准模块),并将其命名为“ClipBoard”,贴入下面的代码

    1. Private Const CF_UNICODETEXT As Long = 13&
    2. Private Const CF_TEXT As Long = 1&
    3. Private Const GMEM_ZEROINIT = &H40
    4. Private Const GMEM_MOVEABLE = &H2
    5. Private Const GHND = (GMEM_MOVEABLE Or GMEM_ZEROINIT)
    6. #If Win64 Then
    7. Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As LongPtr)
    8. Private Declare PtrSafe Function GlobalUnlock Lib "kernel32" (ByVal hMem As LongLong) As Long
    9. Private Declare PtrSafe Function GlobalLock Lib "kernel32" (ByVal hMem As LongLong) As LongPtr
    10. Private Declare PtrSafe Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As LongLong) As LongPtr
    11. Private Declare PtrSafe Function GlobalSize Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr
    12. Private Declare PtrSafe Function CloseClipboard Lib "user32" () As Long
    13. Private Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hWnd As LongLong) As Long
    14. Private Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long
    15. Private Declare PtrSafe Function CountClipboardFormats Lib "user32" () As Long
    16. Private Declare PtrSafe Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (ByVal lpString1 As Any, ByVal lpString2 As String) As LongPtr
    17. Private Declare PtrSafe Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As LongPtr
    18. Private Declare PtrSafe Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As LongLong) As LongLong
    19. Private Declare PtrSafe Function EnumClipboardFormats Lib "user32" (ByVal wFormat As Long) As Long
    20. Private Declare PtrSafe Function IsClipboardFormatAvailable Lib "user32" (ByVal wFormat As Long) As Long
    21. #Else
    22. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
    23. Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
    24. Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
    25. Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
    26. Private Declare Function GlobalSize Lib "kernel32" (ByVal hMem As Long) As Long
    27. Private Declare Function CloseClipboard Lib "user32" () As Long
    28. Private Declare Function OpenClipboard Lib "user32" (ByVal hWnd As Long) As Long
    29. Private Declare Function EmptyClipboard Lib "user32" () As Long
    30. Private Declare Function CountClipboardFormats Lib "user32" () As Long
    31. Private Declare Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, ByVal lpString2 As Any) As Long
    32. Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
    33. Private Declare Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As Long) As Long
    34. Private Declare Function EnumClipboardFormats Lib "user32" (ByVal wFormat As Long) As Long
    35. Private Declare Function IsClipboardFormatAvailable Lib "user32" (ByVal wFormat As Long) As Long
    36. #End If
    37. Public Function ClipBoard_HasFormat(ByVal peCBFormat) As Boolean
    38. Dim lRet As Long
    39. If OpenClipboard(0&) > 0 Then
    40. lRet = EnumClipboardFormats(0)
    41. If lRet <> 0 Then
    42. Do
    43. If lRet = peCBFormat Then
    44. ClipBoard_HasFormat = True
    45. Exit Do
    46. End If
    47. lRet = EnumClipboardFormats(lRet)
    48. Loop While lRet <> 0
    49. End If
    50. CloseClipboard
    51. Else
    52. MsgBox "不能打開剪切板", vbCritical
    53. End If
    54. End Function
    55. Public Function GetClipBoard() As String
    56. #If Win64 Then
    57. Dim hData As LongPtr
    58. Dim lByteLen As LongPtr
    59. Dim lPointer As LongPtr
    60. Dim lSize As LongLong
    61. #Else
    62. Dim hData As Long
    63. Dim lByteLen As Long
    64. Dim lPointer As Long
    65. Dim lSize As Long
    66. #End If
    67. Dim lRet As Long
    68. Dim abData() As Byte
    69. Dim sText As String
    70. lRet = OpenClipboard(0&)
    71. If lRet > 0 Then
    72. hData = GetClipboardData(CF_TEXT)
    73. If hData <> 0 Then
    74. lByteLen = GlobalSize(hData)
    75. lSize = GlobalSize(hData)
    76. lPointer = GlobalLock(hData)
    77. If lSize > 0 Then
    78. ReDim abData(0 To CLng(lSize) - CLng(1)) As Byte
    79. CopyMemory abData(0), ByVal lPointer, lSize
    80. GlobalUnlock hData
    81. sText = StrConv(abData, vbUnicode)
    82. End If
    83. Else
    84. MsgBox "不能打開剪切板", vbCritical
    85. End If
    86. CloseClipboard
    87. End If
    88. GetClipBoard = sText
    89. End Function
    90. Public Function SetClipboard(clipText As String) As Boolean
    91. #If Win64 Then
    92. Dim hGlobalMemory As LongLong
    93. Dim lpGlobalMemory As LongPtr
    94. Dim hClipMemory As LongLong
    95. #Else
    96. Dim hGlobalMemory As Long
    97. Dim lpGlobalMemory As Long
    98. Dim hClipMemory As Long
    99. #End If
    100. Dim fOK As Boolean
    101. fOK = True
    102. #If Win64 Then
    103. hGlobalMemory = GlobalAlloc(GHND, LenB(clipText) + 1)
    104. #Else
    105. hGlobalMemory = GlobalAlloc(GHND, Len(clipText) + 1)
    106. #End If
    107. If hGlobalMemory = 0 Then
    108. Exit Function
    109. End If
    110. lpGlobalMemory = GlobalLock(hGlobalMemory)
    111. lpGlobalMemory = lstrcpy(lpGlobalMemory, clipText)
    112. If GlobalUnlock(hGlobalMemory) <> 0 Then
    113. fOK = False
    114. GoTo clean_exit
    115. End If
    116. If OpenClipboard(0&) = 0 Then
    117. fOK = False
    118. Exit Function
    119. End If
    120. EmptyClipboard
    121. hClipMemory = SetClipboardData(CF_TEXT, hGlobalMemory)
    122. clean_exit:
    123. CloseClipboard
    124. ClipBoard_SetData = fOK
    125. End Function
    126. Public Sub ClearClipboard()
    127. OpenClipboard 0&
    128. EmptyClipboard
    129. CloseClipboard
    130. End Sub
    131. Public Function IsEmpty() As Boolean
    132. OpenClipboard 0&
    133. IsEmpty = (CountClipboardFormats = 0)
    134. CloseClipboard
    135. End Function
    136. Public Function IsString() As Boolean
    137. OpenClipboard 0&
    138. IsString = (IsClipboardFormatAvailable(CF_UNICODETEXT)) Or (IsClipboardFormatAvailable(CF_TEXT))
    139. CloseClipboard
    140. End Function
    141. Private Sub Class_Terminate()
    142. CloseClipboard
    143. End Sub

    2.插入一个标准模块,贴入下面代码

    1. Sub PutInClipboard(ByVal strText As String)
    2. Dim clip As ClipBoard
    3. Set clip = New ClipBoard
    4. clip.SetClipboard strText
    5. End Sub

    3.就可以给这个调用这个Sub,传入想要复制到剪切板的文本了。

    Call PutInClipboard("变量或者文本")
  • 相关阅读:
    构建你的Conda包:使用conda skeleton命令打造包的骨架
    银行金融科技岗笔试题资料大总结
    代码随想录1刷—数组篇
    Whale News | 帷幄获公安部信息安全「等保三级」认证,信息安全体系建设行业领先
    《国际服务贸易》期末复习题 及答案参考
    二叉树题目:从中序与后序遍历序列构造二叉树
    点云从入门到精通技术详解100篇-三维点云属性变换编码(中)
    深度学习之基于Django+Tensorflow动物识别系统
    (12)yolov5+deepsort 应用实例之跟踪目标起始时间并记录结果图像
    vue_Delete `␍`eslint(prettier/prettier)
  • 原文地址:https://blog.csdn.net/wuchunyu002/article/details/133777231