Just nu i M3-nätverket
Gå till innehåll

Enkel men snabb match


Axi

Rekommendera Poster

Längesedan jag vart härinne, men jag har stött på en problem med hastighet.

 

Jag har två columner placerade bredvid varandra.

Vissa värden i den högra kolumnen återfinns även i den vänstra.

 

Jag vill markera de celler i den högra kolumnen som inte har motsvarighet i den vänstra.

 

Antal rader = 85'000 * 2 kolumner = lite drygt 7200 Miljoner celler som ska jämföras.

Efter en första genomgång kommer jag kopiera lite celler, sen måste jag köra om igen.

 

Jag testade med Match, men får felmeddelande när jag ändrar till exakt match, jag tror det har att göra med att jag söker efter en range istället för ett värde, men jag vet inte om detta gör att göra på ett snabbare sätt.

Jag har testat countif, men den är lika slö. Find funkar snabbt, men hittar värden som en del av ett annant värde, vilket är fel.

 

Sub fe()
Dim myCell As Range
Dim Child As Range
Dim Parent As Range


Set Child = Sheet1.Range("c2", Sheet1.Range("c2").End(xlDown))
Set Parent = Sheet1.Range("b2", Sheet1.Range("b2").End(xlDown))


       For Each myCell In Child

       If WorksheetFunction.Match(myCell.Value, Parent, 1) > 0 Then
               myCell.Offset(0, 3) = 1

       End If

       Application.StatusBar = myCell.Row 'Håller koll på hur långt koden hunnit'
       Next myCell

End Sub

I princip så letar jag efter värdet "mycell" som jag dimmat som Range. Jag förstår att detta inte funkar, men jag har problem med att dimma mycell.value som string och använda det istället. Eller är jag helt fel ute? Finns det en enda förekomst så kan i pricip koden markera och avbryta sökningen och istället ta nästa värde.

Länk till kommentar
Dela på andra webbplatser

Några saker som kan snabba upp. kanske.

 

Först det självklara

Application.ScreenUpdating = False

Application.Calculation = xlCalculationManual

 

Missa INTE att återställa dessa när koden är klar, framförallt inte den sista. Den första återställs när koden slutat köra.

 

Använd Find. Med rätt syntax fungerar den som du önskar.

Sist, om detta inte räcker, kanske man kan vinna på att skriva till alla hittade celler i en operation men undrar om inte den operationer som krävs för att spara referensen tar mer tid än det man eventuellt sparar genom att skriva allt på en gång till bladet. Det är ju trots allt sökningen som tar tid.

Ja, något i stil med:

Sub fe()
Dim myCell As Range
Dim Child As Range
Dim Parent As Range

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

Set Child = Me.Range("c2", Me.Range("c2").End(xlDown))
Set Parent = Me.Range("b2", Me.Range("b2").End(xlDown))
For Each myCell In Child
   	If Parent.Find(myCell, lookat:=xlWhole) Is Nothing Then
       	myCell.Offset(0, 3) = 1
   	End If
   	If Int(myCell.Row / 500) = myCell.Row / 500 Then
       	Application.StatusBar = myCell.Row 'Håller koll på hur långt koden hunnit'
   	End If
Next myCell
StopTime = Time
Application.StatusBar = ""
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

End Sub

Samt det där med att skriva till statusfältet.

Testar över 10 000 rader med värden.

Med min begränsade skrivning till statusfält tar exekveringen grovt 10 sekunder.

Skriva efter varje sök, 14 sekunder.

Inte skriva alls, 9 sekunder.

Länk till kommentar
Dela på andra webbplatser

'xlwhole' naturligtvis. :rolleyes:

Alla lösningar är ju självklara när de löst problemet.

 

Att jag inte stängde av screenupdating var för att kolla min räknare, egentligen ville jag inte se hur långt den kommit utan hur sakta det gick. Gick det för slött så avbröt jag.

Jag har för mig att screenupdating=false även påverkar statusfältet, vilket verkar vara fallet med din kod med, men den gör jobbet och den gör det ruskigt snabbt. Jag är jättetacksam.

 

Din stegade räkning är mycket mer genomtänkt än min simpla med.

Tack för upplysningen med den med.

 

:thumbsup:

 

En fråga dock:

Application.Calculation = xlCalculationManual trodde inte jag skulle påverka i detta fallet. Varför gör den det? Eller är det bara för säkerhets skull som du lade till den?

Länk till kommentar
Dela på andra webbplatser

Application.Calculatio borde inte påverka om det inte finns celler i bladet som är beroende av de celler du skriver till men samtidigt är det aldrig fel att stänga av denna när man skriver till bladet i större omfattning.

 

 

Statusfältet uppdateras oavsett om ScreenUpdating är aktiverad eller ej.

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...