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

zu langes Makro

zu langes Makro
28.10.2021 10:13:58
stef26
Hallo Zusammen,
ich könnte mal Hilfe von VBA Profis gut gebrauchen.
Ich habe ein extrem langes Makro, welches mir Daten aus einer anderen Tabelle in meine Vorlage kopiert.
D.h. Das Makro an sich ist sehr einfach nur sehr lange.
Irgandwann hab ich mal die Meldung bekommen, dass das Makro zu lange ist,
Ich habe daraufhin Teile davon in Untermakros gemacht, welche ich mit Call aufrufe.
Nun hab ich jedoch das Problem, dass auch die Untermakros nicht mehr vollständig bearbeitet werden.
Das Makro springt einfach aus dem Untermakro raus und beginnt das nächste Untermakro, ohne dass das vorherige bis zum Schluss durchgelaufen ist.
Kennt dies Problem jemand von euch?
Ein Teilbereich des Makros, an dem er aktuell einfach aus dem Programm springt.
Ist mir erst nicht aufgefallen, da er keine Fehlermeldung bringt.
Es fehlen jedoch die Daten in der Vorlage...
With wbAlt.Worksheets("Selektivloeten")
.Range("C4:C6").Copy Destination:=wbNeu.Worksheets(.Name).Range("C4:C6") 'Nutzen
.Range("J4:J6").Copy Destination:=wbNeu.Worksheets(.Name).Range("J4:J6") 'Nutzen Hinweis
.Range("F12").Copy Destination:=wbNeu.Worksheets(.Name).Range("F12") 'Pins
.Range("G13:G14").Copy Destination:=wbNeu.Worksheets(.Name).Range("G13:G14")
.Range("H15").Copy Destination:=wbNeu.Worksheets(.Name).Range("H15") 'Programmlaufzeit
.Range("J12:J15").Copy Destination:=wbNeu.Worksheets(.Name).Range("J12:J15") 'Bemerkungen
.Range("Y3:Y40").Copy Destination:=wbNeu.Worksheets(.Name).Range("Y3:Y40")
'Parallele Tätigkeiten zur Anlagenzeit
.Range("R19").Copy Destination:=wbNeu.Worksheets(.Name).Range("R19")
.Range("V19").Copy Destination:=wbNeu.Worksheets(.Name).Range("V19")
.Range("W19").Copy Destination:=wbNeu.Worksheets(.Name).Range("W19")
.Range("R24:R25").Copy Destination:=wbNeu.Worksheets(.Name).Range("R24:R25")
.Range("V24:V25").Copy Destination:=wbNeu.Worksheets(.Name).Range("V24:V25")
.Range("W24:W25").Copy Destination:=wbNeu.Worksheets(.Name).Range("W24:W25")
.Range("R28:R31").Copy Destination:=wbNeu.Worksheets(.Name).Range("R28:R31")
.Range("V28:V31").Copy Destination:=wbNeu.Worksheets(.Name).Range("V28:V31")
.Range("W28:W31").Copy Destination:=wbNeu.Worksheets(.Name).Range("W28:W31")
.Range("R34:R48").Copy Destination:=wbNeu.Worksheets(.Name).Range("R34:R48")
.Range("V34:V48").Copy Destination:=wbNeu.Worksheets(.Name).Range("V34:V48")
.Range("W34:W48").Copy Destination:=wbNeu.Worksheets(.Name).Range("W34:W48")
.Range("R51:R53").Copy Destination:=wbNeu.Worksheets(.Name).Range("R51:R53")
.Range("V51:V53").Copy Destination:=wbNeu.Worksheets(.Name).Range("V51:V53")
.Range("W51:W53").Copy Destination:=wbNeu.Worksheets(.Name).Range("W51:W53")
.Range("R55:R58").Copy Destination:=wbNeu.Worksheets(.Name).Range("R55:R58")
.Range("V55:V58").Copy Destination:=wbNeu.Worksheets(.Name).Range("V55:V58")
.Range("W55:W58").Copy Destination:=wbNeu.Worksheets(.Name).Range("W55:W58")
.Range("R60:R68").Copy Destination:=wbNeu.Worksheets(.Name).Range("R60:R68")
.Range("V60:V68").Copy Destination:=wbNeu.Worksheets(.Name).Range("V60:V68")
.Range("W60:W68").Copy Destination:=wbNeu.Worksheets(.Name).Range("W60:W68")
.Range("N67").Copy Destination:=wbNeu.Worksheets(.Name).Range("N67")
.Range("R70:R93").Copy Destination:=wbNeu.Worksheets(.Name).Range("R70:R93")
.Range("V70:V93").Copy Destination:=wbNeu.Worksheets(.Name).Range("V70:V93")
.Range("W70:W93").Copy Destination:=wbNeu.Worksheets(.Name).Range("W70:W93")
.Range("R96:R97").Copy Destination:=wbNeu.Worksheets(.Name).Range("R96:R97")
.Range("V96:V97").Copy Destination:=wbNeu.Worksheets(.Name).Range("V96:V97")
.Range("W96:W97").Copy Destination:=wbNeu.Worksheets(.Name).Range("W96:W97")
.Range("V106:V110").Copy Destination:=wbNeu.Worksheets(.Name).Range("V106:V109")
.Range("R101").Copy Destination:=wbNeu.Worksheets(.Name).Range("R101") 'hier springt er dann in das nächste Makro?
.Range("V101").Copy Destination:=wbNeu.Worksheets(.Name).Range("V101")
.Range("W101").Copy Destination:=wbNeu.Worksheets(.Name).Range("W101")
.Range("R104").Copy Destination:=wbNeu.Worksheets(.Name).Range("R104")
.Range("V104").Copy Destination:=wbNeu.Worksheets(.Name).Range("V104")
.Range("W104").Copy Destination:=wbNeu.Worksheets(.Name).Range("W104")
end with
Gruß
Stefan

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: zu langes Makro
28.10.2021 10:44:32
stef26
Hallo nochmal,
ich habe nun Teile in ein Unterprogramm kopiert. Nun springt er an einer anderen Stelle in das nächste Unterprogramm.
D.h. das liegt dann nicht am Code, sondern das muss an irgend etwas anderem liegen, warum VBA hier die Makros nicht zu ende bringt.
Man kann den Fehler sehr gut mit dem Stepmodus nachvollziehen. Ergibt für mich jedoch keinen Sinn, warum das so ist.
Ich kopiere einige Zeilen und VBA springt dann mitten in der Bearbeitung aus dem Untermakro raus...?
Ich werd verrückt.
:-( Stefan
AW: zu langes Makro
28.10.2021 10:48:17
Daniel
um den Fehler nachvollziehen zu können, müsstest du mal die Datei hochladen.
Gruß Daniel
Anzeige
AW: zu langes Makro
28.10.2021 10:46:13
Daniel
Hi
sammle erstmal alle Zellbereiche in einer Rangevariablen.
hierbei kannst du auch mehrere Bereiche in einem Schritt zu weisen:
der Textstring mit den Zelladressen in der Range-Funktion kann maximal 255 Zeichen lang sein.
brauchst du mehr, nutze Union um das in mehreren Schritten zu tun.
verwende auch Intersect (schnittmenge) um sich in Zeile und Spalte wiederholende Zellbereiche kompakter darstellen zu können.
das Kopieren kann dann in einer Schleife über die AREAS der Range erfolgen.
die AREAS einer komplexen Range sind alle rechteckigen Zellbereiche, aus denen diese Range zusammengesetzt ist.
diese können in einem Block kopiert werden.

dim rngBereich as range
dim rngTeilbereich as range
With wbAlt.Worksheets("Selektivloeten")
set rngBereich = .Range("C4:C6,J4:J6,F12,G13:G14,H15,J12:J15;Y3:Y40")
set rngBereich = Union(rngBereich, Intersect(.Range("R:R,V:W"), .Range("19:19,25:25,28:31,34:48,51:53,55:58,60:68,70:93,96:97,101:101,104:104")))
set rngBereich = Union(rngBereich, .Range("N67,V106:V110"))
'--- usw bis alle Zellbereiche in der Rangevariablen vereinigt sind
with wbNeu.Worksheets(.Name)
for each rngTeilbereich in rngBereich.Areas
rngTeilbereich.Copy destination:= .Range(Teilbereich.Address)
next
end with
end With
with
Gruß Daniel
Anzeige
AW: zu langes Makro
28.10.2021 10:58:18
stef26
Hallo Daniel,
danke für die Info. Ich versuch mal das Makro entsprechend umzustellen.
Wusste nicht dass man dies so machen kann.
Hochladen kann ich nicht, da die Datei zu groß ist.
Hört sich gut an, werde mal versuchen dass so zu machen, dann wird das Ganze auf jeden Fall kleiner.
Hoffe dass dann der Fehler weg ist...
Danke
:-)
Stefan
AW: zu langes Makro
28.10.2021 12:07:46
stef26
Hallo Daniel,
das Makro macht nun das Selbe wie bei der von mir etwas umständlichen Version.
In dem Untermakro springt er nun während der Schleife raus und startet mit einem neuen Untermakro.
Ich habe mittlerweile festgestellt, dass er dieses "nicht beenden" eines Makros auch schon in anderen Untermakros macht.
Gibt es die Möglichkeit auch größere Dateien hier runter zu laden?
Dann könnte ich es dir mal zeigen.
Ich verstehe nicht wieso VBA da bei simplen kopieren einfach mitten im Makro das beendet?
Gruß
Stefan
Anzeige
AW: zu langes Makro
28.10.2021 12:28:07
Daniel
Du müsstest die Datei schon auf angegebene Größe bringen
Inhalte werden ja nicht benötigt.
Gibt es für die verwendeten Blätter oder in DieseArbeitsmappe Eventmaktos (Change, Calculate), welche ausgelöst werden könnten?
Gruß Daniel
AW: zu langes Makro
28.10.2021 12:47:00
stef26
Hallo Daniel,
ich versuch mal die Datei so klein zu bekommen, damit man die Senden kann.
Change Ereignisse gibt es keine.
Melde mich nochmal wenn ich die Datei klein bekommen habe
Danke schonmal dass du dir das zu minderst mal ansiehst...
Gruß
Stefan
AW: zu langes Makro
28.10.2021 16:33:00
stef26
Hallo Daniel,
ich habe mal eine kleine Beispieldatei erstellt.
Um den Fehler erkennen zu können müsstest du folgendes machen:
Vorlage
https://www.herber.de/bbs/user/148838.xlsm
In der Vorlage müsstest du unter Modul 2 bei

Sub Version 238 einen Haltepunkt setzen.
Starten müsstest du das Makro im Modul 1.
Nach dem Haltemodus im F8 Step Modus weiter machen.
Bei mir springt das Makro in der Mitte eines der Makros immer raus, ohne das Makro beendet zu haben.
Kopiervorlage
https://www.herber.de/bbs/user/148839.xlsm
Im Makro wird nach einer Vorlage gefragt. Das wäre diese hier. Von dieser versucht er die Werte in die neue Vorlage zu kopieren.
Er kopiert zwar nicht alle Daten aus der Kopiervorlage, aber um das geht es mir ja auch nicht.
Ich verzweifle daran, dass Excel die Makros nicht bis End 

Sub durchführt und ich habe aktuell keine Erklärung dafür...
Gruß
Stefan

Anzeige
AW: zu langes Makro
29.10.2021 10:28:13
Daniel
hi
ich bekomme schon hier einen Fehler
Set wks_SMDRuesten_Neu = wbNeu.Worksheets("SMD-Ruesten Material")
weil das Blatt nicht vorhanden ist.
ansonsten kann ich nichts feststellen, wenn ich unbedarft deiner Anweisung folge.
Gruß Daniel
AW: zu langes Makro
29.10.2021 10:47:15
stef26
ok Danke Daniel.
Komisch bei mir springt das Makro während der Bearbeitung bereits ins nächste...
SCH....
AW: zu langes Makro
29.10.2021 11:05:00
Rudi
Hallo,
das liegt daran, dass in wbAlt Blätter fehlen (z.B. SMD-Ruesten Material) und aufgrund von On Error Resume Next die nächste Prozedur aufgerufen wird.
Kommentiere alle On Error... aus dann findest du auch die Fehler.
Gruß
Rudi
Anzeige
Anmerkung
29.10.2021 11:19:12
Rudi
On Error Resume Next bewirkt die Ausführung des nächsten Schritts der Prozedur, in der die On Error-Anweisung steht.
Nicht den nächsten Schritt der Prozedur, in der der Fehler auftritt.
Gruß
Rudi
AW: zu langes Makro
29.10.2021 10:51:20
peterk
Hallo
Du verwendest "On Error Resume Next" und wunderst Dich das er aus der Prozedur springt. Wenn beim Copy ein Fehler auftritt beendet VBA die Sub und geht zur nächsten. Du solltest diesen Befehl nur sehr gezielt einsetzen (wenn es gar nicht anders geht) und nur für einen bestimmten Zweck. Ansonsten wieder mit "On Error Goto 0" ausschalten.
Peter
AW: zu langes Makro
29.10.2021 11:39:14
stef26
Hallo Zusammen,
danke für die Rückmeldungen.
Ich habe so viele verschiedene alte Versionen in denen die Daten stehen, die kopiert werden sollen, hier wollte ich, dass so viel wie möglich in die neue Version gespielt wird, da ich dachte der "on error resume next" ignoriert nur den Fehler der Zeile und macht mit der nächsten Zeile weiter...
Ich wusste nicht, dass die Sub hier beendet wird.
Gibt es einen Befehl, der den Kopierfehler ignoriert und bei der nächsten Kopierzeile weiter macht?
Gruß
Stefan
Anzeige
AW: zu langes Makro
29.10.2021 11:47:01
Rudi
dann schreib On Error Resume Next in jede deiner Prozeduren.
Ganz schlechter Stil.
AW: zu langes Makro
29.10.2021 11:56:28
peterk
Hallo
Wie schon geschrieben: On Error Goto 0

On Error Goto 0
Call Version238(wbAlt, wbNeu)
Call Version239(wbAlt, wbNeu)
Call Version248(wbAlt, wbNeu)
On Error Resume Next
und in den Subs wieder Ein und Aus schalten
Peter
AW: zu langes Makro
28.10.2021 12:49:35
GerdL
Moin

Dim Q As Worksheet, Z As Worksheet
Dim Bereiche As Variant, X As Integer, Zeile As Variant
Set Q = wbAlt.Worksheets("Selektivloeten")
Set Z = wbNeu.Worksheets("Selektivloeten")
Bereiche = Array("C4:C6", "J4:J6", "F12", "G13:G14", "H15", "J12:J15", "Y3:Y40")
For X = LBound(Bereiche) To UBound(Bereiche)
Q.Range(Bereiche(X)).Copy Destination:=Z.Range(Bereiche(X))
Next
For Each Zeile In Array("19", "24:25", "28:31", "34:48", "51:53", "55:58", "60:68", "67", "70:93", "96:97", _
"101", "104", "106:110")
Q.Range("R" & Zeile).Copy Destination:=Z.Range("R" & Zeile)
Q.Range("V" & Zeile & ":W" & Zeile).Copy Destination:=Z.Range("V" & Zeile & ":W" & Zeile)
Next
Gruß Gerd
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige