Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1620to1624
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

Zwischenablage wird gelöscht (Kopierfokus)

Zwischenablage wird gelöscht (Kopierfokus)
04.05.2018 13:52:56
Burkhard
Hallo zusammen,
es gibt ja schon einige Beiträge darüber, dass bei bestimmten Aktionen (z.B. DisplayStatusBar, Objekt.visible, Object.Enabled etc.) die Zwischenablage geleert wird, und es gibt auch Workarounds dafür. Sie basieren allerdings darauf, dass der selektierte (= zu kopierende) Bereich ("Selection") gespeichert wird. (https://www.herber.de/forum/archiv/1160to1164/1162669_Excel_Zwischenablage_ist_gleich_wieder_weg.html oder
https://www.herber.de/forum/archiv/1252to1256/1253821_Zwischenablage_loescht_sich_bei_visible_true.html)
Bei mir soll ein Bereich von einer beliebigen anderen Tabelle hierher kopiert werden. In der _ Zieltabelle sorgt ein

ActiveSheet.Buttons("BTN1").Enabled = True

dafür, dass die Zwischenablage geleert wird. An dieser Stelle hilft mir die "Selection" aber nicht weiter, denn es ist ja bereits eine andere Tabelle aktiv als die, in der sich der zu kopierende Bereich befindet.
Hat irgend jemand eine Idee, wie ich trotzdem den Inhalt der Zwischenablage behalten bzw. wiederherstellen kann?
Vielen Dank schon mal.
Burkhard

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zwischenablage wird gelöscht (Kopierfokus)
04.05.2018 14:40:02
Peter(silie)
Hallo,
versuch mal die Daten gleich ins clipboard zu jagen:
Irgendein Copy Code:
Sub a()
Dim r
With Me
Set r = .Range(.Cells(3882, 9), .Cells(1000, 9))
Dim tmp
tmp = Join(Application.Transpose(r.Value2), ";")
Clipboard_.SetClipboard (tmp)
Debug.Print Clipboard_.GetClipboard
End With
End Sub
Modul Clipboard_
Option Explicit
Private Declare Function OpenClipboard Lib "user32.dll" (ByVal hWnd As Long) As Long
Private Declare Function EmptyClipboard Lib "user32.dll" () As Long
Private Declare Function CloseClipboard Lib "user32.dll" () As Long
Private Declare Function IsClipboardFormatAvailable Lib "user32.dll" (ByVal wFormat As Long) As  _
Long
Private Declare Function GetClipboardData Lib "user32.dll" (ByVal wFormat As Long) 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 GlobalSize Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function lstrcpy Lib "kernel32.dll" Alias "lstrcpyW" (ByVal lpString1 As Long,  _
ByVal lpString2 As Long) As Long
Public Sub SetClipboard(sUniText As String)
Dim iStrPtr As Long
Dim iLen As Long
Dim iLock As Long
Const GMEM_MOVEABLE As Long = &H2
Const GMEM_ZEROINIT As Long = &H40
Const CF_UNICODETEXT As Long = &HD
OpenClipboard 0&
EmptyClipboard
iLen = LenB(sUniText) + 2&
iStrPtr = GlobalAlloc(GMEM_MOVEABLE Or GMEM_ZEROINIT, iLen)
iLock = GlobalLock(iStrPtr)
lstrcpy iLock, StrPtr(sUniText)
GlobalUnlock iStrPtr
SetClipboardData CF_UNICODETEXT, iStrPtr
CloseClipboard
End Sub
Public Function GetClipboard() As String
Dim iStrPtr As Long
Dim iLen As Long
Dim iLock As Long
Dim sUniText As String
Const CF_UNICODETEXT As Long = 13&
OpenClipboard 0&
If IsClipboardFormatAvailable(CF_UNICODETEXT) Then
iStrPtr = GetClipboardData(CF_UNICODETEXT)
If iStrPtr Then
iLock = GlobalLock(iStrPtr)
iLen = GlobalSize(iStrPtr)
sUniText = String$(iLen \ 2& - 1&, vbNullChar)
lstrcpy StrPtr(sUniText), iLock
GlobalUnlock iStrPtr
End If
GetClipboard = sUniText
End If
CloseClipboard
End Function

Anzeige
Nachtrag:
04.05.2018 14:45:32
Peter(silie)
also noch bevor du den fokus auf den button setzt, musst du die daten ins clipboard jagen.
ich frage mich ernsthaft welcher mensch bei VBA gut .Copy verwendet...
langsamer und auf gut deutsch beschissener kann man daten gar nicht transferieren.
das clipboard kannst du dir aber auch sparen, du könntest auch einfach die daten
in einer stinknormalen varible zwischenspeichern.
AW: Nachtrag:
04.05.2018 15:42:53
Burkhard
Hallo Peter(silie),
vielen Dank für die rasche und umfangreiche Antwort. Leider wird das aber so nicht funktionieren; das Kopieren findet nicht per Code, sondern "live" statt: der Benutzer markiert in einer beliebigen Tabelle (die könnte er sogar selber neu erstellt haben) einen Bereich, drückt Strg-C, wechselt in die Zieltabelle, setzt dort den Cursor in die gewünschte Zelle (falls nötig) und drückt dann Strg-V. Allerdings ist in diesem Moment die Zwischenablage schon leer, denn beim Öffnen der Zieltabelle bzw. beim SelectionChange wird der besagte "Killer-Code" durchlaufen.
Es gibt in Excel ja zwei "Arten" von Zwischenablage: die eine, die durch Kopieren eines Bereiches gefüllt wird und dann geleert wird, wenn durch ein solches "Killer-Kommando" der Kopierfokus verloren geht (das ist diese hier). Und die andere, die ihren Wert solange behält, bis sie durch einen neuen Wert überschrieben wird. (Das ist die Windows-Standard-Zwischenablage, so wie ich das verstehe.)
Wäre es möglich, die Daten (vor dem "Killer-Code") von dem einen (gefährdeten) Clipboard ins andere (permanente) zu verschieben?
Burkhard
Anzeige
AW: Nachtrag:
04.05.2018 16:10:47
Peter(silie)
Hallo,
der Code den ich vorhin reingstellt habe, kopiert die daten ins windows clipboard
und holt sie da auch wieder raus.
musst halt nur an richtiger stelle die daten reinkopieren und dann rauskopieren.
ich werd's ausprobieren
04.05.2018 17:04:45
Burkhard
OK, dann werde ich das mal ausprobieren. Ich gebe dann Bescheid, wie's funktioniert (Montag oder so).
Das Rausholen per Code brauche ich dann ja (für diesen Zweck) nicht, das bekommt der Benutzer doch mit Strg-V - oder?
Burkhard
AW: ich hab's ausprobiert
07.05.2018 12:58:58
Burkhard
Es geht (bei mir und für meine Zwecke) ein bisschen einfacher:
Sub SaveClipboardText()
Dim sText As String
sText = GetTextFromClipboard
WriteTextToClipboard (sText)
End Sub
Function GetTextFromClipboard() As String
Dim oData As New DataObject
On Error Resume Next
oData.GetFromClipboard
GetTextFromClipboard = oData.GetText
End Function
Sub WriteTextToClipboard(sText As String)
Dim oData As New DataObject
With oData
.SetText sText
.PutInClipboard
End With
End Sub
Wenn ich SaveClipboardText vor dem "Killer-Kommando" Buttons("Name").Enable aufrufe, bleibt die Zwischenablage erhalten, sogar außerhalb von Excel. Der Benutzer kann sie dann mit Strg-V einfügen.
Problem gelöst - vielen Dank an alle!
Burkhard
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige