web-dev-qa-db-fra.com

Code VBA Excel pour copier une chaîne spécifique dans le Presse-papiers

J'essaie d'ajouter un bouton à une feuille de calcul qui, une fois cliqué, copiera une URL spécifique dans mon presse-papiers.

J'avais un peu de connaissance d'Excel VBA, mais cela fait longtemps et je me bats.

39
user1958738

Cette macro utilise une liaison tardive pour copier du texte dans le Presse-papiers sans vous obliger à définir des références. Vous devriez être capable de simplement coller et aller:

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

Usage:

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

La méthode la plus simple (non Win32) consiste à ajouter un objet UserForm à votre projet VBA (si vous n'en avez pas déjà un) ou à ajouter une référence à Bibliothèque d'objets Microsoft Forms 2 , à partir d'une feuille/d'un module simplement:

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

Si l'URL se trouve dans une cellule de votre classeur, vous pouvez simplement copier la valeur à partir de cette cellule:

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

(Ajoutez un bouton à l'aide de l'onglet Développeur. Personnalisez le ruban s'il n'est pas visible.)

Si l'URL n'est pas dans le classeur, vous pouvez utiliser l'API Windows. Le code qui suit peut être trouvé ici: http://support.Microsoft.com/kb/210216

Après avoir ajouté les appels d'API ci-dessous, modifiez le code derrière le bouton pour le copier dans le Presse-papiers:

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

Ajoutez un nouveau module à votre classeur et collez le code suivant:

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

Ajoutez une référence à la bibliothèque d'objets Microsoft Forms 2.0 et essayez ce code. Cela ne fonctionne qu'avec du texte, pas avec d'autres types de données.

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

Ici vous pouvez trouver plus de détails sur l’utilisation du presse-papier avec VBA.

6
stenci

Si vous voulez mettre la valeur d'une variable dans le presse-papiers à l'aide de la fenêtre Immediate, vous pouvez utiliser cette simple ligne pour insérer facilement un point d'arrêt dans votre code:

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

Si le lieu que vous allez coller n'a pas de problème à coller un tableau (comme la barre d'URL du navigateur), je pense que le moyen le plus simple est le suivant:

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