Put text on clipboard?

J

Jos Vens

Hi,

I wonder if you can put some predefined text on the clipboard (not the
contents of a cell - dashed line) but a text like you should copy in any
program (and like you can copy a part of text in the formulabar of a whole
line).

I'd like to paste it back when I'm inputting in a cell when the user needs
it (ctrl-v works then).

thanks
Jos Vens
 
P

PaulD

: Hi,
:
: I wonder if you can put some predefined text on the clipboard (not the
: contents of a cell - dashed line) but a text like you should copy in any
: program (and like you can copy a part of text in the formulabar of a whole
: line).
:
: I'd like to paste it back when I'm inputting in a cell when the user needs
: it (ctrl-v works then).
:
: thanks
: Jos Vens
:
Not sure I fully understand, are you looking for something like this?

Sub Macro1()
Dim MyData As DataObject
Set MyData = New DataObject
MyData.SetText "Enter what you want on the clipboard here"
MyData.PutInClipboard
End Sub

In order to run since MyData is earlybind, you must go to tools reference in
the VBA editor and select Microsoft Forms 2.0 Object Library. Or you can
change to late bind (i.e. use CreateObject)
Paul D
 
J

Jos Vens

Hi Paul,

Thanks for your reply. I guess that is exactly what I want, but it has to
work without extra references. Maybe It can work with an API-call -> that
would be OK! But, in VBA, I guess it is not possible without making
references to new libraries, and I don't want to do that.

Thanks again,
Jos Vens
 
T

Thomas Ramel

Grüezi Paul

PaulD schrieb am 09.02.2005
Sub Macro1()
Dim MyData As DataObject
Set MyData = New DataObject
MyData.SetText "Enter what you want on the clipboard here"
MyData.PutInClipboard
End Sub

In order to run since MyData is earlybind, you must go to tools reference in
the VBA editor and select Microsoft Forms 2.0 Object Library. Or you can
change to late bind (i.e. use CreateObject)

Do you have an excple how to use latebinding with the DataObject?
I was not able to run it this way, but maybe I used the wrong statements.



Regards
Thomas Ramel
 
R

RB Smissaert

Option Explicit

Public Const GHND = &H42
Public Const CF_TEXT = 1

Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags&, ByVal _
dwBytes
As Long) As Long
Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) _
As Long
Private Declare Function GlobalSize Lib "kernel32" (ByVal hMem As Long) _
As Long
Private Declare Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, _
ByVal lpString2 As Any) As
Long
Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) _
As Long
Private Declare Function OpenClipboard Lib "user32" (ByVal Hwnd As Long) _
As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As _
Long) As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long
Private Declare Function SetClipboardData Lib "user32" (ByVal wFormat _
As Long, ByVal hMem
As Long) As Long


Public Function ClipBoard_SetText(strCopyString As String) As Boolean

Dim hGlobalMemory As Long
Dim lpGlobalMemory As Long
Dim hClipMemory As Long

'this is an example of how this works
'------------------------------------
'Dim strString As String
'strString = "test"
'ClipBoard_SetText strString
'------------------------------------

'Allocate moveable global memory
'-------------------------------
hGlobalMemory = GlobalAlloc(GHND, Len(strCopyString) + 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, strCopyString)

'Unlock the memory and then copy to the clipboard
'------------------------------------------------
If GlobalUnlock(hGlobalMemory) = 0 Then
If OpenClipboard(0&) <> 0 Then
Call EmptyClipboard
hClipMemory = SetClipboardData(CF_TEXT, hGlobalMemory)
ClipBoard_SetText = CBool(CloseClipboard)
End If
End If

End Function

Function ClipBoard_GetText() As String

Dim hClipMemory As Long
Dim lpClipMemory As Long
Dim strCBText As String
Dim retval As Long
Dim lngSize As Long

If OpenClipboard(0&) <> 0 Then
'Obtain the handle to the global
'memory block that is referencing the text
'----------------------------------------
hClipMemory = GetClipboardData(CF_TEXT)
If hClipMemory <> 0 Then
'Lock Clipboard memory so we can
'reference the actual data string
'--------------------------------
lpClipMemory = GlobalLock(hClipMemory)
If lpClipMemory <> 0 Then
lngSize = GlobalSize(lpClipMemory)
strCBText = Space$(lngSize)
retval = lstrcpy(strCBText, lpClipMemory)
retval = GlobalUnlock(hClipMemory)
'Peel off the null terminating character
'---------------------------------------
strCBText = Left(strCBText, InStr(1, strCBText, Chr$(0),
0) - 1)
Else
MsgBox "Could not lock memory to copy string from."
End If
End If
Call CloseClipboard
End If

ClipBoard_GetText = strCBText

End Function


Sub tester()

Dim strTest As String

ClipBoard_SetText "This is a clipboard test"

strTest = ClipBoard_GetText

End Sub


Can't remember where I got it from, but I know it works perfect.
Works all with API, so no extra libraries needed.

RBS
 
H

Harald Staff

Hi Jos

There are libraries and there are libraries. Just insert a blank userform in
the workbook and the reference is there without further actions.

HTH. Best wishes Harald
 
J

Jos Vens

Hi Bart,

it looks like very much trouble to let it run, but also for me, it works
fine!

Thank you very much!
Jos
 
J

Jos Vens

Hi Harald,

sorry of asking more, but I was thinking further of enhancing my application
with Excel embedded in a userform. There, you have to make a reference to a
dll (you can add more controls to the set of buttons on a form and choose
Microsoft Office Spreadsheet).
I did it but my customers didn't have the .dll-file, so they got an error
message. I thought here to encounter the same problem.

So I want to re-question: is the path to the dll is stored relatively or
absolute? If the user installs on a diffent location, will he get an error
message if the dll is not installed on his machine (but I installed the
correct version (this is: OWC11.DLL) it in the program directory). I could
test it but my 2nd computer is broken.

Thanks anyway for your time!
Jos Vens

PS I see this clipboardcode is working as good as the code of the API-calls,
so this is much simpler!
 
H

Harald Staff

Hi Jos

There is no simple answer to this because there is no simple problem. But
you were initially right: References and external controls are always
trouble. Forms2 is one of the few exceptions.

Best wishes Harald
 
P

PaulD

: Grüezi Paul
:
: PaulD schrieb am 09.02.2005
:
: > Sub Macro1()
: > Dim MyData As DataObject
: > Set MyData = New DataObject
: > MyData.SetText "Enter what you want on the clipboard here"
: > MyData.PutInClipboard
: > End Sub
: >
: > In order to run since MyData is earlybind, you must go to tools
reference in
: > the VBA editor and select Microsoft Forms 2.0 Object Library. Or you
can
: > change to late bind (i.e. use CreateObject)
:
: Do you have an excple how to use latebinding with the DataObject?
: I was not able to run it this way, but maybe I used the wrong statements.

Thomas,
You appear to be correct. I made the assumption (bad Paul) that because it
was an object, late binding would be possible. After further review, I see
this is not as easy as it appeared. I would imagine code could be used to
add the reference but then you would need to check the trust access to
Visual Basic Project (doh!). Unfortunately I will be out town till Tuesday
so I can't research anymore, but I will check when I get back
Paul D
 
M

Michel Pierron

Hi Jos,
You can use Internet Explorer object:

Sub PutInClipBoard()
ClipBoardText = InputBox("Enter some text:" _
, "Test Clip Write / Read" _
, "Enter what you want on the clipboard here")
With CreateObject("InternetExplorer.Application")
..Navigate "about:blank"
..document.ParentWindow.ClipboardData _
..SetData "text", ClipBoardText
..Quit
End With
Cells(1, 1).Select
ActiveSheet.Paste
End Sub

Regards,
MP
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top