Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Arrayberechnung laaangsam mit Excel 2016
#1
Guten Tag

Wir haben bei uns neuerdings WIN10 und Excel 2016 installiert. Letztes Jahr lief eine relativ grosse Berechnung eines Arrays, das ich von Peter Haserodt Heart  entlehnt habe, irrsinnig schnell. Nun wollte ich die Datei wieder verwenden (wie jedes Jahr neu) und die Berechnung dauert eeewig Huh . Eventuell kann mir jemand helfen.

Das Schnipsel von Peter war folgendes:
        ' Dim i As Long, vx(1 To 10000, 1 To 1) As Variant
        ' Randomize Timer
        ' For i = 1 To 10000
        '    vx(i, 1) = Int(500 * Rnd + 1)
        ' Next i
        ' With Worksheets("Tabelle1")
        '   .Range(.Cells(1, 1), .Cells(10000, 1)) = vx
        ' End With

Ich verwende es (im Prinzip) so:
   Dim vx(1 To 999000, 1 To 1) As Variant      'Array für Formelvorbereitung
   For i = ErsteZeile To AnzZeilen + ErsteZeile - 2
     FormelDRP = "=$BG$" & i2                'Formel zusammensetzen für Spalte BG und
     vx(1 + i - ErsteZeile, 1) = FormelDRP   'in Array eintragen
   Next i
   With ActiveSheet
      .Range(.Cells(ErsteZeile, intK), _
      .Cells(AnzZeilen + ErsteZeile - 2, intK)) = vx       'Gesammeltes Array in Kolonne eintragen
   End With

Ich war damals wahnsinnig begeistert 19 . Die Berechnung für 200'000 Zeilen dauerte ca 10 sec. Nun dauert es für 70'000 mind 15 min Angry .

Vielen Dank schon mal für eure Hilfe.

Gruss aus der verschneiten Schweiz.
Rodlof
Antwortento top
#2
Hi Rodlof,
 
Für mich reichen deine Vorgaben (Codeschnipsel) nicht um zu helfen.
Beschreibe am besten welche Ausgangssituation vorliegt und was am Ende dein Wunschergebnis ist.

 
Gruß Elex
Antwortento top
#3
Hallo,

hat sicher nichts mit deinem Problem zu tun, aber das:

Zitat:  FormelDRP = "=$BG$" & i2                
     vx(1 + i - ErsteZeile, 1) = FormelDRP   

wäre ja irgendwie das gleiche wie das:

Zitat:  vx(1 + i - ErsteZeile, 1) = "=$BG$" & i2               
Viele Grüße
Klaus-Dieter
Der Erfolg hat viele Väter, 
der Misserfolg ist ein Waisenkind
Richard Cobden
Antwortento top
#4
Woher stammt AnzZeilen
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Antwortento top
#5
Rodlof,

deine Version des Makros trägt doch nur Formeln bzw. Bezüge auf eine andere Spalte in das Arbeitsblatt ein, oder? Wenn relative Bezüge OK sind, reicht dafür ein Einzeiler:

Code:
Sub FormelEintragen(ErsteZeile As Long, AnzZeilen As Long, intK As Long)
    ActiveSheet.Cells(ErsteZeile, intK).Resize(AnzZeilen, 1).Formula = "=$BG" & ErsteZeile
End Sub

Falls du tatsächlich den Eintrag für jede Zeile individuell berechnen willst, zum Beispiel weil du absolute Bezüge brauchst, könnte das Gerüst so aussehen:

Code:
Sub ArrayRechnenUndEintragen(ErsteZeile As Long, AnzZeilen As Long, intK As Long)
    Dim vx() As Variant
    ReDim vx(1 To AnzZeilen)

    For i = 1 To AnzZeilen
        vx(i) = "=$BG$" & i + ErsteZeile - 1 ' ### Formel mit absolutem Bezug
        ' vx(i) = Range("$BG" & i + ErsteZeile - 1).Value ' ### alternativ: holt Werte aus dem Arbeitsblatt
    Next i
    ActiveSheet.Cells(ErsteZeile, intK).Resize(AnzZeilen, 1) = vx
End Sub

Redoute
Antwortento top
#6
Hallo Redoute

Vielen Dank für deinen Code. Ich brauche tatsächlich absolute Bezüge. Der zweite mit den absoluten Bezügen sieht daher gut aus. Ich werde das mal probieren und gebe nochmals Bescheid.

Um das Umfeld noch besser zu erklären: Ich habe viele verschiedene Artikel mit einer ID und mit jeweils verschiedenen Eigenschaften, die in einer Spalte pro Zeile einzeln aufgeführt werden (unpivotiert). Wenn die ID ändert, setze ich in einer Hilfsspalte eine 1, sonst 0. Damit kann ich die "erste" Spalte definieren und die Anzahl Artikel zählen. Die Anzahl Zeilen (also alle Eigenschaften aller Artikel) habe ich vorher gezählt und abgelegt (= AnzZeilen). Auf jeder ersten Zeile eines Artikels soll der User nun aus einem Aufklappmenu eine Wahl treffen und diese wird dann auf alle folgenden Zeilen dieses Artikels übertragen. Daher brauche ich eine absolute Referenzierung auf die jeweils "erste" Zeile (i2). Danach zähle ich i weiter bis zur nächsten "ersten" Zeile und kopiere das Aufklappmenu (leer) rein und setze i2 = i. Dann geht das Spiel von vorne los.

Viele Grüsse
Rodlof
Antwortento top
#7
Ach so, alle Formeln sollen auf die gleiche Zelle $BG$i2 verweisen? Dann braucht der Einzeiler ein Dollarzeichen mehr:

Code:
Sub FormelEintragen(ErsteZeile As Long, AnzZeilen As Long, intK As Long, i2 As Long)
    ActiveSheet.Cells(ErsteZeile, intK).Resize(AnzZeilen, 1).Formula = "=$BG$" & i2
End Sub

Nach deiner Beschreibung müssten i2 und ErsteZeile identisch sein?

Redoute
Antwortento top
#8
Hallo Redoute

Das wird ja immer besser. Vielen Dank. Werde ich auch probieren. Im Moment kämpfe ich noch mit anderen Problemen...

Die ErsteZeile ist die allererste Zeile aller Einträge, sie beginnt nicht bei 1, da ich einen Header habe. Zwar ist ErsteZeile = i2 vom ersten Artikel, danach stimmt es nicht mehr. LetzteZeile ist die allerletzte Zeile der Liste und daher: ErsteZeile + AnzZeilen = LetzteZeile. LetzteZeile variiert zwischen 20'000 und 500'000. 

Lieber Gruss
Rodlof
Antwortento top
#9
Warum keine 'Intelligente' Tabelle ?
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
[-] Folgende(r) 1 Benutzer sagt Danke an snb für diesen Beitrag:
  • rodlof
Antwortento top
#10
Hi

Das Problem Geschwindigkeit beim eintragen von Formel per Code lässt sich so meistens verbessern.
Code:
Sub Makro()
    Application.Calculation = xlManual
    
    Dein Code
    
    Application.Calculation = xlAutomatic
End Sub

Gruß Elex
[-] Folgende(r) 1 Benutzer sagt Danke an Elex für diesen Beitrag:
  • rodlof
Antwortento top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste