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

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
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
Anzeige
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

8 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige