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

copy-funktion umgehen mit Activecell.value, Auswirkung?

copy-funktion umgehen mit Activecell.value, Auswirkung?
27.12.2023 01:10:48
Frank Dreier
Hallo Leute,

ich habe etwas "wildes" vor. Um die Berechnungszeit zu halbieren möchte ich 2 unabhängige Excel-Instanzen gleichzeitig via Makro ablaufen lassen um die Berechnungszeit zu halbieren (indem man einfach mehrere, vorhandene CPU-Kerne benutzt - das geht aber eben nur mit 2 gleichzeitig, unabhängig voneinander gestarteten und geöffneten Excels, dann kann man 2 Makros "parallel" ablaufen lassen).

Nun zum Problem: Wenn man 2 Excel-Instanzen öffnet und bei beiden Makros ablaufen lässt, funktioniert das zwar- allerdings nur bis zu dem Punkt wenn man die Copy-Funktion benutzt im Code. Wird in beiden gleichzeitig oder kurz hintereinander diese benutzt (z.B. um Werte zu kopieren etc.) dann brechen in der Regel beide Makros ab- ohne Fehlermeldung. Das liegt daran, dass der gecachte Inhalt nicht mehr der gleiche ist, da das "andere Excel" (Excel 2) auch die externe Kopierfunktion benutzt und Excel 1 (erste Instanz) dann irgendwie merkt: Hey, der Cache-Inhalt ist nicht mehr der gleiche wie ich ihn gerade eingelesen habe!

NUN ZUM PROBLEM: Lohnt es sich die .copy-Funktionen in Makros zu vermeiden und stattdessen mit z.B:

Sheets("Tabelle1").Select
Range("A1").Select
x = ActiveCell.Value
Sheets("Auswertung").Select
Range("B2").Select
ActiveCell.Value = x

zu arbeiten um eben das oben genannte Problem zu umgehen? Der Wert wird so auch von A1 nach B2 "kopiert" allerdings ohne die Kopierfunktion (und damit das oben beschriebene Problem) anzufassen. Man braucht also keinen "externen" Zwischenspeicher oder gibt es hier eine andere Lösung, z.B. dass man Excel einen externen Zwischenspeicher "1" zuweisen kann und in einem anderen Fall den "externen Zwischenspeicher "2"?

Ich meine mich daran erinnern zu können, dass das früher ging und Excel verschiedene Zwischenspeicher anlegen konnte.

Hat damit schon jemand Erfahrungen oder vieleicht sogar andere Lösungen gefunden, 2 Excel-Instanzen mit Makros parallel laufen zu lassen? Habe den Code schon optimiert etc., bei einer Instanz dauert es einfach sehr lange.

Vielen Dank für Eure Ideen im Voraus!

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: copy-funktion umgehen mit Activecell.value, Auswirkung?
27.12.2023 02:31:42
Mullit
Hallo,

bevor Du wild mit Instanzen rummachst, erstmal ran an die Grundlagen, das hier ist Recorder-Code, den wollen wir gar nicht sehen...


Sheets("Tabelle1").Select
Range("A1").Select
x = ActiveCell.Value
Sheets("Auswertung").Select
Range("B2").Select
ActiveCell.Value = x

..sondern schreibt das so:
Worksheets("Auswertung").Range("B2").Value = Worksheets("Tabelle1").Range("A1").Value

s.a:
https://www.online-excel.de/excel/singsel_vba.php?f=78

Wenn Dein ganzer Code so aussieht, könnte man die Berechnungszeit innerhalb einer Instanz schon locker halbieren...;-)

Gruß, Mullit


Anzeige
AW: copy-funktion umgehen mit Activecell.value, Auswirkung?
27.12.2023 02:46:12
onur
Hallo Mullit,

Zwei "Doofe" - ein Gedanke! Nur, dass du schneller warst.

Gruß
Onur
AW: copy-funktion umgehen mit Activecell.value, Auswirkung?
27.12.2023 02:44:07
onur
"bei einer Instanz dauert es einfach sehr lange. " - Wenn du so laienhaft programmierst, wie in deinem Beispielcode, wundert mich das überhaupt nicht.
Das
Sheets("Tabelle1").Select

Range("A1").Select
x = ActiveCell.Value
Sheets("Auswertung").Select
Range("B2").Select
ActiveCell.Value = x

ist das Selbe wie das hier:
Sheets("Auswertung").Range("B2" = Sheets("Tabelle1").Range("A1")

"Ich meine mich daran erinnern zu können, dass das früher ging und Excel verschiedene Zwischenspeicher anlegen konnte. " Es gibt nur EINEN Zwischenspeicher, und der kommt nicht von Excel, sondern von Windows, wird nur von Excel mitbenutzt - sonst könntest du z.B. nicht von Word was kopieren und in Excel einfügen.
"Habe den Code schon optimiert etc., bei einer Instanz dauert es einfach sehr lange. " - Hättest ihn besser mal posten sollen, da ist bestimmt jede Menge Optimierungsbedarf.
Anzeige
Leider noch keine Antwort, danke für die Tipps bis jetzt
27.12.2023 08:56:26
Frank Dreier
Danke für die Beiträge bis jetzt. Die Optimierung bzgl. des Beispiels ist gut, wird implementiert, bringt aber nix. Das liegt daran, dass nicht der Code bzgl. Berechnungszeit das Problem ist, sondern die Berechnungszeit resultiert aus 50000x8 und das mal 120 Auswertungen. Also die Berechnungszeit resultiert aus der Auswertung und hat nix mit dem Macro-Code/Ablauf zu tun.

Zurück zum Thema: Nach meinem Test mit 2 Instanzen und 2 Makros parallel funktioniert mein Beispiel (danke an Mullit für Optimierung):

Worksheets("Auswertung").Range("B2").Value = Worksheets("Tabelle1").Range("A1").Value

mit 2 Excel Instanzen parellel, da der Windows-Zwischenspeicher (also Ablage) nicht benutzt wird. Man kann mit Excel zwar den Zwischenspeicher bei der Copy-Funktion einsehen und dieser kann bis zu 24 unterschiedliche Zwischenspeicher Stände unterscheiden, bringt aber nix, da diese Zwischenspeicher von Excel-Instanz 1 automatisch in die 2. geöffnete Excel-Instanz übernommen wird und somit die Zwischenspeicherstände sich verändern in der 2. Instanz. Evtl. kann man hier noch etwas machen, das wäre aber eine eigene Frage.

Ich glaube die Benutzung von 2 Excel Instanzen parallel ist hier kein gern gesehenes Thema. Evtl. stelle ich die Frage noch einmal etwas anders, allerdings ohne diese 2 Instanzen. Vielen Dank erstmal für die Antworten.
Anzeige
AW: Rechne möglichst alles im Speicher
27.12.2023 10:29:08
Sulprobil
Hallo Frank,

45 min Rechenzeit sollte man reduzieren können.

Beispiel: https://www.bplumhoff.de/fair_zufaellig_verteilen_de/

Insbesondere: Nach Möglichkeit greift das Programm nicht ständig auf einzelne Tabellenzellen zu, sondern speichert ganze Tabellenbereiche mit einem Befehl in Variant Variablen, rechnet anschließend mit diesen Bereichen im Hauptspeicher und schreibt die Ergebnisse am Ende wieder mit einem Befehl aus den Variant Variablen in die Excel Tabellen zurück. Die hat bei mehreren Tausend Datensätzen enorme Geschwindigkeitsvorteile.

Gegebenenfalls bringt auch https://www.bplumhoff.de/systemstate_de/ noch etwas.

Viele Grüße,
Bernd
Anzeige
AW: copy-funktion umgehen mit Activecell.value, Auswirkung?
27.12.2023 13:14:16
Piet
Hallo Frank

bis jetzt konnte ich nirgendwo lesen was du da berechnest. Bei 50000x8 wär's interessant uns zu sagen worum es da geht??
Das könnte ggf. mit einer Kombination aus Formeln und diese nach dem Berechnen in Werte umwandeln viel effektiver sein.

Solange wir aber keine Beispiel Datei sehen ist das nur "heiteres Ratespiel", im Sinne von "im dunklen Raum eine schwarze Katze suchen!"
Und wieviele "schwarze Katzen" stecken jetzt in deiner Datei?? Lass die doch mal raus aus dem Sack, dann können wir Weisse daraus machen!
Eine kleine Beispieldatei mit ca. 20-50 Zeilen anonyme Beispieldaten reichen uns doch um den Tabellenaufbau zu verstehen.

@Mullit + onur -- ich würde sagen, zwei "schlaue und ein Gedanke", entspricht mehr eurem Wissen und Können! Herzliche Grüsse.

mfg Piet
Anzeige
AW: Leider noch keine Antwort, danke für die Tipps bis jetzt
27.12.2023 09:23:06
onur
Nix für Ungut, aber: Wenn du doch schon alles besser weisst, wieso fragst du eigentlich das Forum ?
"Ich glaube die Benutzung von 2 Excel Instanzen parallel ist hier kein gern gesehenes Thema." ? Hat nix mit "gern gesehen" zu tun. Ist einfach nur, in diesem Falle, Quatsch.
Bloss weil DU dich darauf eingeschossen hast, dass es an der "Copy-Funktion" liegen müsse, muss das nicht zutreffen, aber du willst ja keine anderen Gründe akzeptieren.
Bei "VBA bescheiden" den Code als Ursache von vornherein auszuschliessen (und das gegen den Ratschlag derjenigen, die du gefragt hast), ist recht gewagt.
Mal abgesehen davon, dass auch Formeln optimiert und dadurch viel schneller werden können.
Aber da du ja "Excel gut" bist, hast du sie bestimmt auch schon optimiert und wir könnten sie bestimmt nicht noch verbessern....
Aber trotzdem - ich versuche es noch einmal: Poste die Datei und ich wette mit dir, dass sie mindestens doppelt so schnell werden kann.
Anzeige
das könnte auch an was Anderen liegen.
27.12.2023 09:23:12
ralf_b
und zwar an deiner Excelversion und die spezielle Anwendung. Ab Version 2013 werden Mappen standardmäßig in der selben Instanz geöffnet.
Nur ein Registryeingriff ändert dies. Wieviele User, meinst du, verwenden mehrere Instanzen mit einem Uralt-Excel und haben entsprechende Kenntnisse, die du hier anfragst?
Ich würde mal behaupten das du da ziemlich alleine dastehst. Nichts desto trotz wurde versucht dir zu helfen und den Ansatz auf die bekannten Probleme bei Codeoptimierung zu lenken. Diese Speichergeschichte ist nur das Basteln an einem Symptom und nicht an der Ursache.
AW: das könnte auch an was Anderen liegen.
27.12.2023 10:11:15
Frank Dreier
Hallo Ralf, ja, ich benutzte noch 2007. Mit dem Registry-Eintrag hatte ich auch gesehen,- wer das allerdings nicht weiß wird 2 Instanzen wohl kaum parallel benutzen und damit die Anwender davon immer weniger werden.

Mein Fehler war, dass ich die Frage falsch formuliert habe - genau die Code-Optimierungsgeschichte wollte ich vermeiden (ausnahmsweise hier mal nicht das Problem) da sie vom eigentlichen Thema ablenkt.
Das Makro ist sehr einfach gehalten, die Formeln für die Berechnung auf ein Minimum reduziert (evtl. könnte man hier durch geschicktes Umstellen noch etwas herausholen).
Eine Berechnung dauert auch nur ca. 2 Sekunden (Makro-Code ca. 0,1 Sekunde, Excel-Berechnung dann 1,9 Sekunden lt. Test) , komme aber bei allen Berechnungen dann auf 45 Minuten.
Daher meine Frage ob hier jemand mit Erfahrung hat.

Vielen Dank für Eure Antworten, auch an Onur
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige