In einem Makro habe ich einen String gegeben und will diesen in die Zwischenablage kopieren. Über die Funktion 'PutInClipboard' ist das nur möglich, wenn ich ein Steuerelement in die Tabelle einfüge. Geht das auch auf direktem Weg ?
In einem Makro habe ich einen String gegeben und will diesen in die Zwischenablage kopieren. Über die Funktion 'PutInClipboard' ist das nur möglich, wenn ich ein Steuerelement in die Tabelle einfüge. Geht das auch auf direktem Weg ?
"In einem Makro habe ich einen String gegeben..." verstehe ich nicht.
ansonsten mit selection.copy oder ist das zu simpel.
gruss thomas
vielen Dank für die Rückmeldung. Der String, den ich kopieren will, befindet sich nicht in einer Zelle (ist wohl somit auch nicht über Selection.Copy greifbar), sondern wird im Makro selber nach und nach aufgebaut und soll dann in die Zwischenablage eingefügt werden, um ihn in anderen Programmen weiterzuverwenden. Ich könnte ihn natürlich in eine Zelle schreiben, diese markieren und anschließend kopieren. Die Frage ist jetzt, ob das auch direkt geht.
bin absolut kein VBA crack, kann Dir deswegen nicht weiterhelfen.
vorschlag: poste neu und fuege Deinen code dazu, vielleicht findet sich ein "erleuchteter" ;-)
gruss thomas
Ich würde dazu eine Klasse erstellen ...
Code für Klasse (CClipboard):
Private Declare Function CloseClipboard Lib "user32" () As Long Private Declare Function GlobalAlloc Lib "kernel32" ( _ Private Const CF_TEXT = 1 Private Const GMEM_FIXED = &H0
Option Explicit
Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long
Private Declare Function SetClipboardData_ Lib "user32" Alias "SetClipboardData" ( _
ByVal wFormat As Long, ByVal hMem As Long) As Long
Private Declare Function IsClipboardFormatAvailable Lib "user32" ( _
ByVal wFormat As Long) As Long
ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
ByVal strDest As Any, ByVal lpSource As Any, ByVal Length As Long)
Private Const GMEM_MOVEABLE = &H2
Private Const GMEM_NOCOMPACT = &H10
Private Const GMEM_NODISCARD = &H20
Private Const GMEM_ZEROINIT = &H40
Private Const GMEM_MODIFY = &H80
Private Const GMEM_DISCARDABLE = &H100
Private Const GMEM_NOT_BANKED = &H1000
Private Const GMEM_SHARE = &H2000
Private Const GMEM_DDESHARE = &H2000
Private Const GMEM_NOTIFY = &H4000
Private Const GMEM_LOWER = GMEM_NOT_BANKED
Private Const GMEM_VALID_FLAGS = &H7F72
Private Const GMEM_INVALID_HANDLE = &H8000
Private Const GHND = (GMEM_MOVEABLE Or GMEM_ZEROINIT)
Private Const GPTR = (GMEM_FIXED Or GMEM_ZEROINIT)
Public Sub SetClipboardData(ByVal Text As String)
Dim wLen As Long
Dim hMemory As Long
Dim lpMemory As Long
OpenClipboard 0&
EmptyClipboard
wLen = Len(Text) + 1
Text = Text & Chr$(0)
hMemory = GlobalAlloc(GHND, wLen + 1)
lpMemory = GlobalLock(hMemory)
MoveMemory lpMemory, Text, wLen
GlobalUnlock hMemory
SetClipboardData_ CF_TEXT, lpMemory
CloseClipboard
GlobalFree hMemory
End Sub
Der Aufruf könnte dann etwa so erfolgen:
Dim Clipboard As New CClipboard Sub Test() Dim Text$: Text = "Testwert" Clipboard.SetClipboardData Text
Code eingefügt mit Syntaxhighlighter 1.15
Option Explicit
End Sub
Gruß
Thomas
Risi Thomas Softwareentwicklung
harald
Das funktioniert auch bei Dir ...
Du mußt den ersten Teil (Code für Klasse) in ein Klassenmodul einfügen, und diese Klasse dann mit 'CClipboard' benennen. Dann sollte der Aufruf funzen, und zwar immer !
Die Lösung von Ralf wird nur dann funktionieren, wenn der Verweis 'Microsoft Forms 2.0 Object Library' existiert. Das ist dann der Fall, wenn ein Control in die Mappe eingebunden ist (war), und genau das wolltest Du doch nicht. Erstelle mal eine neue Mappe und probier mal, ob es immer noch funktioniert.
Gruß
Thomas
Risi Thomas Softwareentwicklung
also das Erstellen einer Klasse hat inzwischen geklappt, die Prozedur läuft ohne Fehlermeldung, dennoch wird der Text nicht in die Zwischenablage kopiert, sondern nur deren vorheriger Inhalt gelöscht.
harald
PS: Du hattest teilweise recht, was die Lösung von Ralf angeht. Bei neuerstellten Mappen gibt u.U. Probleme. Interessanterweise funktioniert sie auf dem einen Rechner (Internetzugang; Excel 97), während sie auf dem relevanten Rechner (Excel 2000) fehlschlägt. Dort muß wie bisher ein Steuerelement eingefügt (gewesen) sein. Interessant sind hierbei auch die entsprechenden Dateigrößen:
neue Mappe (ohne Steuerelement) mit Makrocode: 17 kb
nach Einfügen und anschließendem Löschen des Steuerelements: 22kb
Ein Steuerelement hinterläßt offenbar bleibende Spuren.