it-swarm.com.de

Excel VBA-Code zum Kopieren einer bestimmten Zeichenfolge in die Zwischenablage

Ich versuche, einer Tabelle eine Schaltfläche hinzuzufügen, die beim Klicken eine bestimmte URL in meine Zwischenablage kopiert.

Ich hatte ein wenig Erfahrung mit Excel VBA, aber es ist eine Weile her und ich habe Probleme.

39
user1958738

Dieses Makro verwendet eine späte Bindung, um Text in die Zwischenablage zu kopieren, ohne dass Sie Verweise festlegen müssen. Sie sollten einfach einfügen und loslegen können:

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

Verwendungszweck:

Sub CopySelection()
    CopyText Selection.Text
End Sub
79
Jroonk

Die einfachste (nicht Win32) Methode besteht darin, Ihrem VBA-Projekt eine UserForm hinzuzufügen (sofern Sie noch keine haben) oder alternativ einen Verweis auf Microsoft Forms 2-Objektbibliothek hinzuzufügen. Dann können Sie dies von einem Arbeitsblatt/Modul aus tun einfach:

With New MSForms.DataObject
    .SetText "http://zombo.com"
    .PutInClipboard
End With
20
Alex K.

Wenn sich die URL in einer Zelle in Ihrer Arbeitsmappe befindet, können Sie den Wert einfach aus dieser Zelle kopieren:

Private Sub CommandButton1_Click()
    Sheets("Sheet1").Range("A1").Copy
End Sub

(Fügen Sie über die Registerkarte "Entwickler" eine Schaltfläche hinzu. Passen Sie das Menüband an, falls es nicht sichtbar ist.)

Wenn sich die URL nicht in der Arbeitsmappe befindet, können Sie die Windows-API verwenden. Den folgenden Code finden Sie hier: http://support.Microsoft.com/kb/210216

Nachdem Sie die API-Aufrufe unten hinzugefügt haben, ändern Sie den Code hinter der Schaltfläche, um ihn in die Zwischenablage zu kopieren:

Private Sub CommandButton1_Click()
    ClipBoard_SetData ("http:\\stackoverflow.com")
End Sub

Fügen Sie Ihrer Arbeitsmappe ein neues Modul hinzu und fügen Sie den folgenden Code ein:

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
8
Jon Crowell

Fügen Sie einen Verweis auf die Microsoft Forms 2.0-Objektbibliothek hinzu, und versuchen Sie diesen Code. Es funktioniert nur mit Text, nicht mit anderen Datentypen.

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

Hier finden Sie weitere Informationen zur Verwendung der Zwischenablage mit VBA.

6
stenci

Wenn Sie den Wert einer Variablen mithilfe des Direktfensters in die Zwischenablage einfügen möchten, können Sie diese einzige Zeile verwenden, um einen Haltepunkt in Ihren Code einzufügen:

Set MSForms_DataObject = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}"): MSForms_DataObject.SetText VARIABLENAME: MSForms_DataObject.PutInClipboard: Set MSForms_DataObject = Nothing
4
F_Face

Wenn der Bereich, den Sie einfügen möchten, keine Probleme beim Einfügen einer Tabellenformatierung hat (wie die Browser-URL-Leiste), denke ich, ist der einfachste Weg der folgende:

Sheets(1).Range("A1000").Value = string
Sheets(1).Range("A1000").Copy
MsgBox "Paste before closing this dialog."
Sheets(1).Range("A1000").Value = ""
0
Maycow Moura