Live-Forum - Die aktuellen Beiträge
Datum
Titel
29.03.2024 13:14:12
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1732to1736
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
Zellinhalt in Zwischenablage kopieren
23.01.2020 09:46:10
Wolfgang
Hallo an die Expertenrunde,
Ich will mit einem Button den Inhalt zweier Excel-Zellen in die Office-Zwischenablage kopieren. Zelle 1 enthält eine Handlungsanweisung, Zelle 2 Informationen, was zu tun ist.
Ziel und Sinn der Sache ist es, die Daten in eine Outlook-Aufgabe zu überragen mit zwei Klicks auf das Clipboard-Menu: Einmal für die Aufgaben-Titelzeile und noch einmal für den Textkörper des Aufgabenformulars.
Dazu habe ich mir Code aus dem Web gefischt und um eine zweite Zelle ergänzt. Es handelt sich um ein Coding, von dem ich genau Null verstehe. Die zu kopierenden Daten stehen im Beispielcode in den Zellen C1 und C2.
Dieser Code funktioniert bei mir manchmal korrekt, manchmal wird nur die erste Zelle kopiert und manchmal kommt eine Fehlermeldung.
Ich danke vorweg schon mal allen für euer wertvolles Wissen!
Sub Copy2Clipboard
Const C_CLASS_MSFORMS_DATAOBJECT As String = "new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}"
Dim o As MSForms.DataObject  ' EarlyBinding
Dim o As Object              ' LateBinding (nur wenn keine Userform vorhanden ist)
Dim s As String
Set o = New MSForms.DataObject ' EarlyBinding
Set o = CreateObject(C_CLASS_MSFORMS_DATAOBJECT) ' LateBinding
Set o = CreateObject(C_CLASS_MSFORMS_DATAOBJECT) ' LateBinding
s = Range("C1").Text
Call o.SetText(s, 1)
Call o.PutInClipboard
Set o = Nothing
Set o = CreateObject(C_CLASS_MSFORMS_DATAOBJECT) ' LateBinding
s = Range("C2").Text
Call o.SetText(s, 1)
Call o.PutInClipboard
Set o = Nothing
End Sub

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zellinhalt in Zwischenablage kopieren
23.01.2020 09:55:04
Nepumuk
Hallo Wolfgang,
warum machst du alles doppelt und dreifach in der Prozedur?
Das genügt vollkommen:
Sub Copy2Clipboard()
Const C_CLASS_MSFORMS_DATAOBJECT As String = "new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}"
Dim o As Object
Set o = CreateObject(C_CLASS_MSFORMS_DATAOBJECT) ' LateBinding
Call o.SetText(Range("C2").Text)
Call o.PutInClipboard
Set o = Nothing
End Sub

Gruß
Nepumuk
AW: Zellinhalt in Zwischenablage kopieren
23.01.2020 10:05:39
volti
Hallo Wolfgang,
hier noch eine Alternative, um Text zu kopieren:
Private Declare PtrSafe Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, _
        ByVal dwBytes As LongPtr) As LongPtr
Private Declare PtrSafe Function GlobalFree Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr
Private Declare PtrSafe Function GlobalLock Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr
Private Declare PtrSafe Function GlobalSize Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr
Private Declare PtrSafe Function GlobalUnlock Lib "kernel32" (ByVal hMem As LongPtr) As Long
Private Declare PtrSafe Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, _
        ByVal lpString2 As Any) As LongPtr
Private Declare PtrSafe Function SetClipboardData Lib "user32" (ByVal wFormat As Long, _
        ByVal hMem As LongPtr) As LongPtr
Private Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hWnd As LongPtr) As Long
Private Declare PtrSafe Function CloseClipboard Lib "user32" () As Long
Private Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long
Sub KopiereTextInZwischenablage(sCliptext As String)
'Kopieren von Text über die API
 Dim hMem As LongPtr, lpGMem As LongPtr
 hMem = GlobalAlloc(&H42, Len(sCliptext) + 1)
 lpGMem = GlobalLock(hMem)
 lpGMem = lstrcpy(lpGMem, sCliptext)
 If GlobalUnlock(hMem) = 0 Then
  If OpenClipboard(0&) <> 0 Then
   EmptyClipboard
   SetClipboardData 1, hMem  '=CF_TEXT
   CloseClipboard
  End If
 End If
'GlobalFree hMem     'nur einmalig bereitstellen, Zwischenablage löschen
End Sub
Sub Test()
 KopiereTextInZwischenablage Range("C2").Text
End Sub

viele Grüße
Karl-Heinz

Anzeige
AW: Zellinhalt in Zwischenablage kopieren
23.01.2020 15:43:35
Wolfgang
Nepomuk und Karl-Heinz, danke euch!
Ich kopiere ja 2 Zellen nacheinander in das Clipboard und rufe den Inhalt dann auch so wieder ab mit 2 x einfügen - einmal in die Kopfzeile und einmal in den Body. Habe den Code von Nepomuk probiert und klappt mit dem Zellinhalt C2. Erweitere ich das um C1, dann wurde es nur im Schritt-für-Schritt-Modus richtig übertragen; lasse ich den Code normal ablaufen, wurde nur eine Zelle in das Clipboard kopiert. Habe mir deshalb den Wartemodus ergoogelt und es dürfte jetzt funktionieren.
Karl-Heinz, danke dir ebenfalls, deine Lösung war für mich ein wenig zu hoch ;-)
Hier meine derzeitige Codeversion, vielleicht nicht 100 % professionell, aber effektiv:
Sub Copy2Clipboard()
'Kopiert den Content der Zellen C1 und C2 in zwei
'Schritten in die Office Zwischenablage.
'Anschließend Aufgabe manuell anlegen. Öffnen der Zwischenablage,
'Klick 1 in die Titelzeile, Klick 2 in das Textfeld der Aufgabe.
Const C_CLASS_MSFORMS_DATAOBJECT As String =
_"new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}"
Dim o As Object
Set o = CreateObject(C_CLASS_MSFORMS_DATAOBJECT) ' LateBinding
Call o.SetText(Range("C2").Text)
Call o.PutInClipboard
Set o = Nothing
Application.Wait (Now + TimeValue("0:00:03"))
Set o = CreateObject(C_CLASS_MSFORMS_DATAOBJECT) ' LateBinding
Call o.SetText(Range("C1").Text)
Call o.PutInClipboard
Set o = Nothing
End Sub

Anzeige

305 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige