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

Rechnungen optimieren

Rechnungen optimieren
09.12.2013 09:56:52
Mona
Moin,
ich habe folgendes Makro geschrieben, das mir Werte umrechnet und dann in einer Exceltabelle ausgeben soll. Es handelt sich um Verschiedene Tabellenblätter, und die Anzahl der Daten ist unterschiedlich, und wird deswegen von einem anderen Makro vorher ermittelt. Es handelt sich um Datensätze mit 20000 bis 60000 Zeilen.
Die Rechnung klappt. Nur wenn ich jetzt alle (hier ca. 20000 Zeilen) berechenen lassen will, gibt excel auf. Kann man das evt für excel verträglicher Programmieren?
Es ist eine 2x2 Matrix mit einer 2x1 multipliziert. Aber halt hier nun als ausgeschriebener Rechenwert.
Danke schonmal
Mona
Sub Berechnungen()
'Variablen für die For schleife
Dim i2 As Integer
Dim maxZeilen As Long
Dim Dreh As Double
Dim Winkel As Double
Dim Pi As Double
Dim cos As Double
Dim sin As Double
Pi = 3.14159
Winkel = ThisWorkbook.Worksheets("Ausgabe").Cells(7, 9)
Dreh = (360 - Winkel) / 180 * Pi 'Grad in Rad
cos = Cos(Dreh)
sin = sin(Dreh)
i2 = 10
maxZeilen = ThisWorkbook.Worksheets("Eingabe").Cells(5, 13)
For i2 = 10 To maxZeilen
ThisWorkbook.Worksheets("Ausgabe").Cells(i2, 13) = cos * ThisWorkbook.Worksheets("Ausgabe"). _
_
Cells(i2, 9) + sin * ThisWorkbook.Worksheets("Ausgabe").Cells(i2, 10)
ThisWorkbook.Worksheets("Ausgabe").Cells(i2, 14) = (-1) * sin * ThisWorkbook.Worksheets(" _
Ausgabe").Cells(i2, 9) + cos * ThisWorkbook.Worksheets("Ausgabe").Cells(i2, 10)
ThisWorkbook.Worksheets("Ausgabe").Cells(i2, 15) = cos * ThisWorkbook.Worksheets("Ausgabe"). _
_
Cells(i2, 11) + sin * ThisWorkbook.Worksheets("Ausgabe").Cells(i2, 12)
ThisWorkbook.Worksheets("Ausgabe").Cells(i2, 16) = (-1) * sin * ThisWorkbook.Worksheets(" _
Ausgabe").Cells(i2, 11) + cos * ThisWorkbook.Worksheets("Ausgabe").Cells(i2, 12)
Next i2
End Sub

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

Betreff
Datum
Anwender
Anzeige
Benennung Variablen
09.12.2013 10:09:29
Klaus
Hallo Mona,
keine Ahnung ob es daran liegt ... aber die Worte "cos" und "sin" sind VBA-Kommandos. So solltest du deine Variablen NIE nennen!
Grüße,
Klaus M.vdT.

vbFktt, nicht Kommandos, Klaus! ;-) Gruß owT
09.12.2013 10:15:49
Luc:-?
:-?

AW: vbFktt, nicht Kommandos, Klaus! ;-) Gruß owT
09.12.2013 11:58:53
Mona
Moin Klau,
die haben auch noch zahlen dahinter, im original code, und wenn ich die Schleife auf 10 bis 15 setzte berechnet er die ersten 5 Zeilen auch einwandfrei.
Aber Danke, stimmt auf sowas sollte man achten.

AW: Rechnungen optimieren
09.12.2013 12:44:42
Klaus
Hi Mona,
60000 Zeilen mal vier Spalten sind auch eine Hausnummer. Ich denke, hier gibt das ständige Recalculation ein Problem.
Hast du vielleicht flüchtige Formeln in der Datei (HEUTE(), INDIREKT(), BEREICH.VERSCHIEBEN()....) oder sehr viele bedingte Formatierungen in der Datei? Das sind alles bremsen!
Versuch mal, vor deinem Code die Berechnungen abzuschalten (und danach wieder an). Sollte dann so aussehen:
Sub Berechnungen()
Application.Calculation = xlCalculationManual
[...dein Code...]
Application.Calculation = xlCalculationAutomatic
End Sub
Was vielleicht aus was bringen könnte: Die Berechnungen innerhalb der Schleife vermeiden, und erst am Ende der Schleife alles auf einmal berechnen. Dafür habe ich den Code mal so umgeschrieben, dass er bei deaktiverter Berechnung Formeln ins Blatt schreibt statt Ergebnisse. Nach durchlauf der Schleife wird die Berechnung wieder auf automatisch gesetzt, dann solltest du ein paar Minuten dem "%-Berechnet" Zähler in der Statusleiste zuschauen dürfen.
(Ich habe auch die Referenzierung in einen WIDTH-Rahmen gepackt, damit der Code lesbarer wird)
Sub Berechnungen()
'Variablen für die For schleife
Dim i2 As Integer
Dim maxZeilen As Long
Dim Dreh As Double
Dim Winkel As Double
Dim QPi As Double
Dim Qcos As Double
Dim Qsin As Double
QPi = 3.14159
Winkel = ThisWorkbook.Worksheets("Ausgabe").Cells(7, 9).Value
Dreh = (360 - Winkel) / 180 * QPi 'Grad in Rad
Qcos = cos(Dreh)
Qsin = sin(Dreh)
'i2 = 10
maxZeilen = ThisWorkbook.Worksheets("Eingabe").Cells(5, 13).Value
With ThisWorkbook.Worksheets("Ausgabe")
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
For i2 = 10 To maxZeilen
.Cells(i2, 13).FormulaLocal = "=" & Qcos & "*" & .Cells(i2, 9).Value & "+" & Qsin & _
"*" & .Cells(i2, 10).Value
.Cells(i2, 14).FormulaLocal = "=(-1)*" & Qsin & "*" & .Cells(i2, 9).Value & "+" &  _
Qcos & "*" & .Cells(i2, 10).Value
.Cells(i2, 15).FormulaLocal = "=" & Qcos & "*" & .Cells(i2, 11) & "+" & Qsin & "*"  _
& .Cells(i2, 12).Value
.Cells(i2, 16).FormulaLocal = "=(-1)*" & Qsin & "*" & .Cells(i2, 11).Value & "+" &  _
Qcos & "*" & .Cells(i2, 12).Value
Next i2
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
'Formeln durch Werte ersetzen
.Range(.Cells(10, 13), .Cells(maxZeilen, 16)).Value = .Range(.Cells(10, 13), .Cells( _
maxZeilen, 16)).Value
End With
End Sub

ACHTUNG! Code mangels Musterdatei ungetestet!
Eine weitere Idee wäre, die Ergebnisse nicht ins Tabellenblatt, sondern in vier seperate Arrays zu schreiben. Am Ende der Schleife werden die Arrays dann als Text ins Blatt geschrieben. Ich kanns nicht :-) aber vielleicht meldet sich ja ein anderer.
Grüße,
Klaus M.vdT.

Anzeige
AW: Rechnungen optimieren
10.12.2013 12:00:09
Mona
Danke Klaus, werde ich mir heute Abend mal anschauen.

AW: Rechnungen optimieren
10.12.2013 19:12:07
Mona
Moin Klaus,
den With-Rahmen finde ich sehr gut :)
.Cells(i2, 13).FormulaLocal = "=" & Qcos & "*" & .Cells(i2, 9).Value & "+" & Qsin & _
"*" & .Cells(i2, 10).Value
versteh ich das richtig, "FormulaLocal" sezt in die entsprechenden Zellen nur die Rechnung ?
Wozu dienen die ganzen Anführungszeichen ("=") ?
Application.ScreenUpdating = False/True was genau macht die Funktion?
Danke Gruß

AW: Rechnungen optimieren
10.12.2013 19:23:48
Mona
Achso das wollte ich ja auch noch schreiben: Leider läuft es nicht Laufzeitfehler 13, Typen unverträglichkeit.

Anzeige
AW: Rechnungen optimieren
09.12.2013 13:07:47
Rudi
Hallo,
teste mal:
Sub Berechnungen()
'Variablen für die For schleife
Dim i2 As Long
Dim maxZeilen As Long
Dim Dreh As Double
Dim Winkel As Double
Dim dPi As Double
Dim dCos As Double
Dim dSin As Double
Dim arrTmp()
i2 = 10
dPi = WorksheetFunction.Pi()
Winkel = ThisWorkbook.Worksheets("Ausgabe").Cells(7, 9)
Dreh = (360 - Winkel) / 180 * dPi 'Grad in Rad
dCos = cos(Dreh)
dSin = sin(Dreh)
maxZeilen = ThisWorkbook.Worksheets("Eingabe").Cells(5, 13)
ReDim arrTmp(1 To maxZeilen - 9, 1 To 4)
With ThisWorkbook.Worksheets("Ausgabe")
For i2 = 10 To maxZeilen
arrTmp(i2 - 9, 1) = dCos * .Cells(i2, 9) + dSin * .Cells(i2, 10)
arrTmp(i2 - 9, 2) = -dSin * .Cells(i2, 9) + dCos * .Cells(i2, 10)
arrTmp(i2 - 9, 3) = dCos * .Cells(i2, 11) + dSin * .Cells(i2, 12)
arrTmp(i2 - 9, 4) = -dSin * .Cells(i2, 11) + dCos * .Cells(i2, 12)
Next i2
.Cells(10, 13).Resize(UBound(arrTmp), 4) = arrTmp
End With
End Sub

Gruß
Rudi

Anzeige
AW: Rechnungen optimieren
10.12.2013 11:59:47
Mona
Danke Rudi, werde ich mir heute Abend mal anschauen.

AW: Rechnungen optimieren
10.12.2013 18:59:35
Mona
Hallo Rudi,
Ich bekommen Laufzeitfehler 9, Index außerhalb des gültigen Bereichs ausgegeben, wenn ich es so durchlaufen lassen will.
Da ich vorher noch nie mit arrays in vba gearbeitet habe:
Dim arrTmp()
muss man keinen Datentyp zuweisen bei arrays?
Ich verstehe den Teil, wo in das Array die Berechnung geschrieben wird, aber magst du mir folgende Zeile bitte nochmal erklären:
.Cells(10, 13).Resize(UBound(arrTmp), 4) = arrTmp
Die with-Funktion finde ich sehr gut, das macht das Ganze gleich viel übersichtlicher, Danke.
Gruß

Anzeige
Zelle(10,13) also M13 wird auf einen Bereich ...
11.12.2013 02:33:24
Luc:-?
…aus 4 Spalten und genausoviel Zeien wie arrTemp Werte (bzw falls 2dimensional Zeilen) hat (falls der 1.Index=1 ist) ausgedehnt, um anschld per Zuweisung mit = alle Werte des Arrays darin unterbringen zu können.
Einen Datentyp muss man einem Array nur zuweisen, wenn man seine Elemente einzeln einspeichern will (zB per Schleife). Das wäre dann ein „klassisches“ (n-dimensionales) xlVBA-Array. Hier handelt es sich aber um den allgemeinen Array-Typ Variant mit einem Array, der natürlich dann auch (hier durch Nicht-Angabe des Datentyps automatisch) variant sein muss und ggüber dem anderen Vorteile bietet.
Gruß Luc :-?

Anzeige
AW: Zelle(10,13) also M13 wird auf einen Bereich ...
11.12.2013 10:59:16
Mona
Danke für die Erklärung, Luc. Hast du evt auch eine idee wieso ich diesen Laufzeitfehler bekomme?

Nee, habe ich nicht, denn das Pgm von Rudi ...
11.12.2013 12:04:36
Rudi
…scheint iO zu sein, Mona,
aber evtl nicht die von ihm verwendeten ZellInhalte. Solltest du mal kontrollieren!
In diesem Zusammenhang muss ich mich korrigieren. Es handelt sich bei dem von Rudi verwendeten Array doch um ein normales n-dimensionales xlVBA-Array, dass man auch mit speziellem DatenTyp hätte deklarieren können. Aber so (als vom allgemeinen Typ Variant) kann es auch evtl bei der Berechnung entstehende Fehlerwerte aufnehmen. Anderenfalls würde das Pgm in diesem Falle in den Debug-Modus treten (mit entsprd FehlerMeldung), da Rudi keine FehlerBehandlung vorgesehen hat (fehlte ja auch bei dir!).
Ich hatte mir das Pgm nicht angesehen und mich vom einfachen UBound (ohne Dimensionsposition) täuschen lassen (ich hätte .Resize(UBound(arrTmp, 1), UBound(arrTmp, 2)) geschrieben, aber das ist hier egal, da UBound(arrTmp) gleichbedeutend mit UBound(arrTmp, 1) und UBound(arrTmp, 2) ohnehin fix ist).
Der von mir erwähnte andere Array-Typ eignet sich besonders gut für KomplettÜbernahmen ganzer ZellBereiche (ohne Schleife), aber hier muss ja ohnehin jeder Wert berechnet wdn.
Gruß Luc :-?
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige