Registriert seit: 12.10.2014
Version(en): 365 Insider (64 Bit)
(23.05.2017, 20: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
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag.
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Registriert seit: 17.04.2014
Version(en): MS Office 365(32)
(23.05.2017, 20: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
Registriert seit: 12.03.2016
Version(en): Excel 2003/ 2016
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
Registriert seit: 20.04.2017
Version(en): 2016
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
Registriert seit: 10.04.2014
Version(en): 97-2019 (32) + 365 (64)
Hallöchen,
das mit den Arrays ist eigentlich gar nicht so kompliziert. Stell Dir einfach nur einen Zellbereich vor und sag Array dazu

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

Dafür geht aber einiges schneller ...
. \\\|/// Hoffe, geholfen zu haben.
( ô ô ) Grüße, André aus G in T
ooO-(_)-Ooo (Excel 97-2019+365)
Registriert seit: 21.06.2016
Version(en): 2021
24.05.2017, 14:44
(Dieser Beitrag wurde zuletzt bearbeitet: 24.05.2017, 15:23 von Ego.)
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?
helmut
Für mich ist die Möglichkeit in Excel an Zellen und Bereichen Namen zu vergeben die wichtigste Funktionalität.
Sie macht Formeln und den VBA-code verständlicher. Für Makros gilt die Regel: "Nur über benannte Bereiche auf den Inhalt der Zellen zugreifen."
Und wofür sind Regeln da? Um nachzudenken bevor man sie bricht.
Registriert seit: 29.09.2015
Version(en): 2030,5
Registriert seit: 21.06.2016
Version(en): 2021
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.
helmut
Für mich ist die Möglichkeit in Excel an Zellen und Bereichen Namen zu vergeben die wichtigste Funktionalität.
Sie macht Formeln und den VBA-code verständlicher. Für Makros gilt die Regel: "Nur über benannte Bereiche auf den Inhalt der Zellen zugreifen."
Und wofür sind Regeln da? Um nachzudenken bevor man sie bricht.
Registriert seit: 20.04.2017
Version(en): 2016
holy moly vielen dnak, ja sind nur werte :)
ich werde es mir mal ansehen und komm wohl nicht drum arrays zu lernen ^^
Registriert seit: 12.10.2014
Version(en): 365 Insider (64 Bit)
25.05.2017, 11:27
(Dieser Beitrag wurde zuletzt bearbeitet: 25.05.2017, 11:27 von RPP63.)
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:
.PasteSpecial ist mehr als sechsmal schneller.
Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag.
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)