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

Per VBA,ohne Copy zu nutzen: mehrere Zellen mit 2 dividi?

Per VBA,ohne Copy zu nutzen: mehrere Zellen mit 2 dividi?
05.02.2024 13:42:34
Frank Dreier
Hallo Leute,

ich versuche gerade alles umzuschreiben und die ganzen Copy.Funktionen herauszunehmen. Soweit so gut. Nun stoße ich auf ein Problem:

Range("A1:D50000").Value = Range("E1:H50000").Value
funktioniert und Excel kopiert alle Zellen mit individuellen Werten in die anderen Zellen in einem akzeptablen Speed im Gegensatz zur Standard Copy-Paste-Value Funktion wo man ja den Zwischenspeicher von Windows nutzen muss.

Warum funktioniert das nicht mit einer einfachen Division einer Konstanten?:
Range("A1:D50000").Value = Range("E1:H50000").Value / 2


Eine Lösung die ich gefunden habe, aber zu langsam ist (da Excel jede Einzelne Zelle abfragt), ist diese (Verwendung von for oder Schleife):

Range("A1:D50000").Select


'Dim zelle As Range
'For Each zelle In Selection
'zelle.Value = zelle.Value / 2
'Next zelle


Das dauert fast 13 Sekunden bei mir. Mit der Copy und Special-Paste funktion (die ich nicht nutzen kann) dauert es 0.1 Sekunde (!)

Kann man das irgendwie über ein Array Lösen? Excel hat einfach das Problem, dass wenn man Versuche unternimmt das ohne Schleifen/Individualabfrage der Zellen zu lösen, alle Zellen mit dem gleichen Inhalt füllt und nicht individuell per Zelle vorgeht. In dieser folgenden, relativ schnellen Funktion funktioniert das komischerweise (also schnell und individuell jede Zelle kopiert) -allerdings ohne Rechenoperationen (z.B. durch 2 Teilen) oder ich bin einfach nur unwissend und man kann das hier irgendwie einfügen (also durch 2 zu teilen?):

Range("A1:D50000").Value = Range("E1:H50000").Value


Habt Ihr noch andere Ansätze um mehrere Zellen durch 2 zu dividieren?

Vielen Dank!

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Per VBA,ohne Copy zu nutzen: mehrere Zellen mit 2 dividi?
05.02.2024 13:52:21
Yal
Hallo Frank,

wie folgt sollte es funktionieren:

Sub Dividiere()

Dim Arr
Dim E

Arr = Range("E1:H50000").Value
For Each E In Arr
E = E / 2
Next
Range("A1:D50000").Value = Arr
End Sub


VG
Yal
AW: Per VBA,ohne Copy zu nutzen: mehrere Zellen mit 2 dividi?
05.02.2024 14:21:52
onur
Wäre mein Code für 30.000 Zeilen schnell genug?

Userbild
AW: Per VBA,ohne Copy zu nutzen: mehrere Zellen mit 2 dividi?
08.02.2024 21:15:31
daniel
Warum funktioniert das nicht mit einer einfachen Division einer Konstanten?:
Range("A1:D50000").Value = Range("E1:H50000").Value / 2

weil VBA ein BASIC und damit eigentlich eine ziemlich alte einfache Progammiersprache ist, in der man noch ziemlich viel selber programmieren muss.
Da funktioniert eine Einzelwertoperation wie +-*/ auch wirklich nur mit Einzelwerten und kann nicht auf Arrays angewendet werden. Das ist dann ein Komfort, den erst weiter Entwickelte Programmiersprachen haben oder den Excel in seiner Formelsprache hat, da Formelsprachen keine Schleifenanweisungen haben. (obwohl, ist mittlerweile auch nicht mehr ganz richtig, mit NACHEZEILE und NACHSPALTE bekommen Excelformeln jetzt auch explizite Schleifenelemente)

Habt Ihr noch andere Ansätze um mehrere Zellen durch 2 zu dividieren?
ja, sogar für die Kombination der Aufgabe: übernimm Werte aus anderen Zellen und Teile sie durch 2, das geht in einem Schritt, ohne Nutzung der Zwischenablage.
With Range("A1:D50000")

.FormulaR1C1 = "=RC[4]/2"
.Formula = .Value
End with

bitte mal in deinen Speedvergleich mit aufnehmen und dabei berücksichtigen, dass hier nicht nur durch zwei geteilt wird, sondern gleichzeitig die Werte aus dem anderen Zellbereich übernommen werden.

Gruß Daniel
Anzeige
Onur Du Überflieger .... ;)
05.02.2024 14:27:28
Frank Dreier
Yal's Code benötigt bei mir 0,23 Sekunden, vermute Deiner ist ähnlich? (Du hast ja mehr Power etc. als ich) Wenn Du mich nicht dumm sterben lassen willst... würdest uns den Code verraten *lächel*??

AW: Onur Du Überflieger .... ;)
05.02.2024 14:30:13
onur
Ohne Schleife:


Private Sub CommandButton1_Click()

Dim rng, ti
ti = Timer
Set rng = Range("A1:D30000")
rng = Evaluate(rng.Address & "/2")
Range("I1:L30000") = rng
MsgBox Timer - ti & " sec"
End Sub
AW: Onur Du Überflieger .... ;)
05.02.2024 14:32:54
onur
Aber nicht unbedingt schneller als Yal´s Version.
Onur und Yal fast gleicher Speed, vielen Dank
05.02.2024 14:44:00
Frank Dreier
Mit Onur's Code (0.32 Sekunden bei mir, mehrmals getestet)

Dim rng

Set rng = Range("E1:H50000")
rng = Evaluate(rng.Address & "/2")
Range("A1:D50000") = rng
Exit Sub


Mit Yal's Code (0.35 Sekunden bei mir, mehrmals getestet)

Dim Arr		

Dim i, j
Arr = Range("E1:H50000").Value
For i = 1 To UBound(Arr, 1)
For j = 1 To UBound(Arr, 2)
Arr(i, j) = Arr(i, j) / 2
Next
Next
Range("A1:D50000").Value = Arr


Interessant wo jetzt die 0.03 Sekunden abbleiben aber damit können wir es belassen, außer jemand möchte das gerne erklären. Danke nochmals für Eure Mithilfe!
Anzeige
AW: Onur und Yal fast gleicher Speed, vielen Dank
08.02.2024 19:04:05
Pappawinni
Mit Copy geht das aber bei mir auch ähnlich schnell, wenn es nur ne multiplikation ist...

Sub divideByTwo()


Dim rngSource As Range
Dim rngTarget As Range
Dim dblTi As Double

dblTi = Timer

Set rngSource = Range("E1:H50000")
Set rngTarget = Range("A1:D50000")
rngTarget = 0.5
rngSource.Copy
rngTarget.PasteSpecial Operation:=xlPasteSpecialOperationMultiply

MsgBox Timer - dblTi & " sec"

End Sub
AW: Onur und Yal fast gleicher Speed, vielen Dank
08.02.2024 20:39:34
Pappawinni
also ich hab mal die Lösungen von Onur, Yal und mir in eine Sub gepackt und bei den Ergebnissen

Onur :0,3984375 sec Pappawinni :0,328125 sec Yal :0,4375 sec
Onur :0,34375 sec Pappawinni :0,2890625 sec Yal :0,484375 sec
Onur :0,34375 sec Pappawinni :0,234375 sec Yal :0,4140625 sec

sind 0,03 Sekunden nichts...

Es ist zwar hier gerade nicht aufgetreten, aber ich hatte auch Fälle, wo die Lösung von Yal schneller war, als die von Onur.
Da macht sicht halt wahrscheinlich jeder Furz den Windows im Hintergrund veranstaltet bemerkbar.

Anzeige
Korrektur
05.02.2024 13:55:33
Yal
scheint so nicht zu funktionieren. Aber so:

Sub Dividiere()

Dim Arr
Dim i, j

Arr = Range("E1:H50000").Value
For i = 1 To UBound(Arr, 1)
For j = 1 To UBound(Arr, 2)
Arr(i, j) = Arr(i, j) / 2
Next
Next
Range("A1:D50000").Value = Arr
End Sub


VG
Yal
Klasse Yal! Funktioniert und ist schnell :)
05.02.2024 14:07:22
Frank Dreier
Das Arr hat es gebracht. Ich hatte das mal bei Daniel irgendwo gesehen, daher konnte ich mich schwach daran erinnern, dass es hier evtl. eine andere Möglichkeit gibt und Du hast sie parat. Vielen Dank!!
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige