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

Zwischenspeicher auslesen macht Laufzeitfehler

Forumthread: Zwischenspeicher auslesen macht Laufzeitfehler

Zwischenspeicher auslesen macht Laufzeitfehler
29.03.2017 00:02:48
Barbaraa

Hallo
würde gerne den Inhalt der Zwischenablage in einer Variablen speichern.
Dazu wird eine Schleife durchlaufen, bis sich die Zwischenablage füllt.
Ich starte das Programm, gehe in ein anderes Fenster, markiere dort einen Text, bringe ihn mit Strg+c in die Zwischenablage.
Und da unterbricht das Makro mit der Fehlermeldung:
Laufzeitfehler -2147221040 (800401d0)
Automatisierugsfehler
OpenClipboard fehlgeschlagen
"On Error Resume Next" führt das makro zu Ende, aber erst nach einer halben Minuten bangen Wartens. Das ist also auch nicht die Lösung.
Hier der Code:

Private Sub Test()
Dim oZwischenspeicher As New DataObject
Dim Text
oZwischenspeicher.SetText "zqba"
oZwischenspeicher.PutInClipboard
Do
oZwischenspeicher.GetFromClipboard
Text = oZwischenspeicher.GetText
Loop Until Text <> "zqba"
Cells(1, 1) = Text
End Sub

Meine Google-Recherche führt leider auch zu keiner für VBA-Anfänger nachvollziehbaren Lösung.
Kann mir da wer helfen?
LG, Barbara

Anzeige

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Endlosschleife
29.03.2017 07:45:16
RPP63
Moin!
Zunächst mal brauchst Du ja einen Verweis auf MS Forms 2.0 Object Library, dann kommt es auch zu keinem Automatisierungsfehler.
Viel wichtiger ist aber Dein Logikfehler!
"Text" (schlecht gewählte Variablenbezeichnung!) ist bereits zu Beginn mit "zqba" gefüllt.
Du lässt die Schleife laufen bis es <> "zqba" ist???
Gruß ralf
Anzeige
AW: Endlosschleife
29.03.2017 19:08:11
Barbaraa
Hi Ralf,
der Verweis auf MS Forms 2.0 Object Library war und ist gesetzt.
"Text", ok, schlecht gewählte Variablenbezeichnung, dennoch:
ja, ich lasse die Schleife laufen bis es <> "zqba" ist, genau gesagt, wenn ich händisch irgendwo mit Strg+c einen Text in die Zwischenablage fülle. Dieser soll dann in die A1-zelle kommen (wie schon eingangs beschrieben).
Da sehe ich keinen Logikfehler.
LG,
Barbara
Anzeige
Ich aber schon, und jetzt?
29.03.2017 19:18:53
RPP63
Hi Barbara!
Lasse mal den Code per F8 steppen und schaue Dir im Lokalfenster die Variablenbelegung an.
Dass ein händisches Strg+c kein VBA-Event auslöst, weißt Du?
Mal abseits der (Programm-) Logik habe ich keinen blassen Schimmer, was Du erreichen willst.
Gruß Ralf
P.S.: Ich lasse dennoch nicht auf offen.
Anzeige
AW: Ich aber schon, und jetzt?
29.03.2017 20:32:32
Barbaraa
Hi Ralf,
Die schrittweise Ausführung mit F8 funktioniert problemlos, genauso wie es sein soll: Wenn ich während der Scheife in ein offenes pdf gehe und dort ein Wort mit Strg+c in die Zwischenablage bringe, wird beim Loop Until die Do-Schleife verlassen.
Hast Du meinen Code mal ausprobiert?
Nur im Run-Modus F5 kommt die Fehlermeldung, sobald ich Strg+c mache. Außer, ich kopiere einen Wert aus einer anderen Excel-Datei in einer eigenen Instanz. Da funktioniert auch das Makro mit F5. Aber das ist ja nicht Zweck des Makros.
Die Variablenbelegung zeigt Folgendes:
oZwischenspeicher ist vom Typ DataObject,
die nächste Zeile, die einzige zugehörige Variable zu oZwischenspeicher zeigt als Wert und keinen Typ.
Ja, ich weiß, dass ein händisches Strg+c kein VBA-Event auslöst. Auf das wird ja auch nicht abgezielt, sondern auf eine Änderung in der Zwischenablage.
Meine gesetzten Verweise:
Visual Basic for Applications
Microsoft Excel 14.0 Object Library
Microsoft Forms 2.0 Object Library
OLE Automation
Microsoft Office 14.0 Object Library
Microsoft Scripting Runtime
Was ich mit meinem Makro erreichen will, habe ich ja schon beschrieben: Den Text der Zwischenablage, sobald ich sie gefüllt habe, ins Excel zu bringen, mit dem großen Ziel, alle Formulareinträge eines vba-Formulars ins Excel zu bringen und dort weiter zu bearbeiten.
LG, Barbara
Anzeige
AW: Ich aber schon, und jetzt?
30.03.2017 13:12:59
EtoPHG
Hallo Barbara,
Das Clipboard ist ein Biest.
Versuch's mal so (in ein Modul):
Option Explicit
Dim textFromClipboard As String
Sub WaitForTextInClipboard()
Dim LX As Long
Dim clipTest As New DataObject
textFromClipboard = ""
clipTest.SetText textFromClipboard
clipTest.PutInClipboard
On Error Resume Next
Do
clipTest.GetFromClipboard
If clipTest.GetFormat(1) Then
textFromClipboard = clipTest.GetText
If Len(textFromClipboard) > 0 Then Exit Do
End If
DoEvents
Loop While textFromClipboard = ""
On Error GoTo 0
Set clipTest = Nothing
End Sub
Sobald ein Text in der Zwischenablage vorhanden ist, beendet die Routine und die dieser staht dann in der Variablen textFromClipboard zur weiteren Codeverarbeitung zur Verfügung.
Gruess Hansueli
Anzeige
Dim LX as Long: Codezeile löschen (owT)
30.03.2017 13:49:23
EtoPHG

AW: Dim LX as Long: Codezeile löschen (owT)
31.03.2017 19:07:08
Barbaraa
Mit
On Error Resume Next
geht es.
Habe auch einen Schreifenzähler eingebaut. Mal wird die Schleife 20 Mal durchlaufen, mal 40 Mal, ganz unterschiedlich.
Aber es geht.
Vielen Dank.
LG, Barabra

;
Anzeige

Infobox / Tutorial

Zwischenspeicher auslesen ohne Laufzeitfehler in VBA


Schritt-für-Schritt-Anleitung

Um den Inhalt der Zwischenablage in VBA erfolgreich auszulesen, kannst Du den folgenden Code verwenden. Dieser Code wartet darauf, dass ein Text in die Zwischenablage eingefügt wird und speichert ihn dann in einer Variablen:

Option Explicit
Dim textFromClipboard As String

Sub WaitForTextInClipboard()
    Dim clipTest As New DataObject
    textFromClipboard = ""
    clipTest.SetText textFromClipboard
    clipTest.PutInClipboard
    On Error Resume Next
    Do
        clipTest.GetFromClipboard
        If clipTest.GetFormat(1) Then
            textFromClipboard = clipTest.GetText
            If Len(textFromClipboard) > 0 Then Exit Do
        End If
        DoEvents
    Loop While textFromClipboard = ""
    On Error GoTo 0
    Set clipTest = Nothing
End Sub

Dieser Code verwendet die DataObject-Klasse, um auf die Zwischenablage zuzugreifen. Stelle sicher, dass Du einen Verweis auf die MS Forms 2.0 Object Library gesetzt hast, um Automatisierungsfehler zu vermeiden.


Häufige Fehler und Lösungen

  1. Laufzeitfehler -2147221040 (800401d0):

    • Dieser Fehler tritt häufig auf, wenn die Zwischenablage nicht geöffnet werden kann. Stelle sicher, dass kein anderes Programm die Zwischenablage blockiert.
  2. Endlosschleife:

    • Wenn Du eine Endlosschleife hast, kann das an einer falschen Logik im Code liegen. Überprüfe, ob die Schleifenbedingung korrekt ist. Der Text sollte wirklich verändert werden, bevor die Schleife verlässt.
  3. Zwischenablage kann nicht geöffnet werden:

    • Dieser Fehler kann auch auftreten, wenn Du ein anderes Fenster aktiv hast. Sorge dafür, dass Dein VBA-Skript den Fokus hat, wenn Du Text in die Zwischenablage kopierst.

Alternative Methoden

Eine andere Möglichkeit, den Inhalt der Zwischenablage auszulesen, ist die Verwendung von OpenClipboard in Verbindung mit GetClipboardData. Hier ist ein Beispiel:

Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hwnd As LongPtr) As Long
Declare PtrSafe Function CloseClipboard Lib "user32" () As Long
Declare PtrSafe Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
Declare PtrSafe Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Declare PtrSafe Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long

Sub GetClipboardContent()
    Dim hwnd As LongPtr
    Dim hData As Long
    Dim lpData As Long
    Dim text As String

    hwnd = Application.hwnd
    If OpenClipboard(hwnd) Then
        hData = GetClipboardData(1) ' CF_TEXT
        If hData <> 0 Then
            lpData = GlobalLock(hData)
            text = VBA.StrConv(VBA.PtrToStringA(lpData), vbUnicode)
            GlobalUnlock hData
        End If
        CloseClipboard
    End If
    MsgBox text
End Sub

Praktische Beispiele

Hier sind einige praktische Beispiele, die Dir helfen können, den Inhalt der Zwischenablage in verschiedene Zellen Deiner Excel-Tabelle zu übertragen:

Sub PasteClipboardToCell()
    WaitForTextInClipboard
    Cells(1, 1).Value = textFromClipboard
End Sub

In diesem Beispiel wird der Text aus der Zwischenablage in die Zelle A1 eingefügt. Du kannst die Zeile Cells(1, 1) anpassen, um den Text in eine andere Zelle zu verschieben.


Tipps für Profis

  • Verwende On Error Resume Next mit Bedacht. Es kann Dir helfen, Laufzeitfehler zu vermeiden, aber stelle sicher, dass Du die Fehlerursache später behandelst.
  • Setze die Schleifenbedingung so, dass Du nicht auf einen bestimmten Text wartest, sondern auf eine Änderung in der Zwischenablage.
  • Halte Deinen Code modular und übersichtlich, um zukünftige Anpassungen zu erleichtern.

FAQ: Häufige Fragen

1. Warum funktioniert mein getfromclipboard vba-Code nicht? Stelle sicher, dass Du die richtigen Bibliotheken referenziert hast und dass keine anderen Anwendungen die Zwischenablage blockieren.

2. Was kann ich tun, wenn die zwischenablage kann nicht geöffnet werden-Fehlermeldung erscheint? Überprüfe, ob andere Anwendungen die Zwischenablage verwenden. Teste auch, ob der Code in einer neuen Excel-Instanz ausgeführt wird.

3. Wie kann ich den Inhalt der Zwischenablage in eine bestimmte Zelle kopieren? Verwende den Code Cells(row, column).Value = textFromClipboard, um den Inhalt in die gewünschte Zelle zu übertragen.

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