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

Code beschleunigen

Code beschleunigen
16.12.2022 10:58:13
Oliver
Hallo an Alle,
ich bin derzeit dabei eine Excel Datei mit VBA-Code zu schreiben.
Im Prinzip geht es darum, UTM-Koordinaten in GK-Koordinaten umzurechnen. Dafür habe ich ein Tabellenblatt wo der Rechtswert und Hochwert eingetragen werden muss.
Meine Koordinatenliste muss also nach und nach dort eingetragen werden, und die umgerechneten Daten wieder zurückkopiert werden. Ich hoffe es ist soweit verständlich.
Ich habe nun einen Code der funktioniert aber bei bis zu 3 Mio Zeilen dauert es ewig und drei Tage. Gibt es eine Möglichkeit den Code zu beschleunigen via Array oder sowas? Anbei mein Code.

Sub BereinigenDGM()
If Worksheets("UTM(ETRS)-GK(DHDN)").Range("L39").Value = "ETRS89" Then GoTo Ende
If Worksheets("UTM(ETRS)-GK(DHDN)").Range("L39").Value = "ETRS89 - UTM" Then GoTo Ende
Dim Zeile2 As Long
Application.ScreenUpdating = False
For Zeile2 = 1 To 3000000
If Cells(Zeile2, 1).Value = "" Then GoTo Ende
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
Cells(Zeile2, 1).Value = Worksheets("UTM(ETRS)-GK(DHDN)").Range("B15").Value
Cells(Zeile2, 2).Value = Worksheets("UTM(ETRS)-GK(DHDN)").Range("D15").Value
Application.EnableEvents = True
Application.Calculation = xlAutomatic
Worksheets("UTM(ETRS)-GK(DHDN)").Range("L15").Value = Cells(Zeile2, 1).Value
Worksheets("UTM(ETRS)-GK(DHDN)").Range("N15").Value = Cells(Zeile2, 2).Value
Next Zeile2
Application.ScreenUpdating = True
Call BereinigenDGM2
Exit Sub
Ende:
Application.ScreenUpdating = True
Call BereinigenDGM2
Exit Sub
End Sub

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
ich frage mich, ...
16.12.2022 11:02:02
Rudi
Hallo,
... woher du ein Excel mit 3 Mio. Zeilen nimmst. Meins hat nur 1048576.
Gruß
Rudi
AW: ich frage mich, ...
16.12.2022 11:06:23
Oliver
Ich habe eine Textdatei die eingelesen wird und die kann bis zu 3 mio zeilen lang sein. Ich habe es mich selbst auch gefragt aber excel liest sie anstandslos ein.
AW: Code beschleunigen
16.12.2022 11:17:08
Der
Hallo,
es ist nicht verwunderlich, dass die Laufzeit bei Zellzugriffen in einer Schleife sehr lange ist. Aber das hast Du ja schon selbst bemerkt und auf ein Array angespielt.
Was aber noch verwunderlicher ist, ist dass ich auch keine Berechnung finden kann ... Du ersetzt lediglich mit immer den gleichen (?) Werten aus einer anderen Tabelle.
Es stellt sich die Frage, was Du genau machen willst, was mit dem Ergebnis der Berechnung passieren soll.
Bei einer Textdatei mit 3 Mio Zeilen gehe ich mal davon aus, dass ca. 1.951.424 Zeilen verloren gehen. Ich bin mir nicht sicher, ob Excel das richtige Werkzeug für diese Aufgabe ist. Eventuell kann man die Daten mittels VBA-Code bearbeiten und z. B. wieder in eine Textdatei schreiben ohne die Daten ins Tabellenblatt einzulesen. Alternativ könnte man die Daten auf mehrere Tabellenblätter "aufteilen".
Power Query wäre noch eine Möglichkeit mit größeren Datenmengen zu arbeiten, das macht aber nur Sinn, wenn eine Aggregation der Daten erfolgen soll. Sollen die Werte aller Zeilen dann in einem Tabellenblatt angezeigt werden , reicht der Platz wieder nicht aus.
Aber ohne die genauen Umstände zu kennen kann man nicht wirklich raten, was sinn macht.
Gruß
Michael
Anzeige
AW: Code beschleunigen
16.12.2022 11:25:40
Oliver
Also ich habe gerade gemerkt dass es nur 300.000 Zeilen sind und nicht 3 Millionen. Fehler meinerseits, aber dennoch bleibt ja das Problem das Gleiche.
Ich hole mir meine TXT-Datei in die Tabelle "DGM" und kopiere immer zwei Daten in die Tabelle "UTM(ETRS)-GK(DHDN)" mit B15 und D15. In der Tabelle selbst, sind dann viele verschiedene Berechnungen integriert, die dann diese Zwei Daten umrechnen. Diese Daten führe ich dann zurück in meine Tabelle.
Anfangs wollte ich die Berechnung in VBA reinnehmen, aber da habe ich den überblick verloren, weil die Konvertierungsberechnungen sehr komplex sind.
Die Frage ist nun wie kopiere ich die Daten, sodass die Tabelle dann die Werte umrechnet und dann wieder zurück, nur halt schneller...
Anzeige
AW: Code beschleunigen
16.12.2022 11:52:28
Der
Also wenn ich das richtig verstanden habe trägst Du die Zahlen ein, lässt berechnen und holst Dir das Ergebnis zurück? Das kann man so nicht wirklich beschleunigen.
AW: Code beschleunigen
16.12.2022 12:48:25
Daniel
Durch die Komplexität musst du halt durch.
Es sollte nicht unmöglich sein, dir Formel so zu gestalten, dass du pro Koordinate mt einer Formel auskommst.
Dann kannst du diese Formeln direkt in das Datenblatt neben jedes Koordinatenpaar schreiben, was wesentlich schneller geht, als die Werte hin- und her zu schieben, weil man es für alle Zeilen gemeinsam in einem Schritt tun kann.
Gruß Daniel
AW: Code beschleunigen
16.12.2022 13:01:48
Oliver
Gut dann muss ich mal schauen wie ich das bewerkstellige.
Ich hatte schonmal angefangen und das war hier das Resultat. Und da fehlt noch die Hälfte, und das für eine Koordinate.

=((1/(180/PI())*((6377397,155^2/6356078,963)/WURZEL(1+((((6377397,155^2-6356078,963^2)/6356078,963^2) *COS((ARCTAN(((D23+ D24*(+F26*D16-F25*D17+1*D18))+((6377397,155^2-6356078,963^2)/6356078,963^2) *6356078,963*SIN((ARCTAN(((D23+ D24*(+F26*D16-F25*D17+1*D18))*6377397,155) /(WURZEL((D21+D24*(1 *D16+F27*D17-F26*D18))^2 + (D22+D24*(-F27*D16+1*D17+F25*D18))^2)*6356078,963)))) ^3)/((WURZEL((D21+D24*(1 *D16+F27*D17-F26*D18))^2 + (D22+D24*(-F27*D16+1*D17+F25*D18))^2)) -(((6377397,155^2-6356078,963^2)/6377397,155^2)) *6377397,155*COS((ARCTAN(((D23+ D24*(+F26*D16-F25*D17+1*D18))*6377397,155) /(WURZEL((D21+D24*(1 *D16+F27*D17-F26*D18))^2 + (D22+D24*(-F27*D16+1*D17+F25*D18))^2)*6356078,963)))) ^3))* (180/PI()))/(180/PI()))^2))))*COS((ARCTAN(((D23+ D24*(+F26*D16-F25*D17+1*D18)) +((6377397,155^2-6356078,963^2)/6356078,963^2) *6356078,963*SIN((ARCTAN(((D23+ D24*(+F26*D16-F25*D17+1*D18))*6377397,155) /(WURZEL((D21+D24*(1 *D16+F27*D17-F26*D18))^2 + (D22+D24*(-F27*D16+1*D17+F25*D18))^2)*6356078,963)))) ^3)/((WURZEL((D21+D24*(1 *D16+F27*D17-F26*D18))^2 + (D22+D24*(-F27*D16+1*D17+F25*D18))^2)) -(((6377397,155^2-6356078,963^2)/6377397,155^2)) *6377397,155*COS((ARCTAN(((D23+ D24*(+F26*D16-F25*D17+1*D18))*6377397,155) /(WURZEL((D21+D24*(1 *D16+F27*D17-F26*D18))^2 + (D22+D24*(-F27*D16+1*D17+F25*D18))^2)*6356078,963)))) ^3))* (180/PI()))/(180/PI())))*((ARCTAN((D22+D24*(-F27*D16+1*D17+F25*D18)) /(D21+D24*(1 *D16+F27*D17-F26*D18))) *(180/PI()))-'UTM-GK'!$N$13)+(1/(6*(180/PI())^3)  *((6377397,155^2/6356078,963)/WURZEL(1+((((6377397,155^2-6356078,963^2)/6356078,963^2) *COS((ARCTAN(((D23+ D24*(+F26*D16-F25*D17+1*D18))+((6377397,155^2-6356078,963^2)/6356078,963^2) *6356078,963*SIN((ARCTAN(((D23+ D24*(+F26*D16-F25*D17+1*D18))*6377397,155) /(WURZEL((D21+D24*(1 *D16+F27*D17-F26*D18))^2 + (D22+D24*(-F27*D16+1*D17+F25*D18))^2)*6356078,963)))) ^3)/((WURZEL((D21+D24*(1 *D16+F27*D17-F26*D18))^2 + (D22+D24*(-F27*D16+1*D17+F25*D18))^2)) -(((6377397,155^2-6356078,963^2)/6377397,155^2)) *6377397,155*COS((ARCTAN(((D23+ D24*(+F26*D16-F25*D17+1*D18))*6377397,155) /(WURZEL((D21+D24*(1 *D16+F27*D17-F26*D18))^2 + (D22+D24*(-F27*D16+1*D17+F25*D18))^2)*6356078,963)))) ^3))* (180/PI()))/(180/PI()))^2))))*COS((ARCTAN(((D23+ D24*(+F26*D16-F25*D17+1*D18)) +((6377397,155^2-6356078,963^2)/6356078,963^2) *6356078,963*SIN((ARCTAN(((D23+ D24*(+F26*D16-F25*D17+1*D18))*6377397,155) /(WURZEL((D21+D24*(1 *D16+F27*D17-F26*D18))^2 + (D22+D24*(-F27*D16+1*D17+F25*D18))^2)*6356078,963)))) ^3)/((WURZEL((D21+D24*(1 *D16+F27*D17-F26*D18))^2 + (D22+D24*(-F27*D16+1*D17+F25*D18))^2)) -(((6377397,155^2-6356078,963^2)/6377397,155^2)) *6377397,155*COS((ARCTAN(((D23+ D24*(+F26*D16-F25*D17+1*D18))*6377397,155) /(WURZEL((D21+D24*(1 *D16+F27*D17-F26*D18))^2 + (D22+D24*(-F27*D16+1*D17+F25*D18))^2)*6356078,963)))) ^3))* (180/PI()))/(180/PI()))^3*(1-TAN((ARCTAN(((D23+ D24*(+F26*D16-F25*D17+1*D18)) +((6377397,155^2-6356078,963^2)/6356078,963^2) *6356078,963*SIN((ARCTAN(((D23+ D24*(+F26*D16-F25*D17+1*D18))*6377397,155) /(WURZEL((D21+D24*(1 *D16+F27*D17-F26*D18))^2 + (D22+D24*(-F27*D16+1*D17+F25*D18))^2)*6356078,963)))) ^3)/((WURZEL((D21+D24*(1 *D16+F27*D17-F26*D18))^2 + (D22+D24*(-F27*D16+1*D17+F25*D18))^2)) -(((6377397,155^2-6356078,963^2)/6377397,155^2)) *6377397,155*COS((ARCTAN(((D23+ D24*(+F26*D16-F25*D17+1*D18))*6377397,155) /(WURZEL((D21+D24*(1 *D16+F27*D17-F26*D18))^2 + (D22+D24*(-F27*D16+1*D17+F25*D18))^2)*6356078,963)))) ^3))* (180/PI()))/(180/PI()))^2+((((6377397,155^2-6356078,963^2)/6356078,963^2) *COS((ARCTAN(((D23+ D24*(+F26*D16-F25*D17+1*D18))+((6377397,155^2-6356078,963^2)/6356078,963^2) *6356078,963*SIN((ARCTAN(((D23+ D24*(+F26*D16-F25*D17+1*D18))*6377397,155) /(WURZEL((D21+D24*(1 *D16+F27*D17-F26*D18))^2 + (D22+D24*(-F27*D16+1*D17+F25*D18))^2)*6356078,963)))) ^3)/((WURZEL((D21+D24*(1 *D16+F27*D17-F26*D18))^2 + (D22+D24*(-F27*D16+1*D17+F25*D18))^2)) -(((6377397,155^2-6356078,963^2)/6377397,155^2)) *6377397,155*COS((ARCTAN(((D23+ D24*(+F26*D16-F25*D17+1*D18))*6377397,155) /(WURZEL((D21+D24*(1 *D16+F27*D17-F26*D18))^2 + (D22+D24*(-F27*D16+1*D17+F25*D18))^2)*6356078,963)))) ^3))* (180/PI()))/(180/PI()))^2))))*((ARCTAN((D22+D24*(-F27*D16+1*D17+F25*D18)) /(D21+D24*(1 *D16+F27*D17-F26*D18))) *(180/PI()))-'UTM-GK'!$N$13)^3+(1/(120*(180/PI())^5) *((6377397,155^2/6356078,963)/WURZEL(1+((((6377397,155^2-6356078,963^2)/6356078,963^2) *COS((ARCTAN(((D23+ D24*(+F26*D16-F25*D17+1*D18))+((6377397,155^2-6356078,963^2)/6356078,963^2) *6356078,963*SIN((ARCTAN(((D23+ D24*(+F26*D16-F25*D17+1*D18))*6377397,155) /(WURZEL((D21+D24*(1 *D16+F27*D17-F26*D18))^2 + (D22+D24*(-F27*D16+1*D17+F25*D18))^2)*6356078,963)))) ^3)/((WURZEL((D21+D24*(1 *D16+F27*D17-F26*D18))^2 + (D22+D24*(-F27*D16+1*D17+F25*D18))^2)) -(((6377397,155^2-6356078,963^2)/6377397,155^2)) *6377397,155*COS((ARCTAN(((D23+ D24*(+F26*D16-F25*D17+1*D18))*6377397,155) /(WURZEL((D21+D24*(1 *D16+F27*D17-F26*D18))^2 + (D22+D24*(-F27*D16+1*D17+F25*D18))^2)*6356078,963)))) ^3))* (180/PI()))/(180/PI()))^2))))*COS((ARCTAN(((D23+ D24*(+F26*D16-F25*D17+1*D18)) +((6377397,155^2-6356078,963^2)/6356078,963^2) *6356078,963*SIN((ARCTAN(((D23+ D24*(+F26*D16-F25*D17+1*D18))*6377397,155) /(WURZEL((D21+D24*(1 *D16+F27*D17-F26*D18))^2 + (D22+D24*(-F27*D16+1*D17+F25*D18))^2)*6356078,963)))) ^3)/((WURZEL((D21+D24*(1 *D16+F27*D17-F26*D18))^2 + (D22+D24*(-F27*D16+1*D17+F25*D18))^2)) -(((6377397,155^2-6356078,963^2)/6377397,155^2)) *6377397,155*COS((ARCTAN(((D23+ D24*(+F26*D16-F25*D17+1*D18))*6377397,155) /(WURZEL((D21+D24*(1 *D16+F27*D17-F26*D18))^2 + (D22+D24*(-F27*D16+1*D17+F25*D18))^2)*6356078,963)))) ^3))* (180/PI()))/(180/PI()))^5* (5 - 18*TAN((ARCTAN(((D23+ D24*(+F26*D16-F25*D17+1*D18)) +((6377397,155^2-6356078,963^2)/6356078,963^2) *6356078,963*SIN((ARCTAN(((D23+ D24*(+F26*D16-F25*D17+1*D18))*6377397,155) /(WURZEL((D21+D24*(1 *D16+F27*D17-F26*D18))^2 + (D22+D24*(-F27*D16+1*D17+F25*D18))^2)*6356078,963)))) ^3)/((WURZEL((D21+D24*(1 *D16+F27*D17-F26*D18))^2 + (D22+D24*(-F27*D16+1*D17+F25*D18))^2)) -(((6377397,155^2-6356078,963^2)/6377397,155^2)) *6377397,155*COS((ARCTAN(((D23+ D24*(+F26*D16-F25*D17+1*D18))*6377397,155) /(WURZEL((D21+D24*(1 *D16+F27*D17-F26*D18))^2 + (D22+D24*(-F27*D16+1*D17+F25*D18))^2)*6356078,963)))) ^3))* (180/PI()))/(180/PI()))^2 + TAN((ARCTAN(((D23+ D24*(+F26*D16-F25*D17+1*D18)) +((6377397,155^2-6356078,963^2)/6356078,963^2) *6356078,963*SIN((ARCTAN(((D23+ D24*(+F26*D16-F25*D17+1*D18))*6377397,155) /(WURZEL((D21+D24*(1 *D16+F27*D17-F26*D18))^2 + (D22+D24*(-F27*D16+1*D17+F25*D18))^2)*6356078,963)))) ^3)/((WURZEL((D21+D24*(1 *D16+F27*D17-F26*D18))^2 + (D22+D24*(-F27*D16+1*D17+F25*D18))^2)) -(((6377397,155^2-6356078,963^2)/6377397,155^2)) *6377397,155*COS((ARCTAN(((D23+ D24*(+F26*D16-F25*D17+1*D18))*6377397,155) /(WURZEL((D21+D24*(1 *D16+F27*D17-F26*D18))^2 + (D22+D24*(-F27*D16+1*D17+F25*D18))^2)*6356078,963)))) ^3))* (180/PI()))/(180/PI()))^4 + ((((6377397,155^2-6356078,963^2)/6356078,963^2) *COS((ARCTAN(((D23+ D24*(+F26*D16-F25*D17+1*D18))+((6377397,155^2-6356078,963^2)/6356078,963^2) *6356078,963*SIN((ARCTAN(((D23+ D24*(+F26*D16-F25*D17+1*D18))*6377397,155) /(WURZEL((D21+D24*(1 *D16+F27*D17-F26*D18))^2 + (D22+D24*(-F27*D16+1*D17+F25*D18))^2)*6356078,963)))) ^3)/((WURZEL((D21+D24*(1 *D16+F27*D17-F26*D18))^2 + (D22+D24*(-F27*D16+1*D17+F25*D18))^2)) -(((6377397,155^2-6356078,963^2)/6377397,155^2)) *6377397,155*COS((ARCTAN(((D23+ D24*(+F26*D16-F25*D17+1*D18))*6377397,155) /(WURZEL((D21+D24*(1 *D16+F27*D17-F26*D18))^2 + (D22+D24*(-F27*D16+1*D17+F25*D18))^2)*6356078,963)))) ^3))* (180/PI()))/(180/PI()))^2))*(14 - 58*TAN((ARCTAN(((D23+ D24*(+F26*D16-F25*D17+1*D18)) +((6377397,155^2-6356078,963^2)/6356078,963^2) *6356078,963*SIN((ARCTAN(((D23+ D24*(+F26*D16-F25*D17+1*D18))*6377397,155) /(WURZEL((D21+D24*(1 *D16+F27*D17-F26*D18))^2 + (D22+D24*(-F27*D16+1*D17+F25*D18))^2)*6356078,963)))) ^3)/((WURZEL((D21+D24*(1 *D16+F27*D17-F26*D18))^2 + (D22+D24*(-F27*D16+1*D17+F25*D18))^2)) -(((6377397,155^2-6356078,963^2)/6377397,155^2)) *6377397,155*COS((ARCTAN(((D23+ D24*(+F26*D16-F25*D17+1*D18))*6377397,155) /(WURZEL((D21+D24*(1 *D16+F27*D17-F26*D18))^2 + (D22+D24*(-F27*D16+1*D17+F25*D18))^2)*6356078,963)))) ^3))* (180/PI()))/(180/PI()))^2) ))*((ARCTAN((D22+D24*(-F27*D16+1*D17+F25*D18)) /(D21+D24*(1 *D16+F27*D17-F26*D18))) *(180/PI()))-'UTM-GK'!$N$13)^5)+500000+ ('UTM-GK'!$N$13) /3 * 10^6

Anzeige
AW: Code beschleunigen
16.12.2022 13:16:35
Daniel
Ich hab mal sowas ähnliches gemacht, allerdings mit Merkartor-Koordinaten. Das war wesentlich einfacher.
Wenn du für die Umrechnung mehrere Zellen brauchst, dann versuche mal, das Blatt so umzugestalten, das die komplette Berechnung in einer Zeile steht und die beiden Ausgangskoordinaten in den Spalten stehen, in den sie auch in der Datentabelle stehen.
Dann könntest du die ganze Rechenzeile kopieren und in das Blatt mit den Daten einfügen, auch das kannst du dann für alle Zeilen gemeinsam machen.
Zeitkritisch ist für Excel nicht das Rechnen, sondern die Hintergrundarbeit, die entsteht, wenn du einen Zellwert änderst, und die entsteht halt bei jeder Änderung.
Allerdings kann Excel diesen Aufwand zusammenfassen, wenn du alle Zellen gemeinsam änderst.
Momentan ist es halt so, dass du 10x zum Bäcker fährst, um 10 Brötchen zu kaufen.
Gruß Daniel
Anzeige
AW: Code beschleunigen
16.12.2022 13:25:59
Oliver
Erstmal Danke für die Hilfe. Ich Schau mal wie ich die Berechnung bewerkstellige, sodass es hier einen einfachen weg gibt :)
AW: Code beschleunigen
16.12.2022 11:19:51
snb
Etwas meher Infos wären nicht schlecht.
Eine TXT Bespieldatei z.B und ein Wunschergebnis.
AW: Code beschleunigen
16.12.2022 11:46:51
snb
Ich 'lese' so:

Sub M_snb()
sn = Split(CreateObject("scripting.filesystemobject").OpenTextFile("G:\156774.txt").readall, vbCrLf)
For j = 0 To UBound(sn)
st = Split(sn(j))
MsgBox Join(st, vbLf)
Next
End Sub
Und wie wird dann 'umgerechnet ?
Anzeige
AW: Code beschleunigen
16.12.2022 11:21:40
Daniel
Hi
Du musst dir deine Formeln von L15 und N15 auf dem Umrechnungsblatt so umschreiben, dass du sie in die Zellen Spalte C und D des Datenblattes schreiben kannst.
Dann kannst du die Formeln in einem Schritt in das Datenblatt eintragen und alles gleichzeitig berechnen
Das geht schneller, als wenn du jede Koordinate einzeln umrechnest.
Der Code sieht dann sinngemäß so aus:

With Range("C1:D" & Cells(Rows.Count, 1).End(xlup).row)
.Columns(1).FormulaR1C1 = "=Umrechnungsformel1 in R1C1"
.Columns(2).FormulaR1C1 = "=Umrechnungsformel2 in R1C1"
.Formula = .Value
End With
Grus Daniel
.
Anzeige
AW: Code beschleunigen
16.12.2022 13:27:34
onur
Ich verstehe eins nicht:
Dein Makro kopiert Worksheets("UTM(ETRS)-GK(DHDN)").Range("B15").Value nach Cells(Zeile2, 1) auf dem aktuellen Blatt und von dort nach Worksheets("UTM(ETRS)-GK(DHDN)").Range("L15").
Das heisst es wird nur von Worksheets("UTM(ETRS)-GK(DHDN)").Range("B15") nach L15 auf dem selben Blatt kopiert, über den Umweg Cells(Zeile2, 1) auf dem aktuellen Blatt. Diese Cells(Zeile2,1) kann ja inzwischen nicht verändert worden sein, da sie ja keine Excelformel zwischenzeitlich verändert haben könnte, höchstens ein Change-Event-Makro.
Warum schaltest du dann 3 Millionen mal Events und automatische Berechnung aus und wieder ein?
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige