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, 12:27
(Dieser Beitrag wurde zuletzt bearbeitet: 17.09.2017, 12: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.
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, 10:01
(Dieser Beitrag wurde zuletzt bearbeitet: 24.09.2017, 10: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, 14:18
(Dieser Beitrag wurde zuletzt bearbeitet: 24.09.2017, 14: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
|