Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Zellinhalt in Zwischenablage kopieren

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

Anzeige

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
Anzeige
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
Anzeige
Anzeige

Infobox / Tutorial

Zellinhalt in die Zwischenablage kopieren


Schritt-für-Schritt-Anleitung

Um den Inhalt zweier Excel-Zellen in die Zwischenablage zu kopieren, kannst du den folgenden VBA-Code verwenden. Dieser Code ist so ausgelegt, dass er die Inhalte der Zellen C1 und C2 in die Office-Zwischenablage überträgt.

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.
  2. Füge ein neues Modul ein (Einfügen > Modul).
  3. Kopiere den folgenden Code in das Modul:
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
    Application.Wait (Now + TimeValue("0:00:03")) ' Warte 3 Sekunden
    Set o = CreateObject(C_CLASS_MSFORMS_DATAOBJECT) ' LateBinding
    Call o.SetText(Range("C1").Text)
    Call o.PutInClipboard
    Set o = Nothing
End Sub
  1. Schließe den VBA-Editor und gehe zurück zu Excel.
  2. Du kannst nun einen Button erstellen, um diesen Code auszuführen:
    • Gehe auf Entwicklertools > Einfügen und wähle einen Schaltflächen-Button aus.
    • Weise den Button der Copy2Clipboard-Subroutine zu.

Jetzt kannst du mit einem Klick auf den Button die Zellinhalte kopieren!


Häufige Fehler und Lösungen

  • Fehler: "Der Inhalt konnte nicht in die Zwischenablage kopiert werden"

    • Überprüfe, ob der Code korrekt eingefügt wurde und die richtigen Zellreferenzen verwendet werden.
  • Zellinhalte werden nicht vollständig kopiert

    • Stelle sicher, dass du den Application.Wait-Befehl verwendest, um dem System Zeit zu geben, die Daten in die Zwischenablage zu übertragen.

Alternative Methoden

Eine alternative Methode, um Text in die Zwischenablage zu kopieren, besteht darin, die Windows API zu verwenden. Hier ist ein Beispielcode dafür:

Private Declare PtrSafe Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As LongPtr
Private Declare PtrSafe Function GlobalLock 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 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)
    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
End Sub

Mit dieser Methode kannst du die Texteffizienz erhöhen und möglicherweise die Stabilität verbessern.


Praktische Beispiele

  1. Kopiere Text aus zwei Zellen in die Zwischenablage:

    • Zelle C1: "Aufgabe erstellen"
    • Zelle C2: "Details zur Aufgabe"

    Nach Ausführung des Codes sind beide Texte in der Zwischenablage verfügbar.

  2. Verwendung in Outlook:

    • Du kannst die kopierten Inhalte direkt in ein Outlook-Aufgabenformular einfügen, indem du die entsprechenden Felder auswählst.

Tipps für Profis

  • Verwende den excel copy to clipboard button: Es ist ratsam, einen Button in der Excel-Oberfläche zu integrieren, um die Benutzerfreundlichkeit zu erhöhen.
  • Debugging: Verwende Debug.Print vor dem Kopieren in die Zwischenablage, um sicherzustellen, dass die gewünschten Inhalte korrekt abgerufen werden.

FAQ: Häufige Fragen

1. Warum funktioniert der Code manchmal nicht? Die Unzuverlässigkeit kann durch zu schnelle Ausführung ohne Wartezeiten entstehen. Achte darauf, Application.Wait zu verwenden.

2. Wie kann ich den Code anpassen, um mehr Zellen zu kopieren? Du kannst weitere SetText- und PutInClipboard-Aufrufe für jede zusätzliche Zelle hinzufügen, achte aber darauf, die Wartezeit entsprechend anzupassen.

3. Welche Excel-Version benötige ich? Der bereitgestellte Code sollte in den meisten modernen Excel-Versionen funktionieren, die VBA unterstützen, wie Excel 2010 und höher.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige