Problem mit Anführungszeichen bei C&P in externes Textpad; Ursache ZEICHEN(10)
#1
Hallo,

ich bin's nochmal.

Heute habe ich noch das letzte Problem in meiner Auswertungstabelle versucht zu lösen, leider ohne Erfolg.

Erklärung:
Ich habe eine Auswertungstabelle, die aus versch. Arbeitsblättern Daten zusammenfasst, zählt und berechnet. Das Ganze endet damit, dass ich mittels versch. Funktionen wie WENN, VERKETTEN, TEXT einen Text erzeuge, der das Auswertungsergebnis darstellt. Von dort muss ich diese Informationen via Copy&Paste extern weiterleiten. Dies ist nur so möglich, weil ich keine Dateianhänge oder individuelle Mails versenden kann, sondern ich habe nur die Möglichkeit, die Infos via einfachem Text-Chat (Fließtext ohne TAB Kontrolle etc.) zu kommunizieren. Aus Gründen der Übersichtlichkeit und besseren Lesbarkeit in diesem Chat enthält mein Text deshalb via ZEICHEN(10) gewollte Zeilenumbrüche an gezielten Stellen.

Problem:
Diese ZEICHEN(10) Zeilenumbrüche führen dazu, dass der kopierte Text im externen Chat (oder im Textpad, oder in Kurznotizen) am Anfang und am Ende ein " hat. Das ist für die Lesbarkeit sehr störend. Ohne ZEICHEN(10) passiert das nicht, jedoch ist der Text dann unübersichtlich und nicht gut lesbar.

Nachfolgend habe ich das mal beispielhaft in einer Beispiel.xls reproduziert. Siehe erstes Blatt Textausgabebeispiel. 
Wenn man die rote Spalte (oder eine der Zellen) mit Strg+C/Strg+V in ein externes Eingabeprogramm (z.B. Kurznotiezen, Textpad etc) kopiert, kommen die "", bei der Spalte (bzw. den Zellen) nebenan passiert das nicht. Wie gesagt, aufgrund der Lesbarkeit benötige ich aber diese Zeilenumbrüche und möchte sie daher nicht entfernen.

.xlsx   Beispiel_member-era_build-era_TestDaten_korrektur.xlsx (Größe: 37,88 KB / Downloads: 10)

Kennt ihr das Problem? Hab ihr eine Lösung, wie ich diese Anführungszeichen beim Kopieren/einfügen vermeiden kann?

dankeschön vorab 
LG Schnattie
Antworten Top
#2
Hallo Schnattie,

vielleicht denke ich ja zu einfach, aber ...
hast du schon versucht den Text mit Anführungszeichen ("bla") zuerst in einen Editor/notepad einzufügen und dann mit suchen nach " und ersetzen durch "nichts" zu entfernen? Das sollte gehen.

Gruß Sigi
Antworten Top
#3
Probier mal den Text mit CrLf statt nur Lf zu verbinden, sieht in Excel blöd aus, aber es kann sein das der andere Editor nur ein Lf nicht mag.

Wenn das nicht geht, dann musst Du mal schauen was wirklich in der Zwischenablage drin ist. Du wirst da kein " am Ende finden aber viele andere Strukturen. Die Frage ist welche davon nimmt der andere Editor zum Einfügen.

Kopier den Text von Excel erstmal nach Notepad, und dort kopierst Du den Text nochmal und dann fügst Du es in den anderen Editor. Wenn das geht, dann ist die Zwischenablage das Problem. In dem Fall brauchst Du ein Makro was den Text in die Zwischenablage kopiert.

Andreas.
Antworten Top
#4
Hallo,

falls das Problem nicht schon anderweitig schon gelöst ist....

Es gäbe die Möglichkeit, die Anführungszeichen nach dem Kopieren direkt in der Zwischenablage per Makro zu löschen, bevor der Text woanders wieder eingefügt wird.

Grundlage ist mein Beitrag hier:
https://www.clever-excel-forum.de/Thread...e-kopieren

Nach einem Test musste ich feststellen, dass es offensichtlich nicht am Format in der Zwischenablage liegt. Excel hält nach dem Kopieren zahlreiche Formate in der Zwischenablage bereit. Der o.a. Code macht daraus einen eindeutigen Nur-Text. Dort sind die Anführungszeichen aber trotzdem enthalten.
Deshalb entfernt der nachfolgend gezeigte angepasste Code alle Anführungszeichen. Wenn nicht alle wegdürfen, müsste der Code nochmal angepasst werden. 

Du kannst selbst kopieren und den Code laufen lassen oder auch den Kopiervorgang an sich vom Programm machen lassen.

Probiere es mal aus....

Code:

Option Explicit

Private Declare PtrSafe Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, _
        ByVal dwBytes As LongPtr) As LongPtr
Private Declare PtrSafe Function GlobalLock Lib "kernel32" ( _
        ByVal hMem As LongPtr) As LongPtr
Private Declare PtrSafe Function GlobalSize Lib "kernel32" ( _
        ByVal hMem As LongPtr) As LongPtr
Private Declare PtrSafe Function GlobalUnlock Lib "kernel32" ( _
        ByVal hMem As LongPtr) As Long
Private Declare PtrSafe Function lstrcpy Lib "kernel32" ( _
        ByVal lpString1 As Any, ByVal lpString2 As Any) As LongPtr
Private Declare PtrSafe Function IsClipboardFormatAvailable Lib "user32" ( _
        ByVal wFormat As Long) As Long
Private Declare PtrSafe Function SetClipboardData Lib "user32" ( _
        ByVal wFormat As Long, ByVal hMem As LongPtr) As LongPtr
Private Declare PtrSafe Function GetClipboardData Lib "user32" ( _
        ByVal wFormat As Long) As LongPtr
Private Declare PtrSafe Function OpenClipboard Lib "user32" ( _
        ByVal hWnd As LongPtr) As Long
Private Declare PtrSafe Function CloseClipboard Lib "user32" () As Long
Private Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long

Function KopiereRangeAlsText(Optional Rng As Range) As String
' Kopiert eine Excelrange in die Zwischenablage und hält sie dort als Text
  Dim hMem As LongPtr, lpGMem As LongPtr, sCliptext As String, i As Long
  Const CF_TEXT As Long = 1
  
  If Not Rng Is Nothing Then Rng.Copy
  DoEvents
  If IsClipboardFormatAvailable(CF_TEXT) > 0 Then               ' Daten vorhanden?
     For i = 1 To 2
         OpenClipboard 0&                                       ' Zwischenablage öffnen
         If i = 1 Then hMem = GetClipboardData(CF_TEXT)         ' TEXT aus Zwischenablage
         If i = 2 Then hMem = GlobalAlloc(&H42, Len(sCliptext)) ' Speicher reservieren
         If hMem > 0 Then
            lpGMem = GlobalLock(hMem)                           ' Speicher blockieren
            If i = 1 Then
               sCliptext = Space(CLng(GlobalSize(hMem)))        ' Platz reservieren
               lstrcpy sCliptext, lpGMem                        ' Daten kopieren
               GlobalUnlock hMem                                ' Speicher freigeben
               EmptyClipboard                                   ' Zwischenablage leeren
            Else
               sCliptext = Replace(sCliptext, Chr$(34), "")
               lpGMem = lstrcpy(lpGMem, sCliptext)              ' Daten kopieren
               If GlobalUnlock(hMem) = 0 Then _
                  SetClipboardData CF_TEXT, hMem                ' TEXT in Zwischenablage
            End If
         End If
         CloseClipboard                                         ' Zwischenablage schließen
     Next i
  End If
End Function

' ###############################################
Sub TestMitCopy()
  KopiereRangeAlsText Range("B1:B5")
End Sub

Sub TestOhneCopy()
  KopiereRangeAlsText
End Sub

_________
viele Grüße
Karl-Heinz

Hallo Andreas,

ergänzend:

Wenn das nicht geht, dann musst Du mal schauen was wirklich in der Zwischenablage drin ist. Du wirst da kein " am Ende finden aber viele andere Strukturen. Die Frage ist welche davon nimmt der andere Editor zum Einfügen.

Dem ist nicht so. Nach dem Kopieren so eines Feldes sind bereits die Anführungszeichen in der Zwischenblage vorhanden....

Gruß
KH
Antworten Top
#5
Hallo Karl-Heinz,

okay, hast mich erwischt, ich hab mir das nicht vorher angeschaut. Aber nun doch. Smile

Ja, bei einigen Datentypen sind die "" schon drin, bei RTF z.B. nicht.

Um nur den Text in die Zwischenablage zu kriegen hab ich was einfacheres. In VBA einen Verweis zu Microsoft Forms setzen.

Code:
Sub Test()
  Dim MyData As New DataObject
  MyData.SetText ActiveCell
  MyData.PutInClipboard
End Sub

Aber Dein Code ist schon okay, er bietet zumindest die Möglichkeit zu prüfen ob man auf die Zwischenablage zugreifen kann, auch wenn Du das nicht machst.
Ich verwende so was ähnliches auch, funktioniert unter realen Bedingungen besser. Das DataObject ist da nicht soo zuverlässig, das funktioniert manchmal einfach nicht.

Andreas.
Antworten Top
#6
Hallo Andreas,

vielen Dank für Deinen Beitrag.

Der Code ist mir bekannt. 

Und tatsächlich hat der Text aus der aktiven Zelle bei mir keine Anführungszeichen. Hätte ich nicht erwartet und auch keine Erklärung dafür, warum mal mit und mal ohne.
Das Problem wäre also hiermit schon gelöst.

Man braucht allerdings einen Verweis und man hört in den Foren immer wieder vom ??-Problem. Beides natürlich einfach lösbar.

Aber dieses hier (mehrere Zellen kopieren)
Code:
Sub Test()
  Dim MyData As New DataObject
  MyData.SetText Range("B1:B10").Value
  MyData.PutInClipboard
End Sub

führt zum Fehler "Typen unverträglich". Klappt bei mir zumindest nicht.

Und wenn man vorher von Hand kopieren möchte, kann man diesen einfachen Code auch nicht einsetzen.

Gruß
Karl-Heinz
Antworten Top
#7
wow, ich danke Euch mal für eure Antworten. Das scheint ja wohl häufiger aufzutreten.

Nunja, leider sind meine VBA Kenntnisse nur rudimentär. Die Originaltabelle ist zudem recht umfangreich. Zudem enthalten die zu kopierenden Zellen auch Smilies (um gute und schlechte Ergebnisse zu visualisieren). Ja, das ist etwas "verspielt", macht sich aber in meinem Fall, wo die Daten ja in einem Chat laden, echt schick.

Doch in der Beispieldatei seht ihr ja, dass ZEICHEN(10) das Problem verursacht. Es liegt also nicht an sonstigen Inhalten der Zellen, die ich da rauskopiere.

Ich traue mich nicht recht, in die Originaltabelle einen VBA Code einzubetten, den ich nur rudimentär verstehe ....

Trotzdem habt ihr mir noch hilfreiche Impulse gegeben. Danke dafür.


(02.08.2025, 08:48)Andreas Killer schrieb: Probier mal den Text mit CrLf statt nur Lf zu verbinden, sieht in Excel blöd aus, aber es kann sein das der andere Editor nur ein Lf nicht mag.

Was meinst Du mit  CrLf statt nur Lf??



(02.08.2025, 07:19)Sigi.21 schrieb:  zuerst in einen Editor/notepad einzufügen und dann mit suchen nach " und ersetzen durch "nichts" zu entfernen? Das sollte gehen.

Gruß Sigi

Das ist eine super Idee. Danke
Antworten Top
#8
(02.08.2025, 11:01)volti schrieb: Und tatsächlich hat der Text aus der aktiven Zelle bei mir keine Anführungszeichen. Hätte ich nicht erwartet und auch keine Erklärung dafür, warum mal mit und mal ohne.
Ich hätte die Vermutung dass das nur bei den nicht druckbaren Zeichen (Steuerzeichen) passiert.
Wir sehen uns!
... Detlef

Meine Beiträge können Ironie oder Sarkasmus enthalten.

Antworten Top
#9
Hallo zusammen,

habe aus Interesse gerade mal etwas rumgespielt.

Die Zeichen 13 und 10, vbCr und vbLF verursachen das Problem.
Andere nicht druckbare Zeichen unter 32 wie Zeichen 12 oder 26 und weitere bleiben davon unberührt.

Die Kombination vbCrLf, Zeichen(13)&Zeichen(10), verbessert daher m.E. nichts.

Ich denke mal, Excel will die Zelle als Datensatz bzw. als Ganzes erhalten. Wenn dort Umbrüche drin sind, werden im Texteditor ja so zu sagen wieder mehrere "Datensätze" daraus.

Gruß
KH

Meine Meinung zur Ursache des Problems:
Verantwortlich ist die Kopierfunktion von Excel. Das betrift sowohl manuelles Kopieren wie auch den VBA-Copy-Befehl.

Nutze ich das Kopieren via DataObject sind keine Anführungszeichen drin. Kopiere ich die Zelle über die API sind auch keine drin.
Diese beiden Kopiermethoden haben ja primär nix mit Excel zu tun.
[-] Folgende(r) 2 Nutzer sagen Danke an volti für diesen Beitrag:
  • shift-del, knobbi38
Antworten Top
#10
Kleiner Hinweis, die Verwendung von DataObject ist wohl eher keine gute Idee mehr
vba - Pasting after using DataObject.PutInClipboard returns unknown characters - Stack Overflow
excel - Problems with Obj.Putinclipboard - Stack Overflow
excel - Strange behavior from VBA DataObject. GetText returns what is currently on the clipboard - Stack Overflow
Copy Cell Address to clipboard issue - PutInClipboard not working | MrExcel Message Board
dataobject:putinclipboard openclipboard failed in VBA - Microsoft Q&A


VBA Copy to Clipboard, Paste and Clear - wellsr.com
[-] Folgende(r) 2 Nutzer sagen Danke an Warkings für diesen Beitrag:
  • knobbi38, volti
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste