I have an ms access vba code from which i wish to copy some text value to the Windows clipboard so that I can paste it elsewhere (Word/Excel/Notepad/etc).
I have been searching for this in SO but everything seems over-complicated. Should it not be something simple like
clipboard.SetText textValue
?
EDIT
I tried following the hint by BrianMStafford but don't succeed. Perhaps the reason is that my object is a node in a tree. When I do
MsgBox Me.NodeKey.Value
it all works fine - I see the node path in the message box.
But when I do
Me.NodeKey.SetFocus
DoCmd.RunCommand acCmdCopy
I don't get the node path in the clipboard
So how can I copy the node path value into the Windows clipboard?
Public Sub WriteToClipboard(ByVal text As String)
CreateObject("htmlfile").ParentWindow.ClipboardData.SetData "text", text
End Sub
Example usage:
WriteToClipboard "test"
Edit #1
The above seems to work in Excel just fine. I only managed to make it work in Access for a specific computer. Once tested on another computer I got an error 70 (access denied).
The below only works in Excel if Windows Explorer is closed. However, it seems to work fine in Access regardless if Explorer is open/closed:
Public Sub WriteToClipboard(ByVal text As String)
With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") 'MsForms.DataObject
.SetText text
.PutInClipboard
End With
End Sub
It should be as simple as you say, however Access for some reason doesn't have the same "options" as excel. You have to add it manually or use Cristian Buse's answer which is pretty much the same, he is skipping adding the reference. So here is the way to manually add the reference to use .SetText
in Access.
Access does not have the MS Forms listed on the Reference table like Excel (dont ask me why), but you can Browse to the file location and add it manually:
After you add this manually you can use the .SetText anywhere as long as you also declare the object of course.
Sub testCopy()
Dim clipOb As MSForms.DataObject
Set clipOb = New MSForms.DataObject
clipOb.SetText Format(Now(), "m/d/yyyy")
clipOb.PutInClipboard
End Sub
Now you can paste it anywhere. Just replace Format(Now(), "m/d/yyyy")
with your Me.NodeKey.Value
. If your Value is empty/blank it will give you an error, so just do a check before using .SetText
to make sure you have a value to set.
Use Windows API to Set Clipboard Data.
Here's the documentation page: https://docs.microsoft.com/en-us/office/vba/access/concepts/windows-api/send-information-to-the-clipboard
Here's the code required with 2 example of how to use. After running sub to save data to clipboard, just paste it anywhere.
Option Explicit
Private Declare Function OpenClipboard Lib "user32.dll" (ByVal hWnd As Long) As Long
Private Declare Function EmptyClipboard Lib "user32.dll" () As Long
Private Declare Function CloseClipboard Lib "user32.dll" () As Long
Private Declare Function SetClipboardData Lib "user32.dll" (ByVal wFormat As Long, ByVal hMem As Long) As Long
Private Declare Function GlobalAlloc Lib "kernel32.dll" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalLock Lib "kernel32.dll" (ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32.dll" (ByVal hMem As Long) As Long
Private Declare Function lstrcpy Lib "kernel32.dll" Alias "lstrcpyW" (ByVal lpString1 As Long, ByVal lpString2 As Long) As Long
Public Sub SetClipboard(sUniText As String)
Dim iStrPtr As Long
Dim iLen As Long
Dim iLock As Long
Const GMEM_MOVEABLE As Long = &H2
Const GMEM_ZEROINIT As Long = &H40
Const CF_UNICODETEXT As Long = &HD
OpenClipboard 0&
EmptyClipboard
iLen = LenB(sUniText) + 2&
iStrPtr = GlobalAlloc(GMEM_MOVEABLE Or GMEM_ZEROINIT, iLen)
iLock = GlobalLock(iStrPtr)
lstrcpy iLock, StrPtr(sUniText)
GlobalUnlock iStrPtr
SetClipboardData CF_UNICODETEXT, iStrPtr
CloseClipboard
End Sub
Sub Example_SetClipboardData_1()
SetClipboard "Hello World"
End Sub
Sub Example_SetClipboardData_2()
Dim TextVar As String
TextVar = "Hello again, World"
SetClipboard TextVar
End Sub
When googling the object code that Cristian posted, I found a good page listing the possibilities, both early and late binding. Hence this page combines the answers by Christian Buse and Ricardo A.
See
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.