53

クリックすると特定の URL がクリップボードにコピーされるボタンをスプレッドシートに追加しようとしています。

Excel VBAの知識は少しありましたが、久しぶりで苦労しています。

4

8 に答える 8

99

編集 - 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
于 2014-08-16T02:29:54.823 に答える
23

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 クリップボードへの書き込みと読み取りの両方が可能です。このページの他のソリューションには、これらの利点はありません。

于 2020-03-28T01:28:01.323 に答える
21

最も簡単な (Win32 以外の) 方法は、VBA プロジェクトに UserForm を追加する (まだ持っていない場合) か、代わりにMicrosoft Forms 2 Object Libraryへの参照を追加することです。その後、シート/モジュールから簡単に次のことができます。

With New MSForms.DataObject
    .SetText "http://zombo.com"
    .PutInClipboard
End With
于 2013-01-08T16:33:20.403 に答える
10

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
于 2013-01-09T01:02:03.633 に答える
8

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 でクリップボードを使用する方法について詳しく説明します。

于 2013-01-09T01:24:10.080 に答える
4

イミディエイト ウィンドウを使用して変数の値をクリップボードに入れたい場合は、この 1 行を使用してコードに簡単にブレークポイントを入れることができます。

Set MSForms_DataObject = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}"): MSForms_DataObject.SetText VARIABLENAME: MSForms_DataObject.PutInClipboard: Set MSForms_DataObject = Nothing
于 2015-09-23T08:01:32.483 に答える