
Excel Seiten
:
Klaus-Dieter-Homepage |
Hajo's Homepage |
Online-Excel |
Paulchens Excel Werk.
|
Beverly's Excel-Inn
|
 |
For ... Next; Anzeige: Indexzähler |
Klaus-Dieter
Administrator
    

Dabei seit: 30.06.2005
Beiträge: 2.431
 |
|
| RE: For ... Next; Anzeige: Indexzähler |
 |
Hallo Werner,
mir scheint die gesamte Vergleichsoperation etwas fragwürdig. Die zu vergleichenden Werte kommen im Tabellenblatt Basis jeweils elf Mal vor, im Tabellenblatt Vergleichsdaten sogar rund zweiundzwanzig Mal. Das ergibt nach meinem Verständnis kein sauberes Ergebnis.
__________________ Viele Grüße Klaus-Dieter
Irren ist menschlich, für das richtige
Chaos braucht man einen Computer!
|
|
13.05.2012 11:09 |
|
|
Klaus-Dieter
Administrator
    

Dabei seit: 30.06.2005
Beiträge: 2.431
 |
|
| RE: For ... Next; Anzeige: Indexzähler |
 |
Hallo Werner,
mit deinen Testdaten läuft das Makro in 13 Sekunden durch. Da geht aber noch mehr, weil ich bisher nur die Select-Anweisungen rausgeschmissen habe. Die richtigen Zeitsparer fehlen noch. Bitte das Ergebnis auf Richtigkeit prüfen.
__________________ Viele Grüße Klaus-Dieter
Irren ist menschlich, für das richtige
Chaos braucht man einen Computer!
|
|
13.05.2012 10:12 |
|
|
ATT
Forum Einsteiger
Dabei seit: 03.08.2011
Beiträge: 18
Themenstarter
 |
|
| RE: For ... Next; Anzeige: Indexzähler |
 |
Hallo Klaus-Dieter,
ich wäre Dir dankbar, wenn Du mich nochmals unterstützen könntest und eine Möglichkeit siehst, das Makro zu beschleunigen.
Vielen Dank.
Werner
|
|
12.05.2012 15:22 |
|
|
ATT
Forum Einsteiger
Dabei seit: 03.08.2011
Beiträge: 18
Themenstarter
 |
|
| RE: For ... Next; Anzeige: Indexzähler |
 |
Hier jetzt die Datei "Vergleichsdaten".
|
|
14.04.2012 17:27 |
|
|
ATT
Forum Einsteiger
Dabei seit: 03.08.2011
Beiträge: 18
Themenstarter
 |
|
| For ... Next; Anzeige: Indexzähler |
 |
Hallo Klaus-Dieter,
die ursprüngliche Musterdatei mußte ich aufgrund ihrer Gesamtkapazität teilen, damit noch ein gewisser Rest an Informationen übrig blieb. Darüber hinaus habe ich die Anzahl der Zeilen jeweils stark reduziert und die Formate überwiegend weggelassen. Ich hoffe, daß hat der Lesbarkeit trotzdem nicht geschadet.
Gruß
Werner
P.S.: hier die Datei "Basis"
|
|
14.04.2012 17:26 |
|
|
 |
|
 |
 |
|
 |
ATT
Forum Einsteiger
Dabei seit: 03.08.2011
Beiträge: 18
Themenstarter
 |
|
Hallo Klaus-Dieter,
anbei die schon angesprochene Musterdatei, die ich bis eben gerade erstellt habe. Die Ursprungsdaten für die Q4 und Q1 werden manuell in diese Datei übernommen. Es werden dann verschiedene Berechnungen durchgeführt, um eindeutige Vergleichskriterien zu erhalten, anhand derer die Zuordnung der Daten von Q1 ("Vergleichsdaten") auf die Tabelle ("Basis") [Ausgangssituation sind hier die Daten aus Q4, die in dieser Struktur unverändert beibehalten werden müssen] vorgenommen werden kann. Die Datei wird noch größer, da die Daten von Q2 und Q3 mit Q4 verglichen werden; Aufbau, Inhalt und Ablauf sind aber identisch, weshalb ich die beiden Vergleich weggelassen habe.
Vielen Dank im voraus bei den Bemühungen um Beschleunigung.
Grüße
Werner
P.S.: a) In meinem Beitrag vom 12. April muß es heißen "... If Sheets("Basis").Cells(j+1,57).Value= ..." und nicht "If Sheets("Basis").Cells(j+1,53).Value=...". b) Gerade habe ich festgestellt, daß die max. Größe der hochladbaren Datei ca. 500 KB beträgt. Meine Datei hat ca. 90.000 KB, die ich jetzt nochmals reduzieren werde. Ich hoffe, der Inforamtionsgehalt ist dann noch ausreichend.
|
|
14.04.2012 15:57 |
|
|
 |
|
 |
 |
|
 |
Klaus-Dieter
Administrator
    

Dabei seit: 30.06.2005
Beiträge: 2.431
 |
|
| RE: For ... Next; Anzeige: Indexzähler |
 |
Hallo Werner,
schick mir mal so eine Musterdatei. Ich bin sicher da etwas machen zu können. Vor einiger Zeit habe ich mal ein Makro von !0 Stunden Laufzeit auf wenige Minuten reduziert.
__________________ Viele Grüße Klaus-Dieter
Irren ist menschlich, für das richtige
Chaos braucht man einen Computer!
|
|
13.04.2012 12:08 |
|
|
 |
|
 |
 |
|
 |
ATT
Forum Einsteiger
Dabei seit: 03.08.2011
Beiträge: 18
Themenstarter
 |
|
| RE: For ... Next; Anzeige: Indexzähler |
 |
Hallo Klaus-Dieter,
vielen Dank für den Hinweis, den ich heute morgen direkt umgesetzt habe. In mehreren Testläufen (bis 3000 Einheiten) hat dies, mit einer generellen Ausnahme, funktioniert: die Werte werden zwar übernommen, nicht aber im Format, wie sie in der Tabelle Vergleichsdaten vorhanden sind.
Gibt es eine Möglichkeit, das Format mitzuübertragen? Wenn nicht, würde ich ein Makro schreiben, welches die übertragenen Zeilen in das richtige Format bringt.
Auch nach Umprogrammierung dauert der Testlauf (Begrenzung in diesem Fall i=j=30000) lange; jetzt schon mehr als 3 Stunden. Ich weiß jetzt nicht, wie weit das Programm fortgeschritten ist oder ob es tatsächlich hängt; Hinweis [Keine Rückmeldung] erscheint wieder. Deshalb nochmals meine Anfrage ob es nicht eine Möglichkeit gibt, festzustellen, an welchem Punkt sich das Programm befindet.
Für weitere Optimierungshinweise in bezug auf die Programmierung wäre ich dankbar; der Programmiercode, über den der Vergleich erfolgt, ist ja schon eingestellt. Da es sich um sensible Daten eines Bekannten handelt, kann ich diese nicht nach außen geben. Falls doch notwendig, könnte ich eine Datei erstellen, die die Grundstruktur (verfremdet) wiedergibt, aber lediglich Muster-Daten enthalten würde.
Gruß
Werner
|
|
13.04.2012 11:48 |
|
|
 |
|
 |
 |
|
 |
Klaus-Dieter
Administrator
    

Dabei seit: 30.06.2005
Beiträge: 2.431
 |
|
| RE: For ... Next; Anzeige: Indexzähler |
 |
Hallo Werner,
einen elementaren Fehler habe ich schon mal gefunden: die Selectanweisungen. Das ist eine riesen Bremse.
Das:
Sheets("Vergleichsdaten").Select
Range(Cell(i, 60), Cells(i, 109)).Select
Selection.Copy
Sheets("Basis").Select
Cells((j + 1), 1).Select
ActiveSheet.PasteCode eingefügt mit VBA in HTML 2.0.0.1
kannst du etwa so ersetzen:
Range(Sheets("Basis").Cells((j + 1), 1), Sheets("Basis").Cells((j + 1), 50)) = Range(Sheets("Vergleichsdaten").Cells(i, 60), Sheets("Vergleichsdaten").Cells(i, 109)).ValueCode eingefügt mit VBA in HTML 2.0.0.1
Das spart tausende von direkten Zellzugriffen, entsprechend verkürzt sich die Laufzeit. Es gäbe aber noch mehr Möglichkeiten, um die Aufzuzeiegen, müsste ich deine Datei kennen. Die Gesamtlaufzeit würde sich maximal im Minutenbereich bewegen!
__________________ Viele Grüße Klaus-Dieter
Irren ist menschlich, für das richtige
Chaos braucht man einen Computer!
|
|
12.04.2012 13:32 |
|
|
 |
|
 |
 |
|
 |
ATT
Forum Einsteiger
Dabei seit: 03.08.2011
Beiträge: 18
Themenstarter
 |
|
| For ... Next; Anzeige: Indexzähler |
 |
Hallo Klaus-Dieter,
das Programm wurde von mir mehrfach getestet und lief immer problemlos. Dies lag vielleicht lag daran, daß die Schleifen nicht mehr als 3000 Einheiten umfaßten und die zu kopierenden Daten auf die Datei Vergleichsdaten (nur in der Testphase) kopiert wurden.
Mir ist schon klar, daß bei der großen Anzahl der zu vergleichenden Daten (tatäschlich zu vergleichende Zeilen 30000 zu der Datenbasis von 120000 Zeilen) die Bearbeitungszeit schon recht groß werden kann. Um feststellen zu können, an welcher Stelle der Rechenoperation sich das Programm gerade befindet, hatte ich ein eine Darstellungsmöglichkeit gedacht, die diese Information anbietet - auch wenn das die Bearbeitungszeit weiter erhöhen sollte.
Noch nicht erwähnt hatte ich, daß während der Durchführung des Programms am oberen Rand des Bildschirm der Name der Excel-Datei mit dem Hinweis [Keine Rückmeldung] erscheint; bisher bin ich davon ausgegangen, daß dieser Hinweis den umfangreichen Rechenoperationen geschuldet war.
Das Programm lautet wie folgt:
Sub MakroVergleich
Dim i As Long
Dim j As Long
'Vergleich von Daten innerhalb zweier Tabellen; Tabellen mit Vergleichsdaten hat
'30000 Zeilen; die Basis-Tabelle (mit der verglichen wird: 120000 Zeilen)
With Sheets("Vergleichsdaten")
For i=11 To 30000
'Durchführung der Rechenoperationen nur, wenn der Wert in Zelle (i,121) größer Null
If Sheets("Vergleichsdaten").Cells(i,121).Value >0 Then
For j=11 To 120000
'Bei Übereinstimmung der Werte in beiden Tabellen sollen die Werte eines bestimmten Bereichs aus Tabelle Vergleichsdaten in die Tabelle Basis übertragen werden
If Sheets("Basis").Cells(j+1,53).Value=_
Sheets("Vergleichsdaten").Cells(i,121).Value Then
Sheets("Vergleichsdaten").Select
Range(Cell(i,60), Cells(i,109)).Select
Selection.Copy
Sheets("Basis").Select
Cells((j+1),1).Select
ActiveSheet.Paste
End If
Next j
End If
Next i
End With
Range("A6").Select
End Sub
Ich habe das Programm momentan nicht im Zugriff, so daß die die Darstellung aus dem Gedächtnis reproduziert habe; ich hoffe, die Formvorschriften habe ich eingehalten. Als Programmierer mit Anfängerkenntnissen wäre es schön sehen zu können, ob und wie sich der Ablauf des Programms beschleunigen ließe.
Dank im voraus und Gruß
Werner
|
|
12.04.2012 13:14 |
|
|
 |
|
 |
 |
|
 |
Klaus-Dieter
Administrator
    

Dabei seit: 30.06.2005
Beiträge: 2.431
 |
|
| RE: For ... Next; Anzeige: Indexzähler |
 |
Hallo Werner,
bei drei Stunden Laufzeit gehe ich von einem Programmierfehler aus. Darstellungen an welcher Stelle sich das Programm befindet, sind zwar möglich, bremsen den Programmlauf aber zusätzlich aus.
Am besten wäre es, wenn du die Datei hier mal einstellst, dann kann man sich das ansehen. Ich bin sicher, dass sich das deutlich beschleunigen lässt.
__________________ Viele Grüße Klaus-Dieter
Irren ist menschlich, für das richtige
Chaos braucht man einen Computer!
|
|
11.04.2012 09:03 |
|
|
 |
|
 |
 |
|
 |
ATT
Forum Einsteiger
Dabei seit: 03.08.2011
Beiträge: 18
 |
|
| For ... Next; Anzeige: Indexzähler |
 |
Hallo,
innerhalb eines Programms werden zwei Schleifen verwendet, deren Bearbeitungsdauer, aufgrund der Datenmenge, sehr lange ist (bis zu 3 Stunden). Nun möchte ich zwischendurch wissen, an welcher Stelle der Schleife(n) sich das Programm gerade befindet. Gibt es eine solche Darstellungsmöglichkeit (z.B. MSgBox)?
Gruß
Werner
|
|
11.04.2012 07:30 |
|
|
|
|
|
 |
|