Genau diese Kombination habe ich schon mal vorgeschlagen!
Moin!
Prinzipiell sehr gut und seit Jahrzehnten überfällig.
Dürfte auch für die meisten Anwender problemlos sein.
Hat aber den nicht unerheblichen Nachteil, dass es mit Spill-Funktionen nur dann zurechtkommt, wenn vorher der SpillingToRange markiert wird.
Beispiel:
In A1 steht =SEQUENZ(5)
Kopiere ich A1
und füge den Wert mittels Strg+Umschalt+v in A1 ein, erhalte ich #ÜBERLAUF!
markiere ich C1, erhalte ich mit Strg+Umschalt+v nur die 1 (aus A1), aber nicht den SpillingToRange
Man muss also vorher (mindestens) den Range A1:A5 markieren, damit das klappt.
Da ich recht häufig Beispieldatensätze mittels Spill fülle und sie danach durch den Wert ersetze, wird der Shortcut Strg+Umschalt+w (w wie Werte) aus meiner Personal.xlsb noch nicht arbeitslos:
Sub FormelInWert()
'Shortcut Strg+Umschalt+W
Dim x As Range
If TypeName(Selection) = "Range" Then
With Application
.ScreenUpdating = False
For Each x In .Selection.Areas
If x.HasSpill Then
With x.SpillParent.SpillingToRange
.Copy: .PasteSpecial xlPasteValues
End With
Else
x.Copy: x.PasteSpecial xlPasteValues
End If
Next
.CutCopyMode = False
.Goto ActiveCell
End With
End If
End Sub
Gruß Ralf
Das Makro müsste doch eigentlich auch mit einfacher Zuweisung von .Value anstelle eines .Copy gehen?
Hajo: "... damit der Cursor nicht wie ein Hund gassi gehen muss." ;) (stimmt hier nicht ganz)
Es bliebe dann nur bei Verwendung von .Selection.
(29.10.2022, 08:36)LCohen schrieb: [ -> ]Das Makro müsste doch eigentlich auch mit einfacher Zuweisung von .Value anstelle eines .Copy gehen?
Ja, sicher datt!
"Sauberer" ist imo aber .Copy .PasteSpecial
Ich habe vor Jahren mal bewiesen, dass letzteres "erheblich" schneller arbeitet als .Value = .Value
Erheblich heißt: grob Faktor 3
Aber Du hast natürlich Recht!
Ob das Makro nun 1E-10 oder 3E-10 benötigt, ist recht egal.
Verglichen habe ich das nie, aber bei .Copy werden doch alle anderen Eigenschaften auf das Ziel mit übertragen (die es hier ja schon hat).
Dann müsste das bloße Zuweisen von .Value speicherintern ungünstiger ablaufen. Z.B. könnte nur .Copy intern tatsächlich einen Adress-Block zuweisen, wenn Du recht hast. .Value würde dann z.B. über eine Schleife funktionieren. Alles unterhalb der User-Sprachebene von VBA.
Ich habe es mal nachgestellt.
Zunächst mal geben wir dem PC ein "wenig" Futter - 10.000.000 Zufallszahlen per Formel
Hinterlegt sind folgende Makros:
Sub FillIt()
' 10.000.000 Zufallszahlen, dauert ein paar Sekunden!
Dim Start#
Cells.Clear
Start = Timer
Cells(1, 1).Resize(10000, 1000).Formula = "=Rand()"
Debug.Print "Fülldauer: " & Timer - Start & " Sekunden"
End Sub
Sub Val2Val()
Dim Start#
Start = Timer
With Range("A1").CurrentRegion
.Value = .Value
End With
Debug.Print "Wert gegen Wert: " & Timer - Start & " Sekunden"
End Sub
Sub Copy2Values()
Dim Start#
Start = Timer
With Range("A1").CurrentRegion
.Copy: .PasteSpecial xlPasteValues
End With
Debug.Print "Kopieren zu Wert: " & Timer - Start & " Sekunden"
With Application
.CutCopyMode = False
.Goto Cells(1)
End With
End Sub
Gestartet wird dann folgendes Makro:
Sub LetsDoIt()
FillIt
Val2Val
FillIt
Copy2Values
End Sub
Ergibt in meinem Direktfenster:
Code:
Fülldauer: 5,5703125 Sekunden
Wert gegen Wert: 15,55859375 Sekunden
Fülldauer: 5,4921875 Sekunden
Kopieren zu Wert: 2,16796875 Sekunden
Die .PasteSpecial-Methode ist folglich 7,18-mal schneller …
(hat mich mein Gedächtnis doch ein wenig getrogen)
Mögliche Erklärung:
Die Zelleigenschaften liegen ja schon gespeichert vor.
Ein .Copy hat folglich keine Rechenarbeit.
Mittels .Value muss aber erst diese spezielle Eigenschaft ausgelesen werden.
Übrigens recht interessant:
Bei obiger Datenbasis dauert ein manuelles Strg+Umschalt+v handgestoppt bei mir fast vier Sekunden, also länger als die .PasteSpecial-Methode
(29.10.2022, 10:28)RPP63 schrieb: [ -> ]Die .PasteSpecial-Methode ist folglich 7,18-mal schneller …
(hat mich mein Gedächtnis doch ein wenig getrogen)
Kann ich bestätigen:
Code:
Fülldauer: 3,25 Sekunden
Wert gegen Wert: 11,07421875 Sekunden
Fülldauer: 3,10546875 Sekunden
Kopieren zu Wert: 1,55859375 Sekunden
War das nicht mal eine Diskussion im OE-Forum? Für mich war es auch überraschend, dass .Value = .Value soviel langsamer ist.
Gruß Uwe