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.
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
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
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
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.
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
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 = ""