HERBERS Excel-Forum - das Archiv
Code-Reihenfolge 2. "Leeren" ist schneller als 1. "Kopieren"
Thorsten
Guten Abend Excelfreunde,

ich habe mit dem 2. Teil des Codes ein Problem.
Das Datenentfernen in der "S"-Spalte scheint schneller zu sein als das kopieren.
In AG1 steht ein generierter Text, der sich aus einen Vortext, Mitteltext und einem Nachtext zusammenstelt. Wenn ich dann mein Kopiertes wo anders einfügen möchte, fügt es nur den Vor- und Nachtext ein. Es scheint also so, dass das Leeren der Spalte "S" schneller ist, als der Kopiervorgang, denn wenn in Spalte S nichts steht generiert sich auch kein Mitteltext.
Wenn AD5 = WAHR wird es per E-Mail gesendet. Das funktioniert.



Sub Bestellung_senden()

If Range("AG5").Value > 0 Then
If Range("AD5").Value = True Then
Call MailSenden
Range("S6:S500").ClearContents
Else
Range("AG1").Copy
Range("S6:S500").Select
Selection.Formula = ""
End If
Else
MsgBox "Keine Bestellung vorhanden." & vbLf & vbLf & _
"Bitte in Spalte ORDER Stückzahl eingeben.", vbInformation, "Achtung!"
End If
End Sub


Was kann man tun?
Für Hilfe schon mal besten Dank,
LG Thorsten
AW: Code-Reihenfolge 2. "Leeren" ist schneller als 1. "Kopieren"
Daniel
Hi

Wann und wie führst du denn denn einfügen durch?

Normalerweise würde man nach dem Kopieren auch sofort einfügen und nicht erst irgendwann später.

Gruß Daniel
Beim anschließenden Einfügen "strg+V"
Uduuh
Hallo,
das Ausführen von VBA löscht die Zwischenablage.

Gruß aus'm Pott
Udo
AW: Code-Reihenfolge 2. "Leeren" ist schneller als 1. "Kopieren"
xlKing
Hallo Thorsten,

ich hab hier noch nicht geantwortet, weil ich mich erst mal intensiv mit dem Problem beschäftigt habe. So wie es aktuell scheint, wird der Text innerhalb der Zwischenablage angepasst. Range.Copy kopiert erstmal eine Zelle mit allem drum und dran in die Zwischenablage. Das kann man mit der API-Funktion IsClipboardFormatAvailable gut prüfen. In der Zwischenablage befinden sich dann, die Formate 2,8,17,5,129 (bzw. &H81), 14, 16, 3, 7, 4, 1 und 13) Die 1 steht dabei für Text. Definition der anderen Formate siehe hier: https://learn.microsoft.com/en-us/windows/win32/dataxchg/standard-clipboard-formats

Wenn ich den Text ohne vorheriges Löschen der Spalte S irgendwo einfüge ist er auch korrekt. Durch das Löschen wird jedoch die Formel aktualisiert (könnte man mit
Application.Calculation = xlCalculationManual
verhindern) womit der Text in der Zwischenablage sich ebenfalls aktualisiert. Es wird also offenbar nur eine Verknüpfung zur Zelle kopiert. Um solche Probleme zu verhindern setzen andere Range-Eigenschaften wie .ClearContents oder .Value den Cutcopymode auf False, weshalb man nach Änderung von Daten grundsätzlich neu Kopieren muss. Bei .Formula-Eigenschaft wurde diese Zusatzfunktion offenbar vergessen. (Bug im VBA???).

So wie ich das sehe, bleiben dir drei Möglichkeiten. Entweder du fügst vor dem Löschen der Spalte S deinen Text per Code in Outlook ein. Da können dir hier Andere behilflich sein. Ich habe leider kein Outlook um zu testen.

Oder du bleibst bei deinem bisherigen Schema und schmeist deinen Text über API in die Zwischenablage. Schau dir dazu mal den Code von Karl-Heinz an. https://www.vba-forum.de/View.aspx?ziel=62728-String_in_Zwischenablage_kopieren. anstatt "Teste mich" brauchst du dann einfach Range("AG5").Text zu nehmen. Probiers mal aus.

Gruß Mr. K.

Mit Umgehung gelöst
Thorsten
Hallo Mr. K

vielen Dank für die intensive Problembehandlung / Antwort, die jedoch meine Kenntnisse übersteigt.
Mir war gerade ein Gedanke gekommen, wie ich den Bug umgehe.
Nach kopieren fügt es jetzt den Inhalt zuerst in eine andere Zelle als Text ein.
Erst danach wir der Bereich in S geleert. Danach die neue Zelle mit Text kopiert.
So ist es komplett in der Zwischenablage und der S-Bereich ist wieder leer. :-)

LG aus Neuseenland
Thorsten
PS. nicht verwechseln mit Neusseeland (Das wäre schön).





AW: Code-Reihenfolge 2. "Leeren" ist schneller als 1. "Kopieren"
Daniel
Das Excel beim kopieren nur die Refenz auf die Zellen speichert und dann beim Einfügen die Aktuellen Werte holt, hätte ich jetzt auch vermutet.

Zur Abhilfe könnte man die Zelle kopieren und dann sofort in eine Freie Zelle als Wert einfügen und dann diese Zelle kopierem bevor man weiter macht,
Oder man schreibt den Wert direkt in die Zwischenablage.
Wenn man da nur Text reinschreiben will,, get das aber deutlich einfacher als von dir gezeigt mit PutInClipboard
https://learn.microsoft.com/de-de/office/vba/language/reference/user-interface-help/paste-putinclipboard-settext-methods-example

Ggf muss man vorher über Extras-Verweise noch den Verweis auf die Microsoft.Forms 2.0 aktivieren.

Gruß Daniel
AW: Code-Reihenfolge 2. "Leeren" ist schneller als 1. "Kopieren"
xlKing
Hi Daniel,
Danke für den Tipp. Bei der Verwendung von PutInClipboard hatte ich in der Vergangenheit oft das Problem, dass da nur zwei Fragezeichen ankamen. Wie sich herausstellte war ich da nicht der Einzige. Auch hier im Herber-Forum wurde offenbar bereits darüber diskutiert. https://www.herber.de/forum/archiv/1424to1428/1426787_DataObject__PutInClipboard_funktioniert_nicht.html#6
Deshalb verwende ich lieber Voltis Lösung. Die hat bisher immer funktioniert.

Auf die Idee mit dem Umweg über eine Extra-Zelle ist Thorsten offenbar jetzt auch gekommen. Ich leider nicht. Hab ich mal wieder viel zu kompliziert gedacht. Dann ist dieser Thread ja jetzt gelöst. Dennoch bleibt es für mich ein Phänomen, dass der Text erst beim Einfügen vom kopierten Objekt geholt wird und sich somit nicht fix in der Zwischenablage befindet. Da ich auch gern Klassenprogrammierung mache, verstehe ich das sogar. Aber gut finde ich das dennoch nicht. Werde da nochmal bisschen drüber grübeln. ;-)

Gruß Mr. K.

AW: Code-Reihenfolge 2. "Leeren" ist schneller als 1. "Kopieren"
Daniel
ok die probleme kannte ich jetzt nicht.
aber das andere würde ich mir nicht zutrauen zu programmiern.

aber noch einen andern Fall für dich, wenn du da sowieso am Untersuchen bist:
mach mal folgendes:
schreibe in die Zellen A1:A10 eine 1
kopiere eine dieser Zellen (egal welche) und füge sie mit Inhalte Einfügen - Werte - Vorgang: Addieren in die anderen Zellen ein
die kopierte Zelle muss dabei Teil des Einfügebereich sein.
Gruß Daniel
AW: Code-Reihenfolge 2. "Leeren" ist schneller als 1. "Kopieren"
xlKing
Uiii, das Problem ist auch mir neu. Bis zur markierten Zelle wird es wie geplant eine 2 in allen weiteren Zellen dann eine 3. Scheint auf dasselbe Problem hinauszulaufen, dass der Inhalt der Zelle erst aktualisiert und dann neu beim Einfügen für die anderen Zellen herangezogen wird. Ich arbeite jetzt aber nicht für Kleinweich, falls du das denkst. Solche Bugs sollten die schon selbst im Auge haben. Andererseits, wann nutzt man schon die Funktion Addieren. Allenfalls nutze ich multiplizieren mit 1 um Texte in Zahlen umzuwandeln. Alles andere mache ich mit Formel. Aber interessant zu wissen, dass es noch mehr solcher lustigen Sachen gibt, mit denen man auf Anhieb nicht rechnet. :-)

Gruß Mr. K.
AW: Beim anschließenden Einfügen "strg+V"
Thorsten
Hallo Udo,

Löschen tut es die Zwischenablage nicht. Es fügt ja ein Teil ein.
Es wird nur der Inhalt einer Zelle kopiert und anschließend ein Teil davon herausgenommen. Das wäre sehr mysteriös.
Bitte schau Bild im Anhang an.
Userbild
Es ist denke ich eindeutig, dass erst die Spalte S mit "" überschrieben wird und dann kopiert es in die Zwischenablage.
Ich habe einen Test gemacht und statt "" eingeben: Range("S6:S500").Formula = 1
Das Ergebnis nach Klick auf Kopieren, in der Zwischenablage waren alle Positionen der Spalte S also auch die, wo keine Stückzahl eingegeben wurde mit 1 Stück enthalten.
Es muss also etwas am Code falsch sein. Leider sind meine VBA-Kenntnisse bei 1%.

Gruß aus Neuseenland
Thorsten
AW: Beim anschließenden Einfügen "strg+V"
BoskoBiati
Hallo,

aus Deinem Code läßt sich eigentlich nichts nachvollziehen. Es ist nirgendwo ersichtlich, dass da etwas zusammengestellt wird. Außerdem ist nirgendwo eine Codezeile, die den Bereich S6:S500 kopieren würde.
Das hier :
Range("S6:S500").Select
Selection.Formula = ""

ist ganz einfach hiermit zu erschlagen:

Range("S6:S500") = ""


Gruß

Edgar
AW: Beim anschließenden Einfügen "strg+V"
ralf_b
du kannst Range("S6:S500") auch erst ganz am Ende des Makros leer machen. Damit kannst du deine Vermutung verifizieren.

Es stellt sich mir grad die Frage ob der Hinweis auf MS-Outlook überhaupt so richtig ist. Durch Outlook-New gibt es kein VBA mehr im Outlook. Gehen dann die Makros überhaupt noch? Und wenn nicht, dann ist das Häkchen mit der Outlook Nachfrage nur die halbe Wahrheit.
AW: Beim anschließenden Einfügen "strg+V"
Thorsten
Hallo Ralf,

es macht keinen Unterschied, wenn die Zeile mit Formula="" an das Ende des Codes gesetzt wird.
Ergebnis ist gleich. Ich sehe, dass andere mein Problem nicht richtig erkannt haben. Vermutlich habe ich mich nicht klar ausgedrückt. Deshalb in Anlage ein Beispiel hochgeladen. Da sollte das Problem verständlich sein.
https://www.herber.de/bbs/user/177703.xlsx

Für mich bleibt es ein Rätsel. Die Zwischenablage wird nicht gelöscht, wie zuvor geschrieben wurde.
Es ist eindeutig, dass erst "Formula" ausgeführt und dann kopiert wird.

Mit dem Hinweis auf Outlook hast du recht. Das wusste ich schon aus einer vorherigen Anfrage.
Outlook Neu hat für VBA nicht die erforderliche Schnittstelle.
Falls es dich interessiert, hat hier Case dazu geschrieben.
https://www.herber.de/forum/archiv/2012to2016/2013631_EMail_VersandCode_ok.html#2013644

Gruß aus Neuseenland
Thorsten
AW: Beim anschließenden Einfügen "strg+V"
BoskoBiati
Hi,

super, eine Datei mit Makros als xlsx! Wie sollen wir die Makros testen, wenn keine da sind?

Gruß

Edgar

AW: Code-Reihenfolge 2. "Leeren" ist schneller als 1. "Kopieren"
Thorsten
Hallo Daniel,

klar wird es gleich eingefügt, aber in ein anderes Programm.
Das Problem ist auch nicht das Kopieren und Einfügen.
Ich versuche es mal so zu erklären:
In AG1 steht ein zusammenfeasster gemerierter Text, der sich zusammenstellt aus Z1&Z2&Z3
Z2 setzt wiederum zusammen aus Daten der Spalte S.
Die Daten der Spalte S sollen automatisch nach dem Senden oder Kopieren gelöscht werden.
Nachdem ich in "S" Daten hienterlegt habe, werden diese auch korrekt in AG1 mit angezeigt (also zusammengefasst Z1&Z2&Z3)
Beim Ausführen des Makro mit Wahrheitswert Kopieren, kopiert es auch AG1.
Beim anschließenden Einfügen "strg+V" ist aber nur der Inhalt Z1+Z3 enthalten.
Das kann nach meinem Verständnis nur geschehen, weil die Daten in Spalte S schneller mit "" überschireben sind als der Kopiervorgang.
Wenn in Spalte "S" nicht drin steht ist auch Z2 leer.
Ich hoffe es ist so einigermaßen Verständlich.
LG Thorsten