Я пытаюсь добавить кнопку в электронную таблицу, которая при нажатии будет скопировать определенный URL-адрес в мой буфер обмена.
У меня было немного знаний о Excel VBA, но это было какое-то время, и я боюсь.
Я пытаюсь добавить кнопку в электронную таблицу, которая при нажатии будет скопировать определенный URL-адрес в мой буфер обмена.
У меня было немного знаний о Excel VBA, но это было какое-то время, и я боюсь.
Этот макрос использует позднюю привязку для копирования текста в буфер обмена, не требуя установки ссылок. Вы должны просто вставить и перейти:
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
Самый простой способ (Non Win32) - добавить UserForm к вашему проекту VBA (если у вас его еще нет) или, альтернативно, добавить ссылку на библиотеку объектов Microsoft Forms 2, затем из листа/модуля вы можете просто
With New MSForms.DataObject
.SetText "http://zombo.com"
.PutInClipboard
End With
Если url находится в ячейке вашей книги, вы можете просто скопировать значение из этой ячейки:
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
Добавьте ссылку на библиотеку объектов 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
Здесь вы можете найти более подробную информацию о том, как использовать буфер обмена с VBA.
Если вы хотите поместить значение переменной в буфер обмена с помощью окна "Немедленное", из-за того, что вы поставили точку останова в своем коде, используйте следующую строку:
Set MSForms_DataObject = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
MSForms_DataObject.SetText VARIABLENAME
MSForms_DataObject.PutInClipboard
Set MSForms_DataObject = Nothing