Clever-Excel-Forum

Normale Version: gibt es einen schnelleren code?
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2 3
(23.05.2017, 19:04)Gast 123 schrieb: [ -> ]Diese Sache verstehe ich wirklich nicht!  Ich habe diese Programmierweise damals aus Beispielen von DataBecker übernommen und es hat 20 Jahre problemlos funktioniert.  Im Augenblick verstehe ich den technischen Unterschied nicht wenn man hinten noch Cells anhaengt.  Was soll das Technisch bewirken??   Das ist mir einfach nicht klar.
Es hat etwas mit dem Objektmodell jeder modernen Programmiersprache zu tun.
Man greift sich den Parent und nach Bedarf den Child.
Range() ist erst mal ein unglaublich vielfältiges Object, welches durch .Cells() zum Glück eingeschränkt wird.
Was Du machst, ist die Aufgabenverteilung an den Compiler, der erfahrene Programmierer macht dies selbständig.
Gruß Ralf
(23.05.2017, 19:04)Gast 123 schrieb: [ -> ]Krtiki soll ja bewirken das man seine Fehler erkennt, nur bin ich im Augenblick wirklich -sehr verwirrt- weil das bisher immer so geklappt hat.

Guckst Du z.B.: Default: Kleines Wort - Grosse Wirkung
Hallo

ich dachte nisher immer ich haette gutes Wissen.  Es ist sehr schockierend wenn man begreifen muss das man fast nichts weiss.  Als triebe man ohne Schwimmweste mitten im Atlantik ... Muss Pause machen

frohes Schaffen für euch.

mfg  Gast 123
herzlichen Danke für eure Hilfe, zumindest wurde der code verkürtzt. ja ich bin Neuling in VBA, ich denke es liegt daran dass ich den noch "viel zu genau" schreibe. aber ich bring mir vb rein über Google und learning by doing bei... das mit Arrays kapier ich ums verrecken ned :D
Hallöchen,

das mit den Arrays ist eigentlich gar nicht so kompliziert. Stell Dir einfach nur einen Zellbereich vor und sag Array dazu Smile Eine Spalte oder Zeile wäre dann ein eindimensionales Array, hast Du mehrere Zeilen und / oder Spalten, dann wäre es ein zweidimensionales Array. Genau wie Du eine Zelle z.B. mit Cells(1,2) adressierst, bewegst Du Dich in einem Array. Erst wenn man etwas tiefer in die Problematik eindringt könnte es etwas komplizierter werden. Mit Zellen geht einiges einfacher als mit Arrays, na ja, und Arrays können oder haben nicht alles, was bei Zellen möglich ist Sad Dafür geht aber einiges schneller ...
Hallon rotzi,

was willst du denn kopieren?

Durch die Nutzung von arrays und dictionary sollte:


a) wenn du nur die Werte kopieren willst, ein Geschwindigkeitfaktor > 100 möglich sein.
b) wenn du Formeln oder Formate kopieren willst, ein Geschwindigkeitfaktor > 10 möglich sein.



ps. wenn du nur Werte kopieren willst habe ich noch die Frage:
Sind in den Spalten A:C im Blatt "All" auch nur Werte?
Hallo rotzi,

hier einmal eine  Version falls nur Werte kopiert werden sollen und auch sonst in Spalte C des Blattes "All" keine 'Formeln sind:

Code:
Sub Tuwat()
Dim lngZeile1 As Long
Dim lngZeile2 As Long
Dim varMAT1 As Variant
Dim varMAT21 As Variant
Dim varMAT23 As Variant
Dim wkb As Workbook
Dim wks As Worksheet
Dim varDict As Object

Dim dblTime As Double

Set varDict = CreateObject("Scripting.Dictionary")
With Application
    .Calculation = xlCalculationManual
    .EnableEvents = False
    .ScreenUpdating = False
End With

dblTime = Timer
With Worksheets("Arbeitsblatt").Range("G14:G98")
    .Value = .Value
    .NumberFormat = "0"
End With

Set wkb = Workbooks.Open("D:\Tools\Data.xlsm")
Set wks = wkb.Sheets("All")
varMAT1 = Workbooks("Test.xlsm").Worksheets("Arbeitsblatt").Range("G14:H98")
varMAT21 = wks.Range("A2:A132690")
varMAT23 = wks.Range("C2:C132690")

For lngZeile1 = 1 To UBound(varMAT1, 1)
    If varMAT1(lngZeile1, 1) <> "" Then
        varDict(varMAT1(lngZeile1, 1)) = varMAT1(lngZeile1, 2)
    End If
Next lngZeile1
For lngZeile2 = 1 To UBound(varMAT21, 1)
    If varDict.exists(varMAT21(lngZeile2, 1)) Then
        varMAT23(lngZeile2, 1) = varDict(varMAT21(lngZeile2, 1))
    End If
Next lngZeile2
wks.Range("C2:C132690") = varMAT23

With Application
    .Calculation = xlCalculationAutomatic
    .EnableEvents = True
    .ScreenUpdating = True
End With
Application.StatusBar = "Done! within  " & Timer - dblTime & " sek"
Workbooks("Data.xlsm").Close False
End Sub

Dass macht eine Beschleunigung vom Faktor ~ 450.
holy moly vielen dnak, ja sind nur werte :)

ich werde es mir mal ansehen und komm wohl nicht drum arrays zu lernen ^^
Moin Helmut!
Nur eine Ergänzung zu Deinem Code, auch weil Du die Geschwindigkeit ansprichst:
.Value = .Value ist langsam!
Nimm statt dessen .Copy: .PasteSpecial xlPasteValues

Falls Du mir nicht glaubst ;):
Ich habe mal eine Testumgebung aufgebaut, damit man dies auch merkt.
16.384.000 Zellen mit =ZUFALLSZAHL() gefüllt und beide Methoden gegenübergestellt:

Sub Value_vs_PasteSpecial()
Dim Start&
Application.ScreenUpdating = False
With Range("A1:XFD1000")
   Call Fill_It
   Start = Timer
   .Copy: .PasteSpecial xlPasteValues
   Debug.Print Timer - Start
   Call Fill_It
   Start = Timer
   .Value = .Value
   Debug.Print Timer - Start
End With
End Sub
Sub Fill_It()
With Range("A1:XFD1000")
   .Clear
   .Formula = "=Rand()"
End With
End Sub


VBA/HTML-CodeConverter, AddIn für Office 2002-2016 - in VBA geschrieben von Lukas Mosimann. Projektbetreuung:RMH Software & Media

Code erstellt und getestet in Office 16 - mit VBAHTML 12.6.0


Das Direktfenster meldet mir:
Code:
3,125
19,09765625

.PasteSpecial ist mehr als sechsmal schneller.

Gruß Ralf
Seiten: 1 2 3