Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: PutInClipboard

PutInClipboard
05.08.2022 11:57:32
Herbert_Grom
Hallo,
habt ihr evtl. eine Idee, warum der folgende Code bei mir nur das Ergebnis des Bildes ergibt, wenn ich den Clipboardinhalt in eine eMail oder einen Notepad-Text einfügen will? Den Verweis "...2.0 Object Library" habe ich gesetzt.

Sub kopieren()
Dim objClip As DataObject, sTmp$
Set objClip = New DataObject
sTmp = Tabelle2.Cells(1, 1).Value
objClip.SetText sTmp
objClip.PutInClipboard
End Sub
Userbild
In Tabelle2.cells(1,1) steht dieser Text:
"Hallo Horst,
kannst Du mir bitte ...
...
Für eine kurze Bestätigung wäre ich Dir dankbar! Dann bis Dienstag.
Viele Grüße
Herbert"
Servus
Anzeige

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: PutInClipboard
05.08.2022 12:02:23
EtoPHG
Hallo Herbert,
und warum nicht

sTmp = Tabelle2.Cells(1, 1).Text
, wenn der Inhalt Text ist?
Gruess Hansueli
AW: PutInClipboard
05.08.2022 12:08:03
Herbert_Grom
Hallo Hansueli,
vielen Dank für deinen Tipp, der jedoch keinen Erfolg brachte. Ich habe auch schon mit einem kürzeren Text und ohne Zeilenvorschub getestet, kein Erfolg. Hast du evtl. noch eine Idee?
Servus
Anzeige
AW: PutInClipboard
05.08.2022 12:13:26
Herbert_Grom
Im "Lokal-Fenster" zeigt er mir den Inhalt von sTmp an (s. Bild), aber einfügen kann ich ihn dann nicht!
Userbild
Servus
AW: PutInClipboard
05.08.2022 12:18:40
mumpel
Hallo!
Du solltest in den aktuellen Excelversionen auf das DataObject verzichten. Nutze stattdessen "RegisterClipboardFormat" (Beispiele im Internet).
Gruß, René
Anzeige
Nachtrag: Beispiel
05.08.2022 12:23:03
mumpel
kopierenplusminus

Option Explicit


Public Declare Function RegisterClipboardFormat Lib "user32" Alias "RegisterClipboardFormatA" (ByVal lpString As String) As Long

Public Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Public Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Public Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Public Declare Function CloseClipboard Lib "user32" () As Long
Public Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function EmptyClipboard Lib "user32" () As Long
Public Declare Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, ByVal lpString2 As Any) As Long
Public Declare Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As Long) As Long

Public Const GHND = &H42
Public Const CF_TEXT = 1
Public Const MAXSIZE = 4096

Function ClipBoard_SetData(MyString As String)
   Dim hGlobalMemory As Long, lpGlobalMemory As Long
   Dim hClipMemory As Long, X As Long

   ' Allocate moveable global memory. 
   '------------------------------------------- 
   hGlobalMemory = GlobalAlloc(GHND, Len(MyString) + 1)

   ' Lock the block to get a far pointer 
   ' to this memory. 
   lpGlobalMemory = GlobalLock(hGlobalMemory)

   ' Copy the string to this global memory. 
   lpGlobalMemory = lstrcpy(lpGlobalMemory, MyString)

   ' Unlock the memory. 
   If GlobalUnlock(hGlobalMemory) <> 0 Then
      MsgBox "Could not unlock memory location. Copy aborted."
      GoTo OutOfHere2
   End If

   ' Open the Clipboard to copy data to. 
   If OpenClipboard(0&) = 0 Then
      MsgBox "Could not open the Clipboard. Copy aborted."
      Exit Function
   End If

   ' Clear the Clipboard. 
   X = EmptyClipboard()

   ' Copy the data to the Clipboard. 
   hClipMemory = SetClipboardData(CF_TEXT, hGlobalMemory)

OutOfHere2:

   If CloseClipboard() = 0 Then
      MsgBox "Could not close Clipboard."
   End If

End Function

Sub SteTEst()
  Call ClipBoard_SetData(Range("A1").Value)
End Sub

VBA/HTML-CodeConverter, AddIn für Office 2002 und höher (32-bit) und Microsoft 365 (32-bit Desktop-Version)
In VBA geschrieben von Lukas Mosimann. Projektbetreuung: René Holtz

Code erstellt und getestet in Microsoft 365 - 32-bit Desktopversion
Codedarstellung mit VBAHTML 01.2022 erstellt.

Anzeige
AW: Nachtrag: Beispiel
05.08.2022 12:36:01
Herbert_Grom
Hallo René,
funktioniert bestens, wie immer, vielen Dank!!!
Servus
AW: Nachtrag: Beispiel
05.08.2022 12:41:10
Herbert_Grom
btw, nur das "PtrSafe" und "LongPtr" habe ich geändert.
Servus
AW: Nachtrag: Beispiel
05.08.2022 12:46:54
mumpel
Nutzt Du die 64-bit-Version? Brauchst Du die wirklich?
Anzeige
AW: Nachtrag: Beispiel
05.08.2022 12:50:44
Herbert_Grom
Nee, du hast recht ich habe die 32er Version. Mach ich wieder rückgängig. Danke!
AW: Nachtrag: Beispiel
05.08.2022 13:55:03
mumpel
Probleme macht PtrSafe auf einem 64-bit-Windows jedoch nicht.
AW: PutInClipboard
05.08.2022 12:35:06
snb

Sub M_snb()
With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
.SetText cells(1).value
.PutInClipboard
End With
End Sub

Anzeige
AW: PutInClipboard
05.08.2022 12:39:00
Herbert_Grom
Vielen Dank, doch das bringt leider das gehabte Ergebnis.
Servus
AW: PutInClipboard
05.08.2022 14:00:33
Daniel
ja, ist ja auch nichts anderes, als den Verweis im Code zu aktivieren.
was passiert eigentlich, wenn du die Zelle ganz normal mit .Copy kopierst?
das .Copy bedient nicht nur die Excel-Zwischenablage sondern füllt auch die Windwos-Zwischenablage mit Daten.
(zumindest in Excel 2016)
Dieser Zugriff auf die Zwischenablage wird eigentlich nur benötigt, wenn man entweder die Windows-Zwischenablage auslesen will, oder in VBA erzeugte Daten dort hinein geben will.
Aber Zellinhalte müssten eigentlich mit dem einfachen .Copy übernommen werden.
Gruß Daniel
Anzeige
AW: PutInClipboard
05.08.2022 15:20:10
Herbert_Grom
Hallo Daniel,
das mit copy ist mir bekannt und das benutze ich ja auch. Ich wollte aber wissen, wieso "PutInClipboard" nicht funktioniert. Vielen Dank.
Servus
StalinClipboard ...
08.08.2022 16:19:45
lupo1
AW: StalinClipboard ...
08.08.2022 18:14:17
Herbert_Grom
Und was willst du mir damit sagen?
Anzeige
AW: Das war Version 2.0 jetzt nähern wir uns 3.0
09.08.2022 16:10:10
EtoPHG

;
Anzeige

Infobox / Tutorial

Problemlösung für PutInClipboard in Excel VBA


Schritt-für-Schritt-Anleitung

  1. Referenz einfügen: Stelle sicher, dass der Verweis auf "Microsoft Forms 2.0 Object Library" gesetzt ist. Gehe dazu in den VBA-Editor unter Extras -> Verweise und aktiviere die entsprechende Bibliothek.

  2. VBA-Code erstellen: Verwende den folgenden VBA-Code, um den Inhalt einer Zelle in die Zwischenablage zu kopieren:

    Sub kopieren()
       Dim objClip As DataObject
       Dim sTmp As String
       Set objClip = New DataObject
       sTmp = Tabelle2.Cells(1, 1).Value
       objClip.SetText sTmp
       objClip.PutInClipboard
    End Sub
  3. Alternative Methode: Wenn dieser Code nicht funktioniert, versuche die Verwendung von .Text anstelle von .Value:

    sTmp = Tabelle2.Cells(1, 1).Text
  4. Testen: Führe den Code aus und teste das Einfügen in Notepad oder eine E-Mail.


Häufige Fehler und Lösungen

  • Fehler: "PutInClipboard not working": Möglicherweise fehlt der Verweis auf die "Microsoft Forms 2.0 Object Library". Überprüfe die Verweise im VBA-Editor.

  • Fehler: Kein Einfügen möglich: Überprüfe, ob der Clipboard-Inhalt tatsächlich gesetzt wurde. Du kannst den Inhalt im "Lokal-Fenster" mit Debug.Print objClip.GetText anzeigen lassen.

  • Fehler bei 64-Bit Excel: Wenn Du die 64-Bit-Version von Excel verwendest, stelle sicher, dass Du die Deklarationen in Deinem Code mit PtrSafe und LongPtr aktualisierst.


Alternative Methoden

  • Statt DataObject zu verwenden, kannst Du die Windows-API-Funktionen nutzen, um direkt mit der Zwischenablage zu arbeiten. Hier ist ein Beispiel, wie es geht:

    Public Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
    Public Declare Function EmptyClipboard Lib "user32" () As Long
    Public Declare Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As Long) As Long
    
    Sub ClipBoard_SetData(MyString As String)
       Dim hGlobalMemory As Long
       hGlobalMemory = GlobalAlloc(GHND, Len(MyString) + 1)
       ' Weiterer Code zur Handhabung des Clipboard
    End Sub

Praktische Beispiele

Hier sind einige nützliche Beispiele für die Verwendung von PutInClipboard:

  1. Einfaches Kopieren einer Zelle:

    Sub CopyCellToClipboard()
       Dim DataObj As New MSForms.DataObject
       DataObj.SetText Range("A1").Value
       DataObj.PutInClipboard
    End Sub
  2. Kopieren mehrerer Zellen:

    Sub CopyRangeToClipboard()
       Dim DataObj As New MSForms.DataObject
       DataObj.SetText Range("A1:A10").Value
       DataObj.PutInClipboard
    End Sub
  3. Kopieren mit Formatierung: Wenn Du formatierte Daten kopieren möchtest, ist es besser, die .Copy Methode zu verwenden:

    Range("A1").Copy

Tipps für Profis

  • Clipboard leeren: Um sicherzustellen, dass der Clipboard-Inhalt vor dem Kopieren geleert wird, kannst Du EmptyClipboard verwenden:

    EmptyClipboard
  • Debugging: Nutze das "Lokal-Fenster" im VBA-Editor, um den aktuellen Inhalt der Variablen zu überprüfen. Dies hilft, Fehler schnell zu identifizieren.

  • 64-Bit Unterstützung: Stelle sicher, dass Dein VBA-Code sowohl für 32-Bit als auch für 64-Bit Excel funktioniert, indem Du die richtigen Datentypen verwendest.


FAQ: Häufige Fragen

1. Warum funktioniert PutInClipboard nicht? Es könnte sein, dass der Verweis auf die "Microsoft Forms 2.0 Object Library" fehlt oder dass Du die falsche Excel-Version verwendest.

2. Wie kann ich den Clipboard-Inhalt überprüfen? Du kannst den Inhalt des Clipboards mit Debug.Print objClip.GetText im "Lokal-Fenster" anzeigen lassen.

3. Gibt es eine Möglichkeit, die Zwischenablage in 64-Bit Excel zu verwenden? Ja, Du musst sicherstellen, dass die Deklarationen in Deinem Code PtrSafe und LongPtr verwenden, um die Kompatibilität mit 64-Bit Excel sicherzustellen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige