Registriert seit: 10.04.2014
Version(en): 97-2019 (32) + 365 (64)
Hallo Stefan,
Leider fällt mir im Moment keine Lösung ein Ich vermute aber, das es auch mit einem Windows Update zu tun haben könnte, ...
. \\\|/// Hoffe, geholfen zu haben.
( ô ô ) Grüße, André aus G in T
ooO-(_)-Ooo (Excel 97-2019+365)
Registriert seit: 26.09.2015
Version(en): 2013
Vielen Dank, Ich glaube auch, dass momentan nichts zu erreichen ist.
Als Umgehung dachte ich mir folgendes:
Ich markiere den Text und Kopieren in mit CTRL+C in den Zwischenspeicher.
Ich lese mit VBA den Zwischenspeicher aus.
Wie könnte ich das bewerkstelligen. Irgendwie habe ich immer einen leeren Zwischenspeicher oder den vorherigen Text. Es ist zum Verzweifeln.
Gruss
Stefan
Registriert seit: 10.04.2014
Version(en): 97-2019 (32) + 365 (64)
Hallo Stefan,
Wenn Du mit ..c kopierst und mit ..v nicht das gleiche kommt, verhindert deine Anwendung vielleicht das Kopieren. VBA kann Dir dann leider auch nicht helfen.
. \\\|/// Hoffe, geholfen zu haben.
( ô ô ) Grüße, André aus G in T
ooO-(_)-Ooo (Excel 97-2019+365)
Registriert seit: 26.09.2015
Version(en): 2013
17.09.2017, 11:27
(Dieser Beitrag wurde zuletzt bearbeitet: 17.09.2017, 11:29 von Stefan1.)
Nein, ich war nicht präzise genug. Mit den Tastenkombinationen CTRL+C und CTRL+V geht das manuell in Ordnung. Doch mit VBA gibt es immer wieder Probleme. Wie geht die sicherste Möglichkeit von SendKeys im VBA (inkl. ClipBoard leeren). Selbst wenn ich das ClipBoard leere, ist gelegentlich wieder der vorherige Inhalt beim CTRL + V vorhanden. Das kann ich nicht verstehen. Weiss hier jemand Rat.
Meine Versuche mit:
If bC = 1 Then
Application.SendKeys " ", True
Application.SendKeys "{BACKSPACE}", True
Application.SendKeys "{ENTER}", True
If Err.Number > 0 Then Err.Clear
Else
'-----------------------------------------------------------
'ErrorHandler
On Error GoTo ErrorHandler
'-----------------------------------------------------------
Application.ScreenUpdating = False
'ClipBoard/Zwischenspeicher löschen
OpenClipboard FindWindow("xlMain", vbNullString)
EmptyClipboard
CloseClipboard
'Zwischenspeicher abfüllen
Set MyData = New DataObject
If Len(strText) > 0 Then
With MyData
.SetText strText
.PutInClipboard
End With
End If
Application.SendKeys "^{v}", True
Set MyData = Nothing
End If
Oder dann auch:
EmptyClipboard
Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) 'NEU
Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) 'NEU
Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) 'NEU
Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) 'NEU
Application.SendKeys "^{a}", True 'NEU
Application.SendKeys "^{c}", True
Set MyData = New DataObject
MyData.GetFromClipboard
On Error Resume Next
'Text vbCFText
If MyData.GetFormat(1) Then
ClipboardRead = Trim(CStr(MyData.GetText())) ''MsgBox Split(MyData.GetText, vbCrLf)(1)
ElseIf MyData.GetFormat(2) Then
ClipboardRead = False
MsgBox "Bilder können nicht übernommen werden"
Else
MsgBox "Die Daten aus der Zwischenablage können nicht übernommen werden!"
End If
Set MyData = Nothing
Registriert seit: 16.08.2017
Version(en): Alle
Hi,
(ohne das alles gelesen zu haben)
soweit mir bekannt, gibt es mit dem DataObject seit Excel 2013 Probleme bzw. das Ding funktioniert nicht mehr.
Geh komplett über die Clipboard API.
Google mal nach
Terry Kreft clipboard
Da gibt es eine schöne Klasse.
Gruß Jeanie
Registriert seit: 26.09.2015
Version(en): 2013
Danke, Hineinschreiben geht mit dem "Terry Kreft clipboard" jetzt recht sicher und gut.
Doch leider kriege ich den Text damit nicht aus der TextBox gelesen. Bin noch am suchen.
Gruss
Stefan
Schade, dass SendMessage nicht mehr mit "Chrome" funktioniert.
Registriert seit: 26.09.2015
Version(en): 2013
Jetzt habe ich das Auslesen umgestellt, wie folgt:
Es funktioniert beim Ersten Mal gut, dann wieder nicht, dann wieder und dann wieder nicht. Schön abgewechselt?
Bei der Funktion "ClipBoard_GetText" kommt jedes zweite Mal der "alte" Text. Wieso denn das? Weiss hier jemand Rat?
gruss Stefan1
Public Function ClipboardRead(bC As Byte) As String
Dim tPoint As POINTAPI
Dim n As Long, x As Long, y As Long
'eff. bC = 1 (AUSSER BETRIEB), 3 = Pseudo (keine Funktion)
If bC = 3 Then
ClipboardRead = InOutText(1, "") 'LESEN
Else
'Call ClipboardClear
'Call ClipBoard_SetText("")
n = GetCursorPos(tPoint)
x = tPoint.x: y = tPoint.y
Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
n = SetCursorPos(x, y)
Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
n = SetCursorPos(x, y)
Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
Call Warten(100)
n = SetCursorPos(x, y)
Application.SendKeys "^{a}", True
Application.SendKeys "^{c}", True
ClipboardRead = ClipBoard_GetText
End If
End Function
Function ClipBoard_GetText() As String
Dim hClipMemory As Long
Dim lpClipMemory As Long
Dim strCBText As String
Dim RetVal As Long
Dim lngSize As Long
If OpenClipboard(0&) <> 0 Then
' Obtain the handle to the global memory
' block that is referencing the text.
hClipMemory = GetClipboardData(CF_TEXT)
If hClipMemory <> 0 Then
' Lock Clipboard memory so we can reference
' the actual data string.
lpClipMemory = GlobalLock(hClipMemory)
If lpClipMemory <> 0 Then
lngSize = GlobalSize(lpClipMemory)
strCBText = SPACE$(lngSize)
RetVal = lstrcpy(strCBText, lpClipMemory)
RetVal = GlobalUnlock(hClipMemory)
' Peel off the null terminating character.
strCBText = Left(strCBText, InStr(1, strCBText, Chr$(0), 0) - 1)
Else
MsgBox "Could not lock memory to copy string from."
End If
End If
Call CloseClipboard
End If
ClipBoard_GetText = strCBText
End Function
Registriert seit: 26.09.2015
Version(en): 2013
24.09.2017, 09:01
(Dieser Beitrag wurde zuletzt bearbeitet: 24.09.2017, 09:02 von Stefan1.)
Ich habe nun folgenden VBA-Code, der funktioniert. Am Montag werde ich ihn am "Original" testen. "CTRL+A" geht leider nicht, weil das Fremdprogramm es nicht zulässt. Damit ich auch mehrzeilige TextBoxen auslesen kann, habe ich mit "Home" und "Shift+End" gearbeitet. Das Problem mit der unregelmässigen Textzugänglichkeit im ClipBoard (Zwischenspeicher) konnte ich mit etwa Wartezeit beheben. Gibt es ein VBA-Code für die Aktualisierung (eine Art Refresh) vom ClipBoard?
Die Praxis wird es zeigen, ob es auch funktioniert. Ich hoffe immer noch, das der "alte" Code wieder lauffähig bekomme (in Zukunft), weil der einfach genial und einfach anwendbar war.
Public Function ClipboardRead(bC As Byte) As String
Dim tPoint As POINTAPI
Dim n As Long, x As Long, y As Long
'eff. bC = 1 (AUSSER BETRIEB), 3 = Pseudo (keine Funktion)
If bC = 3 Then
ClipboardRead = InOutText(1, "") 'LESEN
Else
n = GetCursorPos(tPoint)
x = tPoint.x: y = tPoint.y
Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
Call Warten(100)
n = SetCursorPos(x, y)
'Application.SendKeys "^{a}", True
Application.SendKeys "^{HOME}", True
Application.SendKeys "^+{END}", True
Application.SendKeys "^{c}", True
Call Warten(100)
ClipboardRead = ClipBoard_GetText
End If
End Function
Registriert seit: 10.04.2014
Version(en): 97-2019 (32) + 365 (64)
Hallo Stefan,
einen Refresh kenne ich nicht. Du müsstest das Clipboard z.B. mit den API's leeren und dann wieder füllen.
PHP-Code: Public Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long Public Declare Function EmptyClipboard Lib "user32" () As Long Public Declare Function CloseClipboard Lib "user32" () As Long
Public Function ClearClipboard() OpenClipboard (0&) EmptyClipboard CloseClipboard End Function
. \\\|/// Hoffe, geholfen zu haben.
( ô ô ) Grüße, André aus G in T
ooO-(_)-Ooo (Excel 97-2019+365)
Registriert seit: 26.09.2015
Version(en): 2013
24.09.2017, 13:18
(Dieser Beitrag wurde zuletzt bearbeitet: 24.09.2017, 13:20 von Stefan1.)
Guten Tag Schauan
Vielen Dank für Deinen Hinweis. Genau das habe ich auch versucht, doch das Resultat war dann ein leeres Clipboard beim Auslesen. Nur das "Warten" um eine Zeiteinheit hat das Problem einigermassen zuverlässig gelöst. Doch so zuversichtlich ist mir dabei nicht. Es scheint, dass das Clipboard nicht gerade sehr schnell den eingelesenen Wert zur Verfügung stellt. Darauf bin ich gekommen, als ich den Code Schritt für Schritt durchlaufen und bei fehlendem Resultat beim Auslesen händisch gleich nochmals das Clipboard ausgelesen habe und dann den Wert wie aus dem nichts plötzlich zur Verfügung stand. Ich kenne mich nicht so gut damit aus, was ein verzögertes Ablegen der eingelesenen Werte verursacht. Vielleicht einfach ein zu langsamer Rechner. :s
Doch wenn es wieder funktioniert (am Montag werde ich testen), dann bin einigermassen zufrieden, obwohl mit die "alte Lösung" viel besser zugesagt hat. Bis dahin vielen Dank für Eure Unterstützung und tatkräftigen Hinweise.
Gruss
Stefan
|