クリックすると特定の URL がクリップボードにコピーされるボタンをスプレッドシートに追加しようとしています。
Excel VBAの知識は少しありましたが、久しぶりで苦労しています。
編集 - MSForms は廃止されたため、私の回答を使用しないでください。代わりに、この回答を使用してください: https://stackoverflow.com/a/60896244/692098
参照用に元の回答をここに残します。
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
Windows クリップボードにテキストを書き込む (またはテキストを読み取る) には、次の VBA 関数を使用します。
Function Clipboard$(Optional s$)
Dim v: v = s 'Cast to variant for 64-bit VBA support
With CreateObject("htmlfile")
With .parentWindow.clipboardData
Select Case True
Case Len(s): .setData "text", v
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 123
'To read text from the clipboard:
MsgBox Clipboard
これは、MS Forms も Win32 API も使用しないソリューションです。代わりに、高速でユビキタスであり、MS Forms のように Microsoft によって廃止されていない Microsoft HTML Object Library を使用します。そして、このソリューションは改行を尊重します。このソリューションは、64 ビット Office からも機能します。最後に、このソリューションでは、Windows クリップボードへの書き込みと読み取りの両方が可能です。このページの他のソリューションには、これらの利点はありません。
最も簡単な (Win32 以外の) 方法は、VBA プロジェクトに UserForm を追加する (まだ持っていない場合) か、代わりにMicrosoft Forms 2 Object Libraryへの参照を追加することです。その後、シート/モジュールから簡単に次のことができます。
With New MSForms.DataObject
.SetText "http://zombo.com"
.PutInClipboard
End With
URLがブックのセルにある場合は、そのセルから値をコピーするだけです。
Private Sub CommandButton1_Click()
Sheets("Sheet1").Range("A1").Copy
End Sub
([開発者]タブを使用してボタンを追加します。リボンが表示されていない場合は、リボンをカスタマイズします。)
URLがブックにない場合は、WindowsAPIを使用できます。次のコードはここにあります: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 Object Library への参照を追加して、このコードを試してください。テキストでのみ機能し、他のデータ型では機能しません。
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 でクリップボードを使用する方法について詳しく説明します。
イミディエイト ウィンドウを使用して変数の値をクリップボードに入れたい場合は、この 1 行を使用してコードに簡単にブレークポイントを入れることができます。
Set MSForms_DataObject = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}"): MSForms_DataObject.SetText VARIABLENAME: MSForms_DataObject.PutInClipboard: Set MSForms_DataObject = Nothing