我正在尝试向电子表格添加一个按钮,点击该按钮会将特定网址复制到我的剪贴板。
我对Excel VBA有一点了解,但已经有一段时间了,我正在努力。
答案 0 :(得分:85)
此宏使用后期绑定将文本复制到剪贴板,而无需您设置引用。你应该可以粘贴并去:
Sub CopyText(Text As String)
'VBA Macro using late binding to copy text to clipboard.
'By Justin Kay, 8/15/2014
Dim MSForms_DataObject As Object
Set MSForms_DataObject = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
MSForms_DataObject.SetText Text
MSForms_DataObject.PutInClipboard
Set MSForms_DataObject = Nothing
End Sub
用法:
Sub CopySelection()
CopyText Selection.Text
End Sub
答案 1 :(得分:20)
最简单的(非Win32)方式是将一个UserForm添加到您的VBA项目中(如果您还没有)或者添加对 Microsoft Forms 2对象库的引用,然后从您可以简单地使用工作表/模块:
With New MSForms.DataObject
.SetText "http://zombo.com"
.PutInClipboard
End With
答案 2 :(得分:8)
如果网址位于工作簿的单元格中,则只需复制该单元格中的值即可:
Private Sub CommandButton1_Click()
Sheets("Sheet1").Range("A1").Copy
End Sub
(使用开发人员标签添加按钮。如果功能区不可见,请自定义功能。)
如果URL不在工作簿中,则可以使用Windows API。可以在此处找到以下代码:http://support.microsoft.com/kb/210216
在下面添加API调用后,更改按钮后面的代码以复制到剪贴板:
Private Sub CommandButton1_Click()
ClipBoard_SetData ("http:\\stackoverflow.com")
End Sub
将新模块添加到工作簿并粘贴以下代码:
Option Explicit
Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) _
As Long
Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) _
As Long
Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, _
ByVal dwBytes As Long) As Long
Declare Function CloseClipboard Lib "User32" () As Long
Declare Function OpenClipboard Lib "User32" (ByVal hwnd As Long) _
As Long
Declare Function EmptyClipboard Lib "User32" () As Long
Declare Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, _
ByVal lpString2 As Any) As Long
Declare Function SetClipboardData Lib "User32" (ByVal wFormat _
As Long, ByVal hMem As Long) As Long
Public Const GHND = &H42
Public Const CF_TEXT = 1
Public Const MAXSIZE = 4096
Function ClipBoard_SetData(MyString As String)
Dim hGlobalMemory As Long, lpGlobalMemory As Long
Dim hClipMemory As Long, X As Long
' Allocate moveable global memory.
'-------------------------------------------
hGlobalMemory = GlobalAlloc(GHND, Len(MyString) + 1)
' Lock the block to get a far pointer
' to this memory.
lpGlobalMemory = GlobalLock(hGlobalMemory)
' Copy the string to this global memory.
lpGlobalMemory = lstrcpy(lpGlobalMemory, MyString)
' Unlock the memory.
If GlobalUnlock(hGlobalMemory) <> 0 Then
MsgBox "Could not unlock memory location. Copy aborted."
GoTo OutOfHere2
End If
' Open the Clipboard to copy data to.
If OpenClipboard(0&) = 0 Then
MsgBox "Could not open the Clipboard. Copy aborted."
Exit Function
End If
' Clear the Clipboard.
X = EmptyClipboard()
' Copy the data to the Clipboard.
hClipMemory = SetClipboardData(CF_TEXT, hGlobalMemory)
OutOfHere2:
If CloseClipboard() = 0 Then
MsgBox "Could not close Clipboard."
End If
End Function
答案 3 :(得分:7)
添加对Microsoft Forms 2.0对象库的引用并尝试此代码。它仅适用于文本,而不适用于其他数据类型。
Dim DataObj As New MSForms.DataObject
'Put a string in the clipboard
DataObj.SetText "Hello!"
DataObj.PutInClipboard
'Get a string from the clipboard
DataObj.GetFromClipboard
Debug.Print DataObj.GetText
Here您可以找到有关如何在VBA中使用剪贴板的更多详细信息。
答案 4 :(得分:4)
如果要使用“立即”窗口将变量的值放入剪贴板,可以使用此单行轻松地在代码中放置断点:
Set MSForms_DataObject = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}"): MSForms_DataObject.SetText VARIABLENAME: MSForms_DataObject.PutInClipboard: Set MSForms_DataObject = Nothing
答案 5 :(得分:0)
如果要粘贴的位置粘贴表格格式(例如浏览器URL栏)没有问题,我认为最简单的方法是:
Sheets(1).Range("A1000").Value = string
Sheets(1).Range("A1000").Copy
MsgBox "Paste before closing this dialog."
Sheets(1).Range("A1000").Value = ""
答案 6 :(得分:0)
要将文本写入Windows剪贴板(或从其中读取文本),请使用以下VBA功能:
Function Clipboard$(Optional s$)
With CreateObject("htmlfile")
With .parentWindow.clipboardData
Select Case True
Case Len(s): .setData "text", s
Case Else: Clipboard = .getData("text")
End Select
End With
End With
End Function
'Three examples of copying text to the clipboard:
Clipboard "Excel Hero was here."
Clipboard var1 & vbLF & var2
Clipboard [A1:Z999]
'To read text from the clipboard:
MsgBox Clipboard
这是不使用MS Forms也不使用Win32 API的解决方案。相反,它使用快速且无处不在的Microsoft HTML对象库。并且此解决方案尊重换行符。
答案 7 :(得分:0)
Microsoft 站点上提供的代码也适用于 Excel,即使它在 Access VBA 下。我在 64 位 Windows 10 上的 Excel 365 中尝试过。
复制此处以确保答案的完整性。
Option Explicit
Private Declare Function OpenClipboard Lib "user32.dll" (ByVal hWnd As Long) As Long
Private Declare Function EmptyClipboard Lib "user32.dll" () As Long
Private Declare Function CloseClipboard Lib "user32.dll" () As Long
Private Declare Function IsClipboardFormatAvailable Lib "user32.dll" (ByVal wFormat As Long) As Long
Private Declare Function GetClipboardData Lib "user32.dll" (ByVal wFormat As Long) As Long
Private Declare Function SetClipboardData Lib "user32.dll" (ByVal wFormat As Long, ByVal hMem As Long) As Long
Private Declare Function GlobalAlloc Lib "kernel32.dll" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalLock Lib "kernel32.dll" (ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32.dll" (ByVal hMem As Long) As Long
Private Declare Function GlobalSize Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function lstrcpy Lib "kernel32.dll" Alias "lstrcpyW" (ByVal lpString1 As Long, ByVal lpString2 As Long) As Long
Public Sub SetClipboard(sUniText As String)
Dim iStrPtr As Long
Dim iLen As Long
Dim iLock As Long
Const GMEM_MOVEABLE As Long = &H2
Const GMEM_ZEROINIT As Long = &H40
Const CF_UNICODETEXT As Long = &HD
OpenClipboard 0&
EmptyClipboard
iLen = LenB(sUniText) + 2&
iStrPtr = GlobalAlloc(GMEM_MOVEABLE Or GMEM_ZEROINIT, iLen)
iLock = GlobalLock(iStrPtr)
lstrcpy iLock, StrPtr(sUniText)
GlobalUnlock iStrPtr
SetClipboardData CF_UNICODETEXT, iStrPtr
CloseClipboard
End Sub
Public Function GetClipboard() As String
Dim iStrPtr As Long
Dim iLen As Long
Dim iLock As Long
Dim sUniText As String
Const CF_UNICODETEXT As Long = 13&
OpenClipboard 0&
If IsClipboardFormatAvailable(CF_UNICODETEXT) Then
iStrPtr = GetClipboardData(CF_UNICODETEXT)
If iStrPtr Then
iLock = GlobalLock(iStrPtr)
iLen = GlobalSize(iStrPtr)
sUniText = String$(iLen \ 2& - 1&, vbNullChar)
lstrcpy StrPtr(sUniText), iLock
GlobalUnlock iStrPtr
End If
GetClipboard = sUniText
End If
CloseClipboard
End Function
可以从自定义宏调用上述代码,如下所示:
Sub TestClipboard()
Dim Val1 As String: Val1 = "Hello Clipboard " & vbLf & "World!"
SetClipboard Val1
MsgBox GetClipboard
End Sub
要在表单上显示按钮,您可以通过快速搜索找到一个很好的示例。要在 Excel 自定义功能区(仅在当前 Excel 工作簿中显示的一个)中显示按钮,您可以使用 CustomUI。
自定义界面链接:
https://bettersolutions.com/vba/ribbon/custom-ui-editor.htm
https://docs.microsoft.com/en-us/office/open-xml/how-to-add-custom-ui-to-a-spreadsheet-document
带有图标的 imageMSO 列表(在 CustomUI 中使用):
https://bert-toolkit.com/imagemso-list.html
谢谢。