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

Forumthread: Zwischenablage auslesen mit VBA

Zwischenablage auslesen mit VBA
29.07.2017 11:38:31
MatthiasG
Hallo,
ich möchte in einer Excel-Datei mit VBA die Zwischenablage auslesen und die Werte ggf. (also nach Prüfung) in eine Tabelle schreiben (Ersatz für Strg+V).
Folgende Teillösung habe ich gefunden:
http://www.online-excel.de/excel/singsel_vba.php?f=28
Mit .GetText erhalte ich bei einem kopierten Zellbereich einen String, wo die Werte durch Chr(9) (Spalten) bzw. Chr(13)+Chr(10) (Zeilen) getrennt sind.
Wenn ein Zeilenumbruch innerhalb der Zelle vorkommt, wird diese mit Chr(34) umschlossen. Also alles ähnlich einer CSV-Datei.
Wenn aber nun z.B. der Bereich [A2:B5,A7:B10] markiert und in die Zwischenablage kopiert wird, dann erhalte ich mit .GetText den ausgelassenen Bereich A6:B6 dazu, als hätte ich den kompletten Bereich [A2:B10] kopiert.
Gibt es da andere Möglichkeiten, einen in die Zwischenablage kopierten Zellbereich auszulesen, außer mit der .GetText-Methode und anschließendem mühsamen Entfrickeln des Strings?
Mich interessieren nur die kopierten Werte, nicht die Zellformatierung.
Viele Grüße
Matthias
Anzeige

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zwischenablage auslesen mit VBA
29.07.2017 11:49:02
RPP63
Wenn Du Werte aus einem Range mit mehreren Areas kopieren willst:
Warum nicht einfach per .PasteSpecial xlPasteValues
?
Gruß Ralf
AW: Zwischenablage auslesen mit VBA
29.07.2017 11:59:03
MatthiasG
Hallo Ralf,
weil in den kopierten Zellen immer wieder auch verbundene Zellen drin sind, was bei .PasteSpecial zu einem VBA-Laufzeitfehler führt.
Und ich denke, es ist ist einfacher, dies programmtechnisch abzufangen, als einen Chefarzt zu überreden, keine verbundenen Zellen mehr zu verwenden :-)
Gruß Matthias
Anzeige
AW: Zwischenablage auslesen mit VBA
29.07.2017 19:50:33
Oberschlumpf
Hi Matthias
vllt könnte - per Upload - eine Bsp-Datei, inkl. Bsp-Daten, von dir sehr hilfreich sein.
Ciao
Thorsten
AW: Zwischenablage auslesen mit VBA
29.07.2017 20:21:12
MatthiasG
Hallo Thorsten,
ich hab jetzt eine "Lösung" gefunden, ein ziemlich schmutziges Gefrickel zwar,... aber es funktioniert :-)
Die Zwischenablage wird i.d.R. von einer anderen Mappe (evtl. auch anderer Instanz) gefüllt. Hier können eben auch verbundene Zellen dabei sein. In der Zielmappe habe ich die Ausrichtung "uber Markierung zentriert", also ohne verbundene Zellen.
"geopfert" habe ich die Anführungszeichen; sollten welche im Quellbereich vorhanden gewesen sein, werden die entfernt... egal, kommt eh nicht vor.
Das Makro soll in der fertigen Version mit Rechtsklick (benutzerdefiniertem Menü) aufgerufen werden. Zum Testen muss man dem Makro eine Tastenkombi oder eine Schaltfläche zuweisen, sonst geht der Inhalt der Zwischenablage verloren (bei Alt+F8).
Außerdem braucht man einen Verweis auf die MS Forms 2.0 Library (z.B. durch Erstellen eines Userform-Elements).
Na gut, hier der Code (in ein allg. Modul):

Option Explicit
Public Const trZ = "¬"
Public Function HoleTextVonZwischenablage() As String
Dim oData As New DataObject, tmp, i
On Error Resume Next ' Brutal um falsche Formate abzuwürgen, gibt dann einen Leerstring
oData.GetFromClipboard
tmp = oData.GetText
HoleTextVonZwischenablage = tmp
End Function
Sub Inhalte_Einfuegen()
Dim tmp As String, i As Long, j As Long
Dim tmp2 As String
Dim zArr As Variant, sArr As Variant, ArrGes As Variant
Dim AnzZeilen As Long
Dim AnzSpalten As Long
'Zwischenablage nach tmp
tmp = HoleTextVonZwischenablage()
If tmp = "" Then
MsgBox "Nichts markiert!", vbExclamation
Exit Sub
End If
'Zeilenumbruch innerhalb von Zellen codieren
tmp2 = tausche10(tmp)
'Zeilen in ZArr()
zArr = Split(tmp2, vbNewLine)
AnzZeilen = UBound(zArr) + 1
AnzSpalten = UBound(Split(zArr(0), vbTab)) + 1
If AnzSpalten = 0 Then AnzSpalten = 1
'MsgBox AnzZeilen & "," & AnzSpalten
ReDim ArrGes(AnzZeilen - 1, AnzSpalten - 1)
'Array befüllen:
For i = 0 To AnzZeilen - 1
sArr = Split(zArr(i), vbTab)
For j = 0 To AnzSpalten - 1
'Debug.Print j & ":";
If UBound(sArr) = -1 Then
ArrGes(i, j) = ""
Else
ArrGes(i, j) = Replace(sArr(j), trZ, Chr(10))
End If
'Debug.Print sArr(j),
Next j
'Debug.Print
Next i
meinArraySchreiben ArrGes, ActiveCell
End Sub
'ersetze vbNewLine (13+10) und Chr(10) innerhalb Anführungszeichen durch (trZ)
Function tausche10(ByVal sx As String) As String
Dim bol_AZ As Boolean
Dim i As Long, l0 As Long, tmp As String, t0 As String
l0 = Len(sx)
bol_AZ = False
tmp = sx
Do
i = i + 1
t0 = Mid(tmp, i, 1)
If t0 = "" Then Exit Do ' Abbruch bei Überlauf oder Leerstring
If Asc(t0) = 34 Then bol_AZ = Not bol_AZ: 'Debug.Print i, bol_AZ
'vbNewline (13+10) tauschen (Sonderfall):
If Mid(tmp, i, 2) = vbNewLine Then
If bol_AZ Then
' i-tes und (i+1)tes Zeichen austauschen durch (trZ)
tmp = Left(tmp, i - 1) & trZ & Mid(tmp, i + 2)
l0 = l0 - 1: i = i + 1
End If
End If
'Chr(10) tauschen (Normalfall):
If Mid(tmp, i, 1) = Chr(10) Then
If bol_AZ Then
' i-tes Zeichen austauschen durch (trZ)
tmp = Left(tmp, i - 1) & trZ & Mid(tmp, i + 1)
End If
End If
Loop While i 

Anzeige
AW: Zwischenablage auslesen mit VBA
29.07.2017 20:46:27
MatthiasG
Hallo Thorsten,
ich nochmal: Das mit dem Kontextmenü bekomme ich selbst hin, nicht dass du meinen Beitrag falsch verstehst und mir eine Lösung dafür anbieten willst.
Wäre aber schön, wenn du oder jemand anders eine elegantere Lösung fände. Vor allem das mehr-Areas-Problem ist ja noch offen.
LG Matthias
Anzeige
;

Forumthreads zu verwandten Themen

Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Zwischenablage auslesen mit VBA in Excel


Schritt-für-Schritt-Anleitung

Um die Zwischenablage in Excel mit VBA auszulesen, kannst Du die folgenden Schritte befolgen:

  1. Verweis auf MS Forms 2.0 Library:

    • Öffne den VBA-Editor (Alt + F11).
    • Gehe zu "Extras" > "Verweise".
    • Aktiviere die MS Forms 2.0 Library.
  2. VBA-Code einfügen:

    • Füge ein neues Modul ein (Rechtsklick auf "VBA-Projekt" > "Einfügen" > "Modul").
    • Kopiere den folgenden Code in das Modul:
    Option Explicit
    Public Const trZ = "¬"
    
    Public Function HoleTextVonZwischenablage() As String
       Dim oData As New DataObject
       On Error Resume Next
       oData.GetFromClipboard
       HoleTextVonZwischenablage = oData.GetText
    End Function
    
    Sub Inhalte_Einfuegen()
       Dim tmp As String
       tmp = HoleTextVonZwischenablage()
       If tmp = "" Then
           MsgBox "Nichts markiert!", vbExclamation
           Exit Sub
       End If
       ' Weiterverarbeitung...
    End Sub
  3. Makro ausführen:

    • Weise dem Makro eine Tastenkombination oder Schaltfläche zu, um es auszuführen.

Häufige Fehler und Lösungen

  • Fehler: Laufzeitfehler wegen verbundener Zellen

    • Lösung: Stelle sicher, dass Du die verbundene Zellen in Deinem Bereich berücksichtigst. Dies kann durch eine spezielle Fehlerbehandlung im Code geschehen.
  • Fehler: Keine Daten in der Zwischenablage

    • Lösung: Überprüfe, ob Du wirklich etwas in die Zwischenablage kopiert hast, bevor Du das Makro ausführst.

Alternative Methoden

Falls Du nicht mit VBA arbeiten möchtest, kannst Du auch den Paste-Special-Befehl verwenden, um Werte aus der Zwischenablage in Excel einzufügen. Allerdings kann dies bei verbundenen Zellen zu Problemen führen. Eine Möglichkeit, dies zu umgehen, besteht darin, die Daten zuerst in ein Textverarbeitungsprogramm einzufügen und dann als CSV-Datei zu speichern.


Praktische Beispiele

Hier ist ein einfaches Beispiel, wie Du die Zwischenablage auslesen und die Werte in Excel einfügen kannst:

Sub BeispielEinfügen()
    Dim tmp As String
    Dim zArr As Variant
    tmp = HoleTextVonZwischenablage()
    zArr = Split(tmp, vbNewLine)

    Dim i As Long
    For i = LBound(zArr) To UBound(zArr)
        ActiveSheet.Cells(i + 1, 1).Value = zArr(i)
    Next i
End Sub

In diesem Beispiel wird jeder Wert aus der Zwischenablage in eine neue Zeile in Spalte A eingefügt.


Tipps für Profis

  • Vermeide Chr(9) in Strings: Wenn Du mit Tabulatoren arbeitest, kann es hilfreich sein, Chr(9) zu vermeiden. Verwende stattdessen eine klare Trennung der Werte.

  • Debugging: Nutze Debug.Print, um den Inhalt der Variablen während der Ausführung zu überprüfen.

  • VBA Clipboard auslesen optimieren: Überlege, wie Du den Code modularer gestalten kannst, um wiederverwendbare Funktionen zu schaffen.


FAQ: Häufige Fragen

1. Wie kann ich die Zwischenablage in Excel VBA ohne MS Forms verwenden? Es ist schwierig, die Zwischenablage ohne MS Forms auszulesen. Es wird empfohlen, diese Bibliothek zu verwenden, um den Zugriff zu erleichtern.

2. Kann ich die Zwischenablage auch für andere Formate als Text auslesen? Ja, Du kannst auch andere Formate auslesen, aber der Code muss entsprechend angepasst werden, um mit verschiedenen Formaten zu arbeiten.

3. Was ist der Unterschied zwischen .GetText und .GetData in VBA? GetText gibt nur den Textinhalt der Zwischenablage zurück, während GetData auch andere Datentypen unterstützen kann, z.B. Bilder.

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