Hej varför hämtar den inte ca: 1/3 av cellerna från filen EABnyaPriser.xls Koden är väldigt rörig och det är därför svårt att se vad det är frågan om. Tack för tipsen, Sorteringen fixar du genom att först skapa en ny kolumn SortOrder, där du skriver i 1,2, osv. Sen sorterar du etc. enligt tidigare kommentar. När allt är klart sorterar du på kolumnen SortOrder. Niklas, Det var inte integer som var problemet, det var att 10000 var hårdkodat som den översta gränsen.VBA suger 100% CPU och hoppar över lästa celler
Loop rad skall stega upp 1 rad i excels primärdokument,
Loop rad2 skall söka igenom hela EABnyaPriser.xls för att få träff på artikelnumret som den läst i primärdokumentet,
Vid träff på numret skall priset hämtas från EABnyapriser.xls till pris cellen i primärdokumentet.
När jag lagt in en räknare så verkar det som att den får träff på artikelnumret men priset hämtas aldrig över till primärdokumentet.
Dokumenten innehåller drygt 8000 excelrader vardera.
Vad är det för fel ?
Här är programsnutten, jag har remarkat de nedre raderna som inte behövs.
Dessutom går programmet så segt att Excel till och från lägger av och startar upp igen, den slukar på direkte 100 procent cpu-kraft
PS! när jag klipper ur 25 rader i vardera worksheeten och kör dessa 25, verkar det fungera klickrent, även när jag kör med F8 manuellt verkar det fungera, jag fattar ingenting.
Private Sub kopiera1_Click()
Dim rad As Integer
Dim rad2 As Integer
For rad = 1 To Range("BB10000").End(xlUp).Row
A2 = 0
For rad2 = 1 To 8271
If Range("BB" & rad) = Workbooks("EABnyaPriser.xls").Worksheets(1).Range("A" & rad2) Then
Range("AY" & rad) = Workbooks("EABnyaPriser.xls").Worksheets(1).Range("F" & rad2)
Range("BG" & rad) = Workbooks("EABnyaPriser.xls").Worksheets(1).Range("G" & rad2)
A2 = A2 + 1
ElseIf A2 < 1 And rad2 = 8271 Then
Rem Range("AY" & rad) = "saknas"
Rem Range("AY" & rad + 10020) = Workbooks("EABnyaPriser.xls").Worksheets(1).Range("F" & rad)
Rem Range("BB" & rad + 10020) = Workbooks("EABnyaPriser.xls").Worksheets(1).Range("A" & rad)
Rem Range("C" & rad + 10020) = Workbooks("EABnyaPriser.xls").Worksheets(1).Range("B" & rad)
Rem Range("E" & rad + 10020) = Workbooks("EABnyaPriser.xls").Worksheets(1).Range("G" & rad)
End If
Next rad2
Next rad
End SubSv: VBA suger 100% CPU och hoppar över lästa celler
Men några uppenbara kommentarer:
1. Det mest troliga felet är att något är skumt med "A2"-grejen. Men eftersom den heter A2 så har jag ingen aning om vad det är eller syftet...
2. Det näst mest troliga felet är att du har rader längre ner än 10000, och att det finns ett hål någonstans i listan.
3. Att det tar sån tid beror på att du har så inihelvete stora loopar. Potentiellt 8271*10000= 82 miljoner jämförelser, och dessutom massa tunga cellreferenser.
4. Du bör absolut inte använda Range("BB" & ...), det lämpliga är att köra med .cells(rad, "BB") eller helst "BB" uttryckt som kolumnpositionen.
5. Använd aldrig Rem. Kör i så fall med '
6. Använd aldrig en fast siffra, såsom 8271, om det ska användas i mer än ett sammanhang.
7. Referera till worksheets en enda gång.
Så, till att börja med:
<code>
Private Sub kopiera1_Click()
Dim rad As Integer
Dim rad2 As Integer
Dim ws as Worksheet
Set ws = Workbooks("EABnyaPriser.xls").Worksheets(1)
For rad = 1 To Range("BB65535").End(xlUp).Row
A2 = 0
For rad2 = 1 To 8271
If Cells(rad, "BB") = ws.Cells(rad2, "A") Then
Cells(rad, "AY") = ws.Cells(rad2, "F")
Cells(rad, "BG") = ws.Cells(rad2, "G")
A2 = A2 + 1
End If
Next rad2
Next rad
End Sub
</code>
Nu är det ju plötsligt möjligt att läsa koden... Och även att debugga.
För att snabba upp det nu finns det två sätt:
1. Använd excels inbyggda funktion Range.Find för att hitta matchningar.
2. Sortera båda listorna först, och ha bara en loop. Det innebär att du måste hålla två variabler som får gå "i synk". Detta ger i allmänhet den högsta prestandavinsten.
Om du måste ha dem i ursprunglig ordning efteråt är det också lätt att fixa. Kommer du inte på hur, kan du fråga.Sv:VBA suger 100% CPU och hoppar över lästa celler
Jag vill helst inte röra dokumenten sorteringsmässigt.
A2 är bara en true eller false för att känna av om man skall skriva artikeln saknas eller lägga till en artikel som saknas, bara en tillfällig grej, det är lika om jag tar bort A2 historien.
Jag verkar inte ha några hål, har kollat alla rader och checkat hur långt den sätter loop värdet och det verkar stämma.
Som sagt att bara peta på filöppning en gång som du säger verkar intressant.Sv: VBA suger 100% CPU och hoppar över lästa celler
Problemet har då förmodligen att göra med mellanrum före och efter, och gemener/versaler. Prova att köra trim(ucase(...)) på båda sidor i jämförelsen.
Annars får du kolla vilka rader som inte kommer med, och sen ta in en liten mängd rader, där just de ingår, stega igenom och se varför de inte kommer med.Sv:VBA suger 100% CPU och hoppar över lästa celler
Om rad o rad2 deklareras som Long istället för Integer så blir det inga problem om antalet överstiger ca 32000 rader. Oavsett det så går det litet snabbare med Long istället för med Integer.
(I övrigt så får vi något att "bita" i när Excel 2007 används och där någon säger jag har 895000 rader!)
Mvh
DennisSv: VBA suger 100% CPU och hoppar över lästa celler