Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1708to1712
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
Inhaltsverzeichnis

CopytoClipboard will nicht

CopytoClipboard will nicht
28.08.2019 14:37:57
Julius
Hallöchen,
ich hätte da noch einmal eine Frage.
Ich möchte aus einer Textbox den Inhalt in die Zwischenablage durch einen Button kopieren. In meinem Fall eine E-Mailadresse.
Lt der Excel VBA Seite muss ich das so machen:
Private Sub CommandButtonCopyMail_Click()
Set copyEmail = New DataObject
copyEmail.SetText TextBoxEmail.Text
copyEmail.PutInClipboard
End Sub

Dazu habe ich noch ein Modul angelegt.

Option Explicit
Public copyEmail As DataObject

Theoretisch funktioniert das. Aber, wenn ich kurz danach etwas anderes kopiere, zb im Browser einen Text oder wo auch immer und danach dann wieder den Button drücke, gibt er mir nur zwei Leerzeichen aus.
Jetzt hab ich gedacht, okay, dann ist sicher der Zwischenspeicher belegt und muss vorher geleert werden. Da habe ich auch schon gesehen, dass es eine Funktion gibt. (Application.CutCopyMode = false)
Wenn ich es jedoch vorranstelle, klappt es nicht. Bzw weiß ich nicht so recht, wo ich ansetzen muss.
Für einen Hinweis wäre ich dankbar :)

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: CopytoClipboard will nicht
28.08.2019 15:07:00
Torsten
Hallo Julius,
versuchs mal so. Alles in ein Modul:

Option Explicit
Private Declare Function OpenClipboard Lib "user32.dll" ( _
ByVal hwnd As Long) As Long
Private Declare Function CloseClipboard Lib "user32.dll" () As Long
Private Declare Function EmptyClipboard 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 GlobalFree Lib "kernel32.dll" ( _
ByVal hMem As Long) As Long
Private Declare Function lstrcpy Lib "kernel32.dll" ( _
ByVal lpStr1 As Any, _
ByVal lpStr2 As Any) As Long
Private Const CF_TEXT As Long = 1&
Private Const GMEM_MOVEABLE As Long = 2&
Public Sub copy_to_clip()
Dim strText As String
strText = UserForm1.TextBoxEmail.Text 'den Namen deiner Userform aendern oder des sheets,  _
wo die Textbox ist
Call StringToClipboard(strText)
End Sub
Private Sub StringToClipboard(strText As String)
Dim lngIdentifier As Long, lngPointer As Long
lngIdentifier = GlobalAlloc(GMEM_MOVEABLE, Len(strText) + 1)
lngPointer = GlobalLock(lngIdentifier)
Call lstrcpy(ByVal lngPointer, strText)
Call GlobalUnlock(lngIdentifier)
Call OpenClipboard(0&)
Call EmptyClipboard
Call SetClipboardData(CF_TEXT, lngIdentifier)
Call CloseClipboard
Call GlobalFree(lngIdentifier)
End Sub

Dann einfach mit einem Button, nachdem die Textbox gefuellt ist, die Sub copy_to_clip aufrufen.
Gruss Torsten
Anzeige
AW: CopytoClipboard will nicht
28.08.2019 15:32:15
Julius
Hallo Thorsten, danke für den code. Ich bekomme jedoch eine Meldung:
---------------------------
Microsoft Visual Basic for Applications
---------------------------
Fehler beim Kompilieren:
Der Code in diesem Projekt muss für die Verwendung auf 64-Bit-Systemen aktualisiert werden. Überarbeiten und aktualisieren Sie Declare-Anweisungen, und markieren Sie sie mit dem PtrSafe-Attribut.
---------------------------
OK Hilfe
---------------------------
Damit kann ich jedoch noch nichts anfangen. Wie stellt man das denn auf 64bit um?
AW: CopytoClipboard will nicht
28.08.2019 15:36:48
Julius
Ich hab es nun so umgestellt:
 Option Explicit
Private Declare PtrSafe Function OpenClipboard Lib "user32.dll" ( _
ByVal hwnd As Long) As Long
Private Declare PtrSafe Function CloseClipboard Lib "user32.dll" () As Long
Private Declare PtrSafe Function EmptyClipboard Lib "user32.dll" () As Long
Private Declare PtrSafe Function SetClipboardData Lib "user32.dll" ( _
ByVal wFormat As Long, _
ByVal hMem As Long) As Long
Private Declare PtrSafe Function GlobalAlloc Lib "kernel32.dll" ( _
ByVal wFlags As Long, _
ByVal dwBytes As Long) As Long
Private Declare PtrSafe Function GlobalLock Lib "kernel32.dll" ( _
ByVal hMem As Long) As Long
Private Declare PtrSafe Function GlobalUnlock Lib "kernel32.dll" ( _
ByVal hMem As Long) As Long
Private Declare PtrSafe Function GlobalFree Lib "kernel32.dll" ( _
ByVal hMem As Long) As Long
Private Declare PtrSafe Function lstrcpy Lib "kernel32.dll" ( _
ByVal lpStr1 As Any, _
ByVal lpStr2 As Any) As Long
Private Const CF_TEXT As Long = 1&
Private Const GMEM_MOVEABLE As Long = 2&

lässt sich das so machen?
Anzeige
wieder offen 64 bit
28.08.2019 15:38:25
Torsten
mit 64 bit kenn ich mich nicht so aus. Keine Ahnung, ob das da geht.
AW: wieder offen 64 bit
28.08.2019 15:49:31
Julius
Okay, ich hab den Code entsprechend auf 64bit umgestellt (hoffe ich). Anhand der Hilfeseite.
Ich rufe nun auch die copy_to_clip mit dem Button auf. Soweit keine Fehler beim drücken :D
Aber leider kopiert er mir nichts in den Zwischenspeicher. Weiterhin 2 Leerzeichen.
 Option Explicit
Private Declare PtrSafe Function OpenClipboard Lib "user32.dll" ( _
ByVal hwnd As LongPtr) As LongPtr
Private Declare PtrSafe Function CloseClipboard Lib "user32.dll" () As LongPtr
Private Declare PtrSafe Function EmptyClipboard Lib "user32.dll" () As LongPtr
Private Declare PtrSafe Function SetClipboardData Lib "user32.dll" ( _
ByVal wFormat As LongPtr, _
ByVal hMem As LongPtr) As LongPtr
Private Declare PtrSafe Function GlobalAlloc Lib "kernel32.dll" ( _
ByVal wFlags As LongPtr, _
ByVal dwBytes As LongPtr) As LongPtr
Private Declare PtrSafe Function GlobalLock Lib "kernel32.dll" ( _
ByVal hMem As LongPtr) As LongPtr
Private Declare PtrSafe Function GlobalUnlock Lib "kernel32.dll" ( _
ByVal hMem As LongPtr) As LongPtr
Private Declare PtrSafe Function GlobalFree Lib "kernel32.dll" ( _
ByVal hMem As LongPtr) As LongPtr
Private Declare PtrSafe Function lstrcpy Lib "kernel32.dll" ( _
ByVal lpStr1 As Any, _
ByVal lpStr2 As Any) As LongPtr
Private Const CF_TEXT As LongPtr = 1&
Private Const GMEM_MOVEABLE As LongPtr = 2&
Public Sub copy_to_clip()
Dim strText As String
strText = Userform1.TextBoxEmail.Text 'den Namen deiner Userform aendern oder des sheets,  _
_
wo die Textbox ist
Call StringToClipboard(strText)
End Sub
Private Sub StringToClipboard(strText As String)
Dim lngIdentifier As LongPtr, lngPointer As LongPtr
lngIdentifier = GlobalAlloc(GMEM_MOVEABLE, Len(strText) + 1)
lngPointer = GlobalLock(lngIdentifier)
Call lstrcpy(ByVal lngPointer, strText)
Call GlobalUnlock(lngIdentifier)
Call OpenClipboard(0&)
Call EmptyClipboard
Call SetClipboardData(CF_TEXT, lngIdentifier)
Call CloseClipboard
Call GlobalFree(lngIdentifier)
End Sub
Name der Userform passt. Die heißt rein-zufällig auch Userform1
Anzeige
AW: wieder offen 64 bit
28.08.2019 15:53:03
Torsten
Probier mal den Einzelschrittmodus und schau nach, ob die Variable strText ueberhaupt einen Wert erhaelt. Am Besten einen Haltepunkt setzen bei
Call StringToClipboard(strText)

AW: wieder offen 64 bit
28.08.2019 16:05:08
Julius
Ach wie dumm. Danke für den Hinweis mit den Einzelschritten. Mir ist dabei aufgefallen, das ich cop_to_clip in die falsche Prozedur geschrieben habe. Der Button hat nix gemacht xD xD da dieser für E-Mail Senden bestimmt ist und ich hier noch nix gemacht habe.
Ich danke dir. Aktuell scheint es zu Funktionieren. Ich probiere ein paar Szenarien durch und schaue ob es zu Fehlern kommt. :)
Desweiteren muss ich mir mal den Code von dir anschauen, was der überhaupt alles macht, damit ich da mal durch steige. Oder kannst du das in wenigen Worten grob umreisen?
Danke danke danke
Anzeige
AW: wieder offen 64 bit
29.08.2019 07:21:07
Julius
Also soweit ich es überblicken kann funktioniert alles.
Für alle die an einem Ähnlichen Problem hängen, anbei der Code:
Die Prozedur für den Button:
Private Sub CommandButtonCopyMail_Click()
copy_to_clip
End Sub
Hier die copby_to_clip Sub in einem eigenen Modul:
Option Explicit
Private Declare PtrSafe Function OpenClipboard Lib "user32.dll" ( _
ByVal hwnd As LongPtr) As LongPtr
Private Declare PtrSafe Function CloseClipboard Lib "user32.dll" () As LongPtr
Private Declare PtrSafe Function EmptyClipboard Lib "user32.dll" () As LongPtr
Private Declare PtrSafe Function SetClipboardData Lib "user32.dll" ( _
ByVal wFormat As LongPtr, _
ByVal hMem As LongPtr) As LongPtr
Private Declare PtrSafe Function GlobalAlloc Lib "kernel32.dll" ( _
ByVal wFlags As LongPtr, _
ByVal dwBytes As LongPtr) As LongPtr
Private Declare PtrSafe Function GlobalLock Lib "kernel32.dll" ( _
ByVal hMem As LongPtr) As LongPtr
Private Declare PtrSafe Function GlobalUnlock Lib "kernel32.dll" ( _
ByVal hMem As LongPtr) As LongPtr
Private Declare PtrSafe Function GlobalFree Lib "kernel32.dll" ( _
ByVal hMem As LongPtr) As LongPtr
Private Declare PtrSafe Function lstrcpy Lib "kernel32.dll" ( _
ByVal lpStr1 As Any, _
ByVal lpStr2 As Any) As LongPtr
Private Const CF_TEXT As LongPtr = 1&
Private Const GMEM_MOVEABLE As LongPtr = 2&
Public Sub copy_to_clip()
Dim strText As String
strText = Userform1.TextBoxEmail.Text
Call StringToClipboard(strText)
End Sub
Private Sub StringToClipboard(strText As String)
Dim lngIdentifier As LongPtr, lngPointer As LongPtr
lngIdentifier = GlobalAlloc(GMEM_MOVEABLE, Len(strText) + 1)
lngPointer = GlobalLock(lngIdentifier)
Call lstrcpy(ByVal lngPointer, strText)
Call GlobalUnlock(lngIdentifier)
Call OpenClipboard(0&)
Call EmptyClipboard
Call SetClipboardData(CF_TEXT, lngIdentifier)
Call CloseClipboard
Call GlobalFree(lngIdentifier)
End Sub
Wichtig an dieser Stelle, der Code ist so umgestellt, das er sowohl in einer 32bit als auch einer 64bit Umgebung arbeiten kann. Mehr Infos findet Ihr auf der Hilfeseite:
https://docs.microsoft.com/de-de/office/vba/language/concepts/getting-started/64-bit-visual-basic-for-applications-overview
Anzeige
AW: wieder offen 64 bit
28.08.2019 19:55:02
volti
Hallo Julius,
das von Dir beschriebene Phänomen habe ich auch, nachdem die Firma auf Windows 10 umgestellt hat. Vorher funktionierte jahrelang Deine Erstversion problemlos. Ich weiß nicht, was M$ da wieder gemacht hat. :-(
Die API-Funktionalitäten hatte ich ganz früher auch benutzt, vor allen in EXE-Programmen und sollten funktionieren. Hier grober Ablauf:
Speicher bereitstellen - Zeiger drauf - Und blockieren - Zeiger auf den Text - Clipboard öffnen - leer machen - Text reinsetzen - Clipboard schließen - Speicher wieder freigeben
Man kann aber auch ein wenig abkürzen:
Probier mal dieses hier, bei mir geht's.

Text = "MeinText"
CreateObject("HTMLfile").ParentWindow.ClipboardData.SetData "text", Text

viele Grüße
Karl-Heinz
Anzeige
AW: wieder offen 64 bit
29.08.2019 07:10:51
Julius
Moin volti,
danke für den Tipp. Wo genau muss ich denn ansetzen? Ist Text die Textbox? Gehört das in die Prozedur des Buttons?
Danke dir :)
AW: wieder offen 64 bit
29.08.2019 08:17:49
volti
Moin Julias,
hier mal in Deine Sub eingebaut. Text ist eine Variant-Variable, in der der zu kopierende Text steht. Ggf. reicht aber einfach nur die grüne Zeile. Ich weiß grad nicht, ob die TextBoxEmail.Text auch akzeptiert wird.
Private Sub CommandButtonCopyMail_Click()
  DIM Text as Variant
  Text = TextBoxEmail.Text
   CreateObject("HTMLfile").ParentWindow.ClipboardData.SetData "text", Text            
'  CreateObject("HTMLfile").ParentWindow.ClipboardData.SetData "text",TextBoxEMail.Text  
End Sub

viele Grüße
Karl-Heinz
Anzeige
AW: CopytoClipboard will nicht
28.08.2019 15:11:52
Nepumuk
Hallo Julius,
klar, wenn du etwas anderes kopierst, überschreibst du das ClipBoard. Windows hat nur eines.
Gruß
Nepumuk
AW: CopytoClipboard will nicht
28.08.2019 15:14:55
Torsten
Uebrigens:
Application.CutCopyMode = false
ist nur fuer den Excel Zwischenspeicher, nicht fuer den von Windows
AW: CopytoClipboard will nicht
28.08.2019 15:52:04
Julius
Hallo Nepumuk,
danke für die Info. Das Problem ist nur, dass ich danach nichts mit dem Button und der Sub kopieren kann. Es kommen immer nur zwei leerzeichen. Ich müsste den Zwischenspeicher ggf vorher leeren, bevor er etwas rein kopiert? Aber wie. :D
Vielen Dank

299 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige