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

VBA Autofill -> Keine Rückmeldung

VBA Autofill -> Keine Rückmeldung
24.03.2017 10:43:53
Rainer
Hallo zusammen,
der VBA-Linkshänder wieder mal.
Ich habe eine große Datei. Fast 300 Spalten mit verschiedenen Berechnungen, bis zu 5000 Zeilen tief. Nimmt eine Menge Speicherplatz.
Habe ich "rationalisiert", indem nur die erste Zeile überbleibt und der Rest über VBA mit Autofill erzeugt wird. Dann Spaltenergebnis kopieren, Spalte wieder löschen.
Geht auch super. Platzersparnis über 80%, Formel trotzdem für Leute ohne VBA-Kenntnisse editierbar, alles schick.
Nur leider "friert Excel ein" und zeigt während der Prozedur "Keine Rückmeldung".
Die Userform, welche ich dank Werner's Hilfe benutze um ein großes "Bitte warten" Bild zu zeigen (und zu verhindern, dass man im Blatt rumtippen kann) wird unsichtbar (Blatt bleibt trotzdem geschützt). https://www.herber.de/cgi-bin/callthread.pl?index=1531199
Das ist der Code mit Autofill:

Worksheets("matrix").Range("A12:JQ12").AutoFill Destination:=Worksheets("matrix").Range("A12:JQ" _
& i)

Wenn ich es als Schleife schreibe, dann friert Excel nicht ein. Aber es dauert 100mal länger.

For R = 1 To 277 ' Col A to JQ
Worksheets("matrix").Range(Range(Cells(12, R), Cells(12, R)).Address).AutoFill Destination:= _
Worksheets("matrix").Range(Range(Cells(12, R), Cells(i, R)).Address)
Next R
Gibt es eine elegante Lösung, das "Einfrieren" zu verhindern?
Anmerkung: Worksheets("matrix").EnableCalculation = False
Danke und Gruß,
Rainer

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Autofill -> Keine Rückmeldung
24.03.2017 11:21:27
Luschi
Hallo Rainer,
das Zauberwörtchen heißt DoEvents

For R = 1 To 277 ' Col A to JQ
With Worksheets("matrix")
.Range(Range(Cells(12, R), Cells(12, R)).Address).AutoFill Destination:= _
.Range(Range(Cells(12, R), Cells(i, R)).Address)
End With
'Info siehe Vba-Hilfe
DoEvents
Next R
Wenn Das funktioniert, kannst Du auch experementieren, in dem Du es nur jeden 2., 3. oder 4. Umlauf startest nach dem Muster

If R Mod 2 = 0 Then ' jetzt nur jeden 2. Schleifenumlauf
DoEvents
End If
Gruß von Luschi
aus klein-Paris
Anzeige
AW: VBA Autofill -> Keine Rückmeldung
24.03.2017 11:49:09
Rainer
Hallo Luschi,
DoEvents kenne ich bereits.
Die Schleife friert ja auch nicht ein! Da "fängt" er sich quasi wieder nach jeder Spalte.
Wenn ich die (viel schnellere) Variante
Worksheets("matrix").Range("A12:JQ12").AutoFill
Destination:=Worksheets("matrix").Range("A12:JQ" & i)

benutze, dann habe ich das Problem. Da ist auch leider kein Platz für ein DoEvents...
Ich bin jetzt am probieren, die Spalten in 10er Gruppen zu versammeln, aber es gibt bestimmt noch bessere Wege?
Danke und Gruß,
Rainer
AW: VBA Autofill -> Keine Rückmeldung
24.03.2017 12:02:42
EtoPHG
Hallo Rainer,
Worksheets("matrix").EnableCalculation = False

setzt ja nur die Berechnung auf diesem Blatt aus. Wenn aber Formeln anderer Blätter auf den Bereich zugreifen, werden diese berechnet. Leider sagst du nichts über den generellen Aufbau deiner Mappe aus, als Vorschlag würde ich das mal probieren:
    Application.Calculation = xlCalculationManual
Worksheets("matrix").Range("A12:JQ12").AutoFill _
Destination:=Worksheets("matrix").Range("A12:JQ" & i)
Application.Calculation = xlCalculationAutomatic
Gruess Hansueli
Anzeige
AW: VBA Autofill -> Keine Rückmeldung
24.03.2017 12:29:11
Rainer
Hallo Hansueli,
Das Sheet "matrix" holt sich ein paar Daten aus anderen Blättern über Verknüpfungen. Daten aus dem Sheet Matrix werden aber nur über VBA zurückkopiert. Somit sind während des Autofill keine Berechnungen aktiv wegen "Worksheets("matrix").EnableCalculation = False".
Habe deine Variante auch probiert, hat aber keinen Effekt. Es sind einfach zu viele Zellen für den Autofill. Das schafft mein "oller" Core i5 nicht, bei der NASA gibts vielleicht einen PC wo das geht. :-D
Aber ich habe jetzt die Schleife so gebaut:

For R = 1 To 280 Step 20 ' Col A to JQ
Worksheets("matrix").Range(Range(Cells(12, R), Cells(12, R + 19)).Address).AutoFill  _
Destination:= _
Worksheets("matrix").Range(Range(Cells(12, R), Cells(i, R + 19)).Address)
Next R
Das geht einigermaßen flott von der Hand und macht keinen "Freeze" mit "Keine Rückmeldung".
Musste aber noch 3 leere Spalten ergänzen, den zum Glück ist 277 eine Primzahl.
Also Problem gelöst.
Danke und bis zum nächsten mal,
Rainer (der vorsichtig überlegt seinen VBA Status von "bescheiden" auf "gut" zu ändern)
Anzeige
UpdateRemoteReferences = False / True (owT)
24.03.2017 12:39:59
EtoPHG

UpdateRemoteReferences = False / True (owT)
24.03.2017 12:40:00
EtoPHG

AW: UpdateRemoteReferences = False / True (owT)
24.03.2017 13:04:17
Rainer
Hallo Hansueli,

ActiveWorkbook.UpdateRemoteReferences = False / True

hat leider auch nicht den gewünschten Effekt, "Keine Rückmeldung" passiert immer noch.
Ich bleibe bei der Variante mit "Step 20" und "Autofill" für 20 Spalten auf einmal, nicht 280.
Vielen Dank für deine Hilfe,
Rainer
AW: UpdateRemoteReferences = False / True (owT)
24.03.2017 13:38:49
Werner
Hallo Rainer,
was ist denn, wenn du deine Formelzeile in den Zielbereich kopierst? Oder habe ich da was falsch verstanden?
 Worksheets("matrix").Range("A12:JQ12").Copy Worksheets("matrix").Range("A12:JQ" & i)
Gruß Werner
Anzeige
AW: UpdateRemoteReferences = False / True (owT)
25.03.2017 04:04:17
Rainer
Hallo Werner,
nein, das hast du richtig verstanden.
Ich habe deine Lösung probiert und stelle fest, dass .Copy "schneller" ist als .Autofill
Aber bei großen Bereichen nicht schnell genug, ich bekomme immer noch "Keine Rückmeldung".
.Autofill füllt ca. 400000 Zellen bis "keine Rückmeldung" losgeht.
.Copy zeigt "keine Rückmeldung" meist erst bei mehr als 800000 Zellen. Manchmal läuft es auch ohne "keine Rückmeldung" durch, manchmal kommt es eher.
Ich würde vermuten, dass es auf schnelleren Computern besser sein könnte?
Nichtsdestotrotz, danke für deine Idee, habe jetzt in "meiner" Step20-Schleife den .Copy Befehl benutzt.

' Variante Copy und Loop Step 20
For R = 1 To 280 Step 20 ' Col A to JT
Worksheets("matrix").Range(Range(Cells(12, R), Cells(12, R + 19)).Address).Copy _
Worksheets("matrix").Range(Range(Cells(12, R), Cells(i, R + 19)).Address)
Next R

Danke und Gruß,
Rainer
Anzeige
AW: UpdateRemoteReferences = False / True (owT)
25.03.2017 10:55:40
Werner
Hallo Rainer,
dann würde ich es eher mal versuchen das in zwei Blöcken zu machen anstatt in einer Schleife. Bei zwei Blöcken hast du jeweils nur die Hälfte der Datenmenge.
 Worksheets("matrix").Range("A12:DU12").Copy Worksheets("matrix").Range("A12:DU" & i)
Worksheets("matrix").Range("DV12:JQ12").Copy Worksheets("matrix").Range("DV12:JQ" & i)
Gruß Werner
AW: UpdateRemoteReferences = False / True (owT)
25.03.2017 12:02:29
Rainer
Hallo Werner,
das war einer meiner früheren Versuche, so bin ich dann zu dem Entschluss gekommen es als Schleife zu machen.
Es ist mir eigentlich nur wichtig, dass "Keine Rückmeldung" nicht passiert, weil dann immer clevere Nutzer (DAU) clevere Sachen (Ironie) machen, nur weil sie glauben das die Berechnung Excel / Windows / die Gesellschaftsordnung / die Gravitationskonstanten des Universums zum Absturz gebracht hat.
Außerdem ist die Zeilenanzahl frei, in Abhängigkeit der Eingabedaten. Üblicherweise nicht mehr als 5000 Zeilen, aber erst vor wenigen Minuten habe ich einen Datensatz mit Werten bis zu 12000 bekommen.
Alles doof, außerdem soll es auch auf schwächeren Computern laufen und nicht dem DAU suggerieren, dass es sich aufhängt hat.
Mit der Step 20 geht es flott genug, das reicht mir erstmal. Nach der Berechnung muss das Makro noch ein paar Diagramme erzeugen, ich versuche erstmal da an Geschwindigkeit zu gewinnen, das ist auch noch übel langsam.
Da kommen bestimmt noch neue Fragen auf!
Danke und Gruß,
Rainer
Anzeige
Na dann
25.03.2017 12:31:58
Werner
Hallo Rainer,
..soll es recht sein, wenn du damit zufrieden bist. Dachte halt nur, dass es um einiges schneller sein dürfte, da ja nur zwei Blöcke kopiert werden im Gegensatz zu deiner jetzigen Version per Schleife mit zig Kopiervorgängen.
Danke für die Rückmeldung
Gruß Werner
AW: Na dann
25.03.2017 13:42:58
Rainer
Hallo Werner,
ich habe ein wenig damit probiert und bin der Meinung, dass es keinen großen Unterschied macht zwischen 2 mal kopieren und 20 mal kopieren. Das ist sehr marginal, aber bei 2 mal evtl. schon lang genug um "Keine Rückmeldung" auszulösen.
Wenn man es mit der Schleife übertreibt (Step 10 oder weniger) dann wird die Schleife spürbar langsamer.
Bei Step20 habe ich ja "nur" 14 Kopiervorgänge, aber nach jedem darf Excel kurz "Luft holen".
Danke dir und schönes (Rest-)Wochenende!
Rainer
Anzeige

301 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige