Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
188to192
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
188to192
188to192
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Daten in Zwischenablage kopieren

Daten in Zwischenablage kopieren
06.12.2002 15:54:47
harald
Hallo,

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 ?

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Re: Daten in Zwischenablage kopieren
06.12.2002 16:15:06
th.heinrich
hallo Harald,

"In einem Makro habe ich einen String gegeben..." verstehe ich nicht.

ansonsten mit selection.copy oder ist das zu simpel.

gruss thomas

Re: Daten in Zwischenablage kopieren
06.12.2002 16:25:36
harald
Hallo,

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.

Anzeige
Re: Daten in Zwischenablage kopieren
06.12.2002 16:51:12
th.heinrich
hi Harald,

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

Re: Daten in Zwischenablage kopieren
06.12.2002 19:36:23
Thomas Risi
Hallo Harald

Ich würde dazu eine Klasse erstellen ...

Code für Klasse (CClipboard):


Option Explicit

Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As LongAs Long
Private Declare Function EmptyClipboard Lib "user32" () As Long
Private Declare Function SetClipboardData_ Lib "user32" Alias "SetClipboardData" ( _
 ByVal wFormat As LongByVal hMem As LongAs Long
Private Declare Function IsClipboardFormatAvailable Lib "user32" ( _
 ByVal wFormat As LongAs Long

Private Declare Function GlobalAlloc Lib "kernel32" ( _
 ByVal wFlags As LongByVal dwBytes As LongAs Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As LongAs Long
Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As LongAs Long
Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As LongAs Long
Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
 ByVal strDest As Any, ByVal lpSource As Any, ByVal Length As Long)

Private Const CF_TEXT = 1

Private Const GMEM_FIXED = &H0
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:


Option Explicit

Dim Clipboard As New CClipboard

Sub Test()

    Dim Text$: Text = "Testwert"

    Clipboard.SetClipboardData Text
    
End Sub
 

     Code eingefügt mit Syntaxhighlighter 1.15

Gruß

Thomas

Risi Thomas Softwareentwicklung


Anzeige
ganz einfach so...
06.12.2002 19:39:55
Ralf Sögel
Das mit der Textbox ist ein Irrtum, es geht auch so:
Option Explicit
Dim Clip As DataObject
Sub ins_clipboard()
Dim Text As String
Text = "Testtext"
Set Clip = New DataObject
Clip.SetText Text
Clip.PutInClipboard
End Sub

Re: ganz einfach so...
06.12.2002 22:12:58
harald
Vielen Dank, funktioniert ganz prima.
Das mit den Datenobjekten habe ich offensichtlich noch nicht gerafft (auch wegen der m.A. nach wenig intuitiven Erklärungen der Excelhilfe hierzu), ich hatte im Prozedurteil statt "Set Clip = New DataObject" doppelt deklariert mit "Dim Clip As New DataObject".

harald

Re: Daten in Zwischenablage kopieren
06.12.2002 22:24:47
harald
Vielen Dank für deine Bemühungen. Leider funktioniert dieser Weg bei mir nicht. Excel erkennt im Modulteil den Dateityp CClipboard nicht und meldet: "Benutzerdefinierter Typ nicht definiert". Ich benutze Excel 2000 (9.0.2812), möglicherweise ist dieser Dateityp erst in höheren Versionen definiert.
Anzeige
Re: Daten in Zwischenablage kopieren
06.12.2002 22:55:56
Thomas Risi
Hallo 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


Anzeige
Re: Daten in Zwischenablage kopieren
07.12.2002 14:17:49
harald
Hallo Thomas,

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.


Anzeige

304 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige