Kopieer Code Versnellen

Status
Niet open voor verdere reacties.

pjchausoul

Gebruiker
Lid geworden
27 jan 2008
Berichten
9
Beste Mensen,

Ik heb een probleem en weet eerlijk gezegd niet waar het aan ligt. Ik zal even de situatie uitleggen......

Ik probeer een fysisch process te simuleren m.b.v. excel . Alle benodige berekeningen zijn op de sheet ingevoerd en werken naar behoren. De opzet van de simulatie is in principe heel simpel. Eerst wordt een beginsituatie gedefineerd (t=0) in het bereik L3:O4002. In deze kolommen zit de informatie die gebruikt word om de volgende situatie (t+dt) te berekenen. Het resultaat van deze berekening bevind zich in het bereik U3:X4002 en ik wil deze vervolgens weer gebruiken als begin situatie en zo verder ..... De code die ik tot nu toe heb gebruikt is als volgt :

For i = 1 To 500

Worksheets("Simulatie").Range("U3:X4002").Copy
Worksheets("Simulatie").Range("L3").PasteSpecial xlPasteValues

Next i

Dit geeft het gewenste resultaat , maar de berekening duurt nog langer dan de tijd die ik probeer te simuleren. Dus dat moet sneller kunnen (neem ik aan). Het probleem met een snellere code zoals bv. :

Worksheets("Simulatie").Range("U3:X4002") = Worksheets("Simulatie").Range("L3").Values

is dat er geen vervolg berekening meer plaats vind en dus de simulatie niet vooruit gaat.
Mijn vraag is daarom , hoe kan ik ervoor zorgen dat de berekeningen op de sheet wel plaats vinden , maar dat ik niet het klembord nodig heb voor de kopieer bewerking ?

Voorwaarden zijn wel , dat a: alleen de waarden uit het resultaat bereik worden gekopieerd en b: dat de sheet na iedere kopie weer wordt uitgerekend

Alvast bedankt

Groet Peter
 
Laatst bewerkt:
Om je eigen code sneller te maken kun je kijken of het handig is om de schermverversing uit te zetten met
Code:
Application.ScreenUpdating = False
(en aanzetten met true).
Ook kun je gebeurtenissen uitschakelen met
Code:
Application.EnableEvents = False
De vraag is dan wel of het met het herberekenen goed gaat.
mvg leo
 
Laatst bewerkt:
Je kunt eventueel ook nog eens proberen om autocalculation uit te schakelen en handmatig te berekenen nadat het copy/paste process klaar is, dus:

Code:
application.Calculation=xlCalculationManual 

For i = 1 To 500
    Worksheets("Simulatie").Range("U3:X4002").Copy
    Worksheets("Simulatie").Range("L3").PasteSpecial xlPasteValues
    application.Calculate 'of application.CalculateFull
Next i
 
Beste Leo en Rene,

Bedankt voor de tips. Toepassing van de adviezen heeft het zaakje aanzienlijk versneld wat voorheen 50 s duurde, duurt nu nog maar 37 s. (de gesimuleerde tijd was 43 s).

Vriendelijk groet,
Peter
 
Range definieren en Copy-commando korter

Sub...()

Dim rIn As Range
Dim rOut As Range
Dim i%

Set rIn = Worksheets("Simulatie").Range("L3:O4002")
Set rOut = Worksheets("Simulatie").Range("U3:X4002")

For i = 1 To 500
rIn = rOut.Value
Next i

PS Kun je niet een kringverwijzing maken, dan heb je helemaal geen code nodig. Het aantal iteraties in de kringverwijzing kun je instellen. Hoe het precies werkt staat wel ergens op internet...
 
Beste Daan ,

Jou code had ik al eens geprobeerd (zoals in de eerste post is uitgelegd) maar deze werkt niet. Ik denk dat het probleem erin zit dat de gegevens in de cellen aan elkaar gelijk worden gesteld en niet gekopieerd c.q. overschreven. Dus dit werkt niet.

Ik wist echter niet dat kringverwijzingen instelbaar waren. Ik zal er eens naar kijken. Bedankt

M.v.g.
Peter
 
Beste Peter,

Ik heb nog even naar je eerste bericht gekeken, maar daarin staan twee verschillende kopieerbewerkingen:
de "lange" copy-code - die werkt maar traag is - kopieert uit bereik U3... naar L3...
de "korte" versie - die volgens jou niet werkt - kopieert precies andersom, namelijk van L3... naar U3...

Weet je zeker dat je de juiste "korte" versie hebt gebruikt?

Want zoals het in je eerste bericht staat is het niet goed, immers, in U3..etc staan de formules die het resultaat zijn van bewerkingen met waarden uit L3.. Dan moeten de formules in U3... niet overschreven worden met waarden uit bereik L3... zoals de "korte" code uit het voorbeeld doet.

Groet, Daan.

(Met L3... bedoel ik natuurlijk het hele bereik L3:O4002)
 
Beste Daan,

Helaas werkte het niet. Ik heb beide richtingen van kopieeren geprobeerd dus van u3 naar l3 en van l3 naar u3. (dus als code bv. .....

Set invoer = Range("U3:X2002")
Set uitvoer = Range("l3:o2002")

invoer = uitvoer.Value

en
uitvoer = invoer.value

Maar weer wordt er niets uitgerekend en zijn de formules weg.
Desondanks toch bedankt.
Groet Peter
 
Beste Peter,
Dat moet toch wel lukken hoor! Kijk eens in het bijgesloten bestand. Daarin heb ik een voorbeeld van de macro gezet (nog zonder uitzetten screenupdating etc.) en een voorbeeldje van het principe met kringverwijzing en itereren (=zonder macro).
Voor de "macro"-oplossing heb ik benoemde bereiken gebruikt.
Hopelijk heb je er toch wat aan.
Groet, Daan.
 

Bijlagen

Beste Daan ,

Bedankt voor alle moeite. Ik zie dat het bij jou macro werkt, maar ik begrijp niet echt waarom bij jou wel en bij mij niet. misschien kun je eens naar mijn excel file kijken en zo het probleem opsporen. Alleen krijg ik hem niet geupload, 100kb limiet. Ook na RAR is hij nog steeds 133kB. Misschien kan ik hem even mailen naar je ?

Alvast bedankt.

Groet Peter
 
Hoe kan ik jou mijn e-mailadres geven zonder dat dat meteen openbaar is?
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan