Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1964to1968
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
Inhaltsverzeichnis

Selection.Copy nur Values möglich in einer Zeile?

Selection.Copy nur Values möglich in einer Zeile?
08.02.2024 18:41:49
Frank Dreier
Hallo Leute,

Wie kann ich in einer Anweisung eine Zelle mit Formeln in eine andere Zelle nur mit Werten kopieren? Ist das möglich? Hier wie es nur komplett geht inkl Formeln etc. in einer Anweisung / Zeile:

Selection.Copy Range("B1")

Damit kopiert er alles fein (inkl. Formeln leider) in Range B1 folgend, egal wieviele Zellen die vorherige Selection ausmacht ohne den Zwischenspeicher von Windows zu nutzen.
Leider funktioniert folgender Code nicht:

Selection.Copy Range("B1").PasteSpecial Paste:=xlPasteValues 


Wenn man diesen Code so schreibt geht es, allerdings wird dann der Zwischenspeicher von Windows genutzt was er nicht soll:

Selection.Copy

Range("B1").PasteSpecial Paste:=xlPasteValues


So etwas dauert leider zu lange, da er so die "copy" Funktion von VBA nicht nutzt (damit kopiert er nur die Werte was gewünscht ist):

Cells(1, 1).Value = Cells(1, 2).Value


Habt Ihr da noch eine andere Idee mit "copy" ohne Zwischenspeichernutzung und kopieren nur der Werte?


15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Selection.Copy nur Values möglich in einer Zeile?
08.02.2024 18:56:59
Heli
Hi,

Du könntest das mal per Array versuchen:

Dim arr As Variant


arr = Selection

Range("B10").Resize(UBound(arr, 1), UBound(arr, 2)) = arr

Du musst nur aufpassen, damit können nur zusammenhängende Bereiche die mehr als eine Zelle beinhalten kopiert werden.

Servus, Heli
AW: Selection.Copy nur Values möglich in einer Zeile?
08.02.2024 18:58:54
daniel
Hi
das einzige was mir einfällt um einen Wert ohne Nutzung des Zwischenspeichers zu übertragen wäre das .Value = .Value
wenn du das aus dem Selection heraus machen willst, so wie in deinen Beispielen, wäre der Code:
Range("B1").Value = Selection(1).Value

also Ziel zuerst und dann die Quelle, mit dem (1) sicherst du ab, das nur eine Zelle übernommen wird, auch wenn die Selection größer ist. (natürlich kannst du auch die Quellzelle anders angeben als mit Selection)
Das sollte jetzt aber auch nicht langsamer oder schneller ein, als die anderen Methoden, zumindest nicht, wenn man es nur einmalig ausführt.

Gruß Daniel
Anzeige
AW: Selection.Copy nur Values möglich in einer Zeile?
08.02.2024 19:05:09
Yal
Hallo Frank,

benutzst Du, neben deiner Excel Version 2007, auch noch einen Rechner mit 1GB ram?

Nein, es gibt keine Alternative zu
Range("B1").Value = Range("B1").Value


Zwischenspeicher wird, egal in welcher Version, immer belegt. Was eigentlich komplett egal ist. Wer ram-effiziente Programm verwenden möchte, sollte lieber auf Linux mit C/C++ umsteigen, als versuchen, Microsoft Produkt zu pseudo-optimieren. Pseudo, weil es sich meistens nur um eine "gefühlte" Optimierung handelt, aber selten eine solche.

Wer schnelle Excel-Anwendung braucht, macht es beruflich. Wer beruflich am Rechner sitzt, sollte in seiner Arbeitsfähigkeit investieren.
Ein Rechner mit anständige Prozessor, 16GB ram, 1TB ssd, Win 11 kostet ca. 550 EUR. Office 365 für 55 EUR/Jahr. Fertig.

VG
Yal


Anzeige
An Heli, Daniel und Yal
08.02.2024 19:56:33
Frank Dreier
Hallo,

vielen Dank für Eure Vorschläge.

Mit arr ist die Geschwindigkeit genauso schnell wie bei .value zu .value. Excel scheint hier die gleiche Operation durchzuführen.
Und danke Daniel für Deine (wie immer) klasse Erklärung.

Hallo Yal, Also die Methode
Range("B1:D50000").Value = Range("E1:G50000").Value
ist deutlich langsamer (ca. 12 Mal) (Bsp. 0,5 Sekunden) als diese Methode:

Range("E1:G50000").Select

Selection.copy (Range("B1")
(Dauer: 0.04 Sekunden)

Bei der ersten Methode wird der interne Speicher von Excel benutzt, bei der 2. Methode der von Windows. Wenn Du diese Operation nun 50 mal ausführst ist das ein erheblicher Unterschied.

Ja, 2007 ist out of Date und ich werde wechseln. Mein Prozessor ist ca. 35% langsamer als der schnellste den man zur Zeit kaufen kann, 16GB Ram, also alles im Grünen Bereich.

Vielen Dank für Eure Antworten!





Anzeige
AW: An Heli, Daniel und Yal
08.02.2024 20:24:13
daniel
aua aua aua.
es ist zwar karneval, aber wenn du gute Antworten haben willst, solltest du auch gleich die richtigen Informationen bereitstellen und nicht erst falsche.
in deiner Eingangsfrage sprichst du immer nur von einer einer Zelle, deren Wert übertragen werden muss.
wenn ich dich zitieren darf:

"Wie kann ich in einer Anweisung eine Zelle mit Formeln in eine andere Zelle nur mit Werten kopieren? "

und auch in der folge in den Codebeispielen kopierst du immer nur eine Zelle.

und jetzt erhöhst du plötzlich auf 150.000 Zellen!
Warum hast du uns das in der Eingangsfrage verschwiegen und immer nur von einer Zelle geschrieben?
WARUM??????????

ich kann dir schon erklären, warum Copy-Paste hier schneller ist als .Value = .Value, hätte zuvor aber gerne von dir eine Erklärung, warum du dich dazu entschieden hast, deinen tatsächlichen Zellbereich erstmal nicht zu nennen, sondern dich auf EINE Zelle zu beschränken.

Gruß Daniel
Anzeige
Daniel
08.02.2024 21:05:24
Frank Dreier
Hallo Daniel,

ja, sorry, das war keine Absicht. Durch die Selection.Copy kann man auch mehr als eine Zelle ansprechen, von daher dachte ich, das reicht als Aussage, aber die Ungenauigkeit am Anfang war schon der Eingangsfehler von mir.

Also ich brauche diese Übertragung für 10000 - 200000 Zellen pro Vorgang. Daher dann auch die Relevanz und es interessiert mich auch ob es da noch andere Möglichkeiten gibt um meinen Horizont zu erweitern.

Kann Du uns den Unterschied erklären?
AW: Daniel
08.02.2024 21:43:25
daniel
naja, du hattest ja immer von EINER Zelle geschreiben und nicht einfach nur so von Zellen. Daher ging ich auch davon aus, dass du auch nur eine Zelle meinst.
es ist nämlich genau die Datenmenge, die den Unterschied zwischen .Value = .Value und Copy+PasteSpecial ausmacht.

hierzu muss man die Unterschiede zwischen beiden Methoden kennen, ich kenne zumindest zwei signifikante:
1. bei jedem PasteSpecial selektiert Excel die Zielzelle und muss daher prüfen, ob es ein SelectionChange-Makro gibt und gegebenenfalls dieses ausführen. Das kostet Zeit, auch wenn es so ein Makro nicht gibt, denn zumindest die Prüfung muss durchgeführt werden.
beim .Value = .Value passiert das nicht.
(das Change-Eventmakro wird in beiden Fällen ausgelöst)

2. beim PasteSpecial führt Excel keine Typumwandlung der eingegebenen Werte durch. Gibt die kopierte Formel einen Text aus, wird immer dieser Text eingefügt und er bleibt Text.
das .Value = .Value hingegen prüft jeden eingefügten Wert auf Inhalt und wandelt um. Aus dem Text "123" wird die Zahl 123, aus dem Text "" eine echte Leerzelle und aus dem Text "=A1+A2" wird die entsprechende Formel. Das kostet natürlich Zeit, um so mehr, um so mehr Daten vorhanden sind.

wenn es rein um die Ausführungszeit geht, lässt sich daraus ableiten, dass. .Value = .Value dann schneller ist, wenn viele einzelne, nicht zusammenhängende Zellbereiche umgewandelt werden müssen (vermeidet jedes mal das SelectionChange), und dass .PasteSpecial dann schneller ist, wenn man viele Daten in einem Großen Block hat, der in einem Schritt bearbeitet werden kann (nur ein SelectionChange, aber keine Typumwandlung).

wenn es nicht auf harten Unterschiede ankommt (nutzung des Zwischenspeichers, Durchführung der Typumwandlung), dann hängt es von der Datenmenge und ihrer Struktur ab, welche Methode besser ist.

und nein, andere Methoden kenne ich nicht, nur diese beiden.

Gruß Daniel
Anzeige
AW: An Heli, Daniel und Yal
08.02.2024 20:28:18
Yal
Hallo Frank,

"Bei der ersten Methode wird der interne Speicher von Excel benutzt, bei der 2. Methode der von Windows. "
Das müsstest Du uns genau erlautern. Ich depperl dachte, es existiert nur den Speicher des Rechners...

VG
Yal
AW: An Heli, Daniel und Yal
08.02.2024 21:11:13
Oppawinni
Ich hab gelesen, dass man Office 2021 Professional Plus für unter hundert Euro als Dauerlizenz haben kann.
Ich werde jedenfalls ne Dauerlizenz anstreben, wenn ich meinen Rechner mangels Win11 Tauglichkeit so zum Jahresende hin ersetze.
Für mich als Rentner wird es das wohl noch lange tun.
Solange ich noch gearbeitet habe, war ich aber mit meinen privaten Office Versionen immer mindestens auf dem Stand wie die Firma, oft sogar voraus.
Anzeige
Yal
08.02.2024 21:10:14
Frank Dreier
Na ja, ich denke Du weißt was ich meine ;) - Excel reserviert sich Speicher von Windows bei der Berechnung/Kopiervorgängen etc, das meine ich mit "internen" Speicher. Darauf kann also kein externes Programm zugreifen in dem Augenblick wo dieser von Excel verwendet wird.

Wenn ich aber die "copy" Funktion benutzt kann es zu Ungereimtheiten im Zwischenspeicher von Windows kommen wenn andere Programme diesen auch benutzen,- das will ich vermeiden und will daher nur den "internen" Speicher von Excel benutzen. Leider ist dieser bei einigen Operationen langsamer beim kopieren als die Zwischenablage von Windows. - Außer man schafft es die "copy" Funktion in einer Zeile abzuschließen (warum auch immer das so ist) - wenn man das hinbekommt, dann wird zwar kopiert aber eben nicht im Zwischenspeicher von Windows abgelegt sondern nur in Excel und der Speed ist annähernd genauso schnell.
Anzeige
AW: Yal
09.02.2024 11:58:56
Yal
Ja, "theoretisch" kann ein Copy über die Zwischenablage von Windows von anderen Prozess gestört werden oder die Daten iwo anders abgelegt werden. Aber die Nanosekunde zwischen Copy und Paste ist nicht gross genug, um einen wahrnehmbare Wahrscheinlichkeit von Störung zu haben. Wenn es so wäre, gäbe es bereit endlose Forum-Diskussion darüber (habe noch nie welche gesehen) und Microsoft hätte bereits reagiert.

Ein sauberen Copy-Paste wird auch mit Application.CutCopyMode = False abgeschlossen, sodass die Zwischenablage wieder leer ist.

VG
Yal
AW: Yal Copy-Funktion Probleme
10.02.2024 17:22:59
Frank Dreier
Hi Yal,

leider habe ich das schon öfter gehabt bzgl. Zwischenablage-Problematik. Das passiert z.B. alle 5-10 Minuten wenn Du mit Excel 2 unabhängige Instanzen laufen lässt (was man ja nicht soll, aber dann werden die Kerne ausgenutzt und Berechnungszeit verkürzt) und innerhalb dieser Zeit ca. 500-1000 copy-funktionen ausführst (viele kann man ja vermeiden, z.B. wenn nur eine Zelle kopiert werden soll, dann reduziert sich das natürlich drastisch).
In meinem Fall würde ich wohl alle Stunde einen Error bekommen. Das äußert sich so, dass eine Excelinstanz einfach aufhört das Makro auszuführen, keine Fehlermeldung und auch kein Makrostop. Es bricht einfach ab, so als wenn Du das Makro nicht gestartet hast - nur mit dem Unterschied, dass Du gerade bei Schritt 50 von 120 warst und das kann dann eine Riesen-"Sauerei" geben das zu beheben.

Anzeige
AW: Copy-Funktion Probleme
12.02.2024 10:04:58
Yal
Ja, VBA ist single threaded. Eine Auslastung von mehreren Kerne ist nur mit mehreren Excel-Instanzen zu erreichen, womit die copy-paste Kreuzwirkung haben könnten. Alles richtig und nachvollziehbar.
Eine Möglichkeit wäre, wenn die Copy-Paste in Schleifen gerufen werden, darin ein "DoEvents" zu platzieren. Es führt zu einer minimalen Pause in dem Code-Ausführung, um Excel die Zeit zu geben, sich zu sortieren, u.a. mit dem Betriebssystem zu kommunizieren. Dann könnte ich mich vorstellen, dass eine Instanz den anderen besser "mitteilen" könnte, dass hier einen Copy-paste gemacht wird und dass die anderen warten sollten (reine Gedanken, keine Erfahrung).

Wie vorab erwähnt, ist es abzuwägen, ob es sich lohnt, soviel Energie und Zeit in den letzten Quantum von Excel zu suchen, oder auf performantere, und jetzt fügen wir dazu stabilere Alternative umzusteigen.

VG
Yal
Anzeige
AW: Copy-Funktion Probleme
13.02.2024 21:24:05
Frank Dreier
Danke für die Anregung. Habe bis jetzt im Netz noch nix dazu gefunden wie Excel dann diesbzgl. kommunizieren könnte,- also im Fall der Fälle. Das wäre natürlich genial. Ich habe jetzt die Zeit investiert und habe die VorAb-Kalkulationen auslagern können - der Code wurde complett ohne "copy"-Funktion über 2 Zeilen geschrieben. Der Codeteil ist nun minimal langsamer als vorher, dafür kann ich aber nun 2 Kerne benutzen :D und habe ca. 80% Geschwindigkeitszuwachs insgesamt. Also hier hat es sich gelohnt.

Dieses Forum hier ist wirklich klasse. Danke auch an Dich und deinen Input.
Vielen Dank für die Rückmeldung
14.02.2024 10:18:37
Yal
Ich habe mich gerade nachgelesen, und stelle fest, dass ich ungenau war (was für dem Fall nicht relevant ist, aber wer weisst, wer noch auf diesem Thread zustosst).

"Eine Möglichkeit wäre, wenn die Copy-Paste in Schleifen gerufen werden, darin ein "DoEvents" zu platzieren. Es führt zu einer minimalen Pause in dem Code-Ausführung, um Excel die Zeit zu geben, sich zu sortieren, u.a. mit dem Betriebssystem zu kommunizieren. "

Erstens: den DoEvents vor oder nach dem Copy-Paste, aber keinesfalls zwischen Copy und Paste!

Zweitens: Excel kommuniziert nicht mit dem Betriebssystem. Es ist nur ein "geben und nehmen": wenn Excel Pause macht ("DoEvents"), hat das Betriebssystem dann die Möglichkeit, Aktivitäten zu erledigen, die dann nicht mehr zwischen Copy und Paste stattfinden müssten (bzw. willkürlich). Beim Multithreading ist es natürlich abgeweicht, aber die Zwischenablage ist eben gemeinsam über alle Kerne verwendet.

VG
Yal

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige