I'm currently using the following code to put cell data on the clipboard. I'm using this method rather than .Copy because of some weird interactions with the location in which I paste the data (namely a "contenteditable" div in an HTML page, which results in wonky formatting when using the "default" clipboard integration with Excel).
The problem with this code is that when I have emojis in a cell, they are placed on the clipboard as ?? (double question mark). I assume this happens with any unicode character, and so the real problem is that the methodology below doesn't work with Unicode.
I've tried changing the call that actually puts stuff on the clipboard to use CF_UNICODETEXT instead of CF_TEXT, but that doesn't work either - see the comment in the code below.
Help appreciated!
The problem with this code is that when I have emojis in a cell, they are placed on the clipboard as ?? (double question mark). I assume this happens with any unicode character, and so the real problem is that the methodology below doesn't work with Unicode.
I've tried changing the call that actually puts stuff on the clipboard to use CF_UNICODETEXT instead of CF_TEXT, but that doesn't work either - see the comment in the code below.
Help appreciated!
VBA Code:
#If Mac Then
' do nothing
#Else
#If VBA7 Then
Declare PtrSafe Function GlobalUnlock Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr
Declare PtrSafe Function GlobalLock Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr
Declare PtrSafe Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, _
ByVal dwBytes As LongPtr) As LongPtr
Declare PtrSafe Function CloseClipboard Lib "User32" () As Long
Declare PtrSafe Function OpenClipboard Lib "User32" (ByVal hwnd As LongPtr) As LongPtr
Declare PtrSafe Function EmptyClipboard Lib "User32" () As Long
Declare PtrSafe Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, _
ByVal lpString2 As Any) As LongPtr
Declare PtrSafe Function SetClipboardData Lib "User32" (ByVal wFormat _
As Long, ByVal hMem As LongPtr) As LongPtr
#Else
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
#End If
#End If
Public Const GHND = &H42
Public Const CF_TEXT = 1
Public Const MAXSIZE = 4096
Sub ClipBoard_SetData(MyString As String)
#If Mac Then
With New MSForms.DataObject
.SetText MyString
.PutInClipboard
End With
#Else
#If VBA7 Then
Dim hGlobalMemory As LongPtr
Dim hClipMemory As LongPtr
Dim lpGlobalMemory As LongPtr
#Else
Dim hGlobalMemory As Long
Dim hClipMemory As Long
Dim lpGlobalMemory As Long
#End If
Dim 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 PrepareToClose
End If
' Open the Clipboard to copy data to.
If OpenClipboard(0&) = 0 Then
MsgBox "Could not open the Clipboard. Copy aborted."
Exit Sub
End If
' Clear the Clipboard.
x = EmptyClipboard()
' Copy the data to the Clipboard.
hClipMemory = SetClipboardData(CF_TEXT, hGlobalMemory)
' copy as Unicode to support emojis
Dim CF_UNICODETEXT 'normally do this as public const, but here for ease of reading on mrexcel
CF_UNICODETEXT = 13
' hClipMemory = SetClipboardData(CF_UNICODETEXT, hGlobalMemory) ' does not work, ALL characters turn into picto-glyphs (unsure what language) on the clipboard
PrepareToClose:
If CloseClipboard() = 0 Then
MsgBox "Could not close Clipboard."
End If
#End If
End Sub