简体   繁体   中英

how copy text from vba to windows clipbaord

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

https://desmondoshiwambo.wordpress.com/2012/02/23/how-to-copy-and-paste-text-tofrom-clipboard-using-vba-microsoft-access/

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM