Reply
 
LinkBack Thread Tools Search this Thread Display Modes
  #1   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 11
Default Slow Looping


I'm trying to over come a problem of slow looping, I have 2 sheets both of
which have about 32,000 rows when I use a macro with loops it takes for ever
to find the entries that are on one sheet but not on another. I have tried
the formala below and have tried to adapt it to suit my needs but can not
get it to work. My two sheets have two columns and both of them havve to
match. In the example below I need to isolate the row with the xxxxxx
beside it. I has invoice numbers that are on the other sheet and the same
amount but the combination of invoice number and amount is unique. All the
other pairs have a match on the other sheet. Any help would be greatly
appreciatied.


=IF(COUNTIF($A$1:$A$10,B1)=0,B1,"")





sheet1 sheet 2

inv number amount invoice no amount


104546 $ 250.25 154265 $ 4,625.00
451567 $ 1,000.25 254256 $ 1,456.45
254256 $ 1,456.45 451567 $ 25.60
451453 $ 65,452.00 XXXXXXX 154265 $ 25.60 XXXXX
654245 $ 450.96 451453 $ 65,452.00
324154 $ 6,542.25 654245 $ 450.96
154265 $ 4,625.00 104546 $ 250.25
451567 $ 25.60 324154 $ 6,542.25
654245 $ 1,456.20 654245 $ 1,456.20
254256 $ 250.25 254256 $ 250.25
324154 $ 1,000.25 451567 $ 1,000.25
451567 $ 25.60 324154 $ 1,000.25
451567 $ 25.60



Matt



  #2   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 1,236
Default Slow Looping

Matt,

I can think of quicker ways. Merging, Sorting, etc.. But here's the quick
and ugly. Not sure how it'll perform over 32000 rows - probably poorly.

Assumes data is in columns A and B and that XXXXX is written to column C

Sub testit()
Dim wksS As Worksheet, wksD As Worksheet
Dim i As Long, j As Long, lngLastRowS As Long, lngLastRowD As Long
Dim blnFound As Boolean

Set wksS = Sheet2
Set wksD = Sheet1

lngLastRowS = wksS.Cells(Rows.Count, 1).End(xlUp).Row
lngLastRowD = wksD.Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To lngLastRowS
blnFound = False
For j = 1 To lngLastRowD
If wksS.Cells(i, 1) = wksD.Cells(j, 1) And wksS.Cells(i, 2) =
wksD.Cells(j, 2) Then
blnFound = True
Exit For
End If
Next
If Not blnFound Then wksS.Cells(i, 3) = "XXXXX"
Next
End Sub

Rob


"Matt" wrote in message
...

I'm trying to over come a problem of slow looping, I have 2 sheets both

of
which have about 32,000 rows when I use a macro with loops it takes for

ever
to find the entries that are on one sheet but not on another. I have

tried
the formala below and have tried to adapt it to suit my needs but can not
get it to work. My two sheets have two columns and both of them havve to
match. In the example below I need to isolate the row with the xxxxxx
beside it. I has invoice numbers that are on the other sheet and the same
amount but the combination of invoice number and amount is unique. All the
other pairs have a match on the other sheet. Any help would be greatly
appreciatied.


=IF(COUNTIF($A$1:$A$10,B1)=0,B1,"")





sheet1 sheet 2

inv number amount invoice no amount


104546 $ 250.25 154265 $ 4,625.00
451567 $ 1,000.25 254256 $ 1,456.45
254256 $ 1,456.45 451567 $ 25.60
451453 $ 65,452.00 XXXXXXX 154265 $ 25.60 XXXXX
654245 $ 450.96 451453 $ 65,452.00
324154 $ 6,542.25 654245 $ 450.96
154265 $ 4,625.00 104546 $ 250.25
451567 $ 25.60 324154 $ 6,542.25
654245 $ 1,456.20 654245 $ 1,456.20
254256 $ 250.25 254256 $ 250.25
324154 $ 1,000.25 451567 $ 1,000.25
451567 $ 25.60 324154 $ 1,000.25
451567 $ 25.60



Matt





  #3   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 21
Default Slow Looping

Saw the reply, and tested it - you could try this (which
is much quicker - probably because it is not setting the
boolean to false for each row - but might not be better).

Sub Test2()
Dim iLast_Row As Integer
Dim j As Long

iLast_Row = 32000

For j = 1 To iLast_Row
Application.StatusBar = "Row " & j
If Worksheets("Sheet1").Cells(j, 1) = Worksheets
("Sheet2").Cells(j, 1) And Worksheets("Sheet1").Cells(j,
2) = Worksheets("Sheet2").Cells(j, 2) Then
GoTo skip_it
Else
Worksheets("Sheet2").Cells(j, 3).Value = "XXXXX"
End If
skip_it:
Next

End Sub

-----Original Message-----
Matt,

I can think of quicker ways. Merging, Sorting, etc.. But

here's the quick
and ugly. Not sure how it'll perform over 32000 rows -

probably poorly.

Assumes data is in columns A and B and that XXXXX is

written to column C

Sub testit()
Dim wksS As Worksheet, wksD As Worksheet
Dim i As Long, j As Long, lngLastRowS As Long,

lngLastRowD As Long
Dim blnFound As Boolean

Set wksS = Sheet2
Set wksD = Sheet1

lngLastRowS = wksS.Cells(Rows.Count, 1).End(xlUp).Row
lngLastRowD = wksD.Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To lngLastRowS
blnFound = False
For j = 1 To lngLastRowD
If wksS.Cells(i, 1) = wksD.Cells(j, 1) And

wksS.Cells(i, 2) =
wksD.Cells(j, 2) Then
blnFound = True
Exit For
End If
Next
If Not blnFound Then wksS.Cells(i, 3) = "XXXXX"
Next
End Sub

Rob


"Matt" wrote in message
...

I'm trying to over come a problem of slow looping, I

have 2 sheets both
of
which have about 32,000 rows when I use a macro with

loops it takes for
ever
to find the entries that are on one sheet but not on

another. I have
tried
the formala below and have tried to adapt it to suit my

needs but can not
get it to work. My two sheets have two columns and

both of them havve to
match. In the example below I need to isolate the row

with the xxxxxx
beside it. I has invoice numbers that are on the other

sheet and the same
amount but the combination of invoice number and amount

is unique. All the
other pairs have a match on the other sheet. Any help

would be greatly
appreciatied.


=IF(COUNTIF($A$1:$A$10,B1)=0,B1,"")





sheet1 sheet 2

inv number amount invoice no amount


104546 $ 250.25 154265 $ 4,625.00
451567 $ 1,000.25 254256 $ 1,456.45
254256 $ 1,456.45 451567 $ 25.60
451453 $ 65,452.00 XXXXXXX 154265 $

25.60 XXXXX
654245 $ 450.96 451453 $ 65,452.00
324154 $ 6,542.25 654245 $ 450.96
154265 $ 4,625.00 104546 $ 250.25
451567 $ 25.60 324154 $ 6,542.25
654245 $ 1,456.20 654245 $ 1,456.20
254256 $ 250.25 254256 $ 250.25
324154 $ 1,000.25 451567 $ 1,000.25
451567 $ 25.60 324154 $ 1,000.25
451567 $ 25.60



Matt





.

  #4   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 11
Default Slow Looping


Hi Alan

I don't think one loop will do it. Perhaps I should I stated that there are
about 30,000 rows on one sheet and about 32,000 rows on the other. And the
match ups are not on the same row.

thanks
Matt.

"Alan Hutchins" wrote in message
...
Saw the reply, and tested it - you could try this (which
is much quicker - probably because it is not setting the
boolean to false for each row - but might not be better).

Sub Test2()
Dim iLast_Row As Integer
Dim j As Long

iLast_Row = 32000

For j = 1 To iLast_Row
Application.StatusBar = "Row " & j
If Worksheets("Sheet1").Cells(j, 1) = Worksheets
("Sheet2").Cells(j, 1) And Worksheets("Sheet1").Cells(j,
2) = Worksheets("Sheet2").Cells(j, 2) Then
GoTo skip_it
Else
Worksheets("Sheet2").Cells(j, 3).Value = "XXXXX"
End If
skip_it:
Next

End Sub

-----Original Message-----
Matt,

I can think of quicker ways. Merging, Sorting, etc.. But

here's the quick
and ugly. Not sure how it'll perform over 32000 rows -

probably poorly.

Assumes data is in columns A and B and that XXXXX is

written to column C

Sub testit()
Dim wksS As Worksheet, wksD As Worksheet
Dim i As Long, j As Long, lngLastRowS As Long,

lngLastRowD As Long
Dim blnFound As Boolean

Set wksS = Sheet2
Set wksD = Sheet1

lngLastRowS = wksS.Cells(Rows.Count, 1).End(xlUp).Row
lngLastRowD = wksD.Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To lngLastRowS
blnFound = False
For j = 1 To lngLastRowD
If wksS.Cells(i, 1) = wksD.Cells(j, 1) And

wksS.Cells(i, 2) =
wksD.Cells(j, 2) Then
blnFound = True
Exit For
End If
Next
If Not blnFound Then wksS.Cells(i, 3) = "XXXXX"
Next
End Sub

Rob


"Matt" wrote in message
...

I'm trying to over come a problem of slow looping, I

have 2 sheets both
of
which have about 32,000 rows when I use a macro with

loops it takes for
ever
to find the entries that are on one sheet but not on

another. I have
tried
the formala below and have tried to adapt it to suit my

needs but can not
get it to work. My two sheets have two columns and

both of them havve to
match. In the example below I need to isolate the row

with the xxxxxx
beside it. I has invoice numbers that are on the other

sheet and the same
amount but the combination of invoice number and amount

is unique. All the
other pairs have a match on the other sheet. Any help

would be greatly
appreciatied.


=IF(COUNTIF($A$1:$A$10,B1)=0,B1,"")





sheet1 sheet 2

inv number amount invoice no amount


104546 $ 250.25 154265 $ 4,625.00
451567 $ 1,000.25 254256 $ 1,456.45
254256 $ 1,456.45 451567 $ 25.60
451453 $ 65,452.00 XXXXXXX 154265 $

25.60 XXXXX
654245 $ 450.96 451453 $ 65,452.00
324154 $ 6,542.25 654245 $ 450.96
154265 $ 4,625.00 104546 $ 250.25
451567 $ 25.60 324154 $ 6,542.25
654245 $ 1,456.20 654245 $ 1,456.20
254256 $ 250.25 254256 $ 250.25
324154 $ 1,000.25 451567 $ 1,000.25
451567 $ 25.60 324154 $ 1,000.25
451567 $ 25.60



Matt





.



  #5   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 11
Default Slow Looping

Hi Ron

That is the roughly the code I am using at the minute but as I said I takes
for ever. Your suggesting of sorting may have something in it. Perhaps I
could sort and delete matching rows as I go, maybe that would be faster. I
don't know I am not an expert at VBA and always end up with problems when I
delete rows. Although I not conviced that it cant be done with formulas as
on Chip Peasons page and they are so much faster.

Thanks
Matt



"Rob van Gelder" wrote in message
...
Matt,

I can think of quicker ways. Merging, Sorting, etc.. But here's the quick
and ugly. Not sure how it'll perform over 32000 rows - probably poorly.

Assumes data is in columns A and B and that XXXXX is written to column C

Sub testit()
Dim wksS As Worksheet, wksD As Worksheet
Dim i As Long, j As Long, lngLastRowS As Long, lngLastRowD As Long
Dim blnFound As Boolean

Set wksS = Sheet2
Set wksD = Sheet1

lngLastRowS = wksS.Cells(Rows.Count, 1).End(xlUp).Row
lngLastRowD = wksD.Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To lngLastRowS
blnFound = False
For j = 1 To lngLastRowD
If wksS.Cells(i, 1) = wksD.Cells(j, 1) And wksS.Cells(i, 2) =
wksD.Cells(j, 2) Then
blnFound = True
Exit For
End If
Next
If Not blnFound Then wksS.Cells(i, 3) = "XXXXX"
Next
End Sub

Rob


"Matt" wrote in message
...

I'm trying to over come a problem of slow looping, I have 2 sheets both

of
which have about 32,000 rows when I use a macro with loops it takes for

ever
to find the entries that are on one sheet but not on another. I have

tried
the formala below and have tried to adapt it to suit my needs but can

not
get it to work. My two sheets have two columns and both of them havve

to
match. In the example below I need to isolate the row with the xxxxxx
beside it. I has invoice numbers that are on the other sheet and the

same
amount but the combination of invoice number and amount is unique. All

the
other pairs have a match on the other sheet. Any help would be greatly
appreciatied.


=IF(COUNTIF($A$1:$A$10,B1)=0,B1,"")





sheet1 sheet 2

inv number amount invoice no amount


104546 $ 250.25 154265 $ 4,625.00
451567 $ 1,000.25 254256 $ 1,456.45
254256 $ 1,456.45 451567 $ 25.60
451453 $ 65,452.00 XXXXXXX 154265 $ 25.60 XXXXX
654245 $ 450.96 451453 $ 65,452.00
324154 $ 6,542.25 654245 $ 450.96
154265 $ 4,625.00 104546 $ 250.25
451567 $ 25.60 324154 $ 6,542.25
654245 $ 1,456.20 654245 $ 1,456.20
254256 $ 250.25 254256 $ 250.25
324154 $ 1,000.25 451567 $ 1,000.25
451567 $ 25.60 324154 $ 1,000.25
451567 $ 25.60



Matt









  #6   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 1,236
Default Slow Looping

Matt,

Hopefully you're still around.. Your last post was a couple of days ago.

I've come across a function I've never seen before (and never had a need
for): ColumnDifferences.
Seeing it's potential for lookups, I thought again about your lookup
problem, and rewrote the solution.

I've no idea how quick it runs against 1000s of rows. I'm concerned that
the writing to Cells will be slow. Hopefully the lookup speed will help.

Would you please let me know how things go?


Sub testit()
Dim rng As Range, lngLastRow As Long, i As Long
Dim rngSource As Range, rngCompare As Range, rngResult As Range

With Sheet2
Set rngSource = .Cells(1, 1).Resize(.Cells(Rows.Count,
1).End(xlUp).Row, 2)
End With

With Sheet1
.Rows(1).Insert
Set rngCompare = .Cells(1, 1).Resize(.Cells(Rows.Count,
1).End(xlUp).Row, 2)

For Each rng In rngSource.Rows
.Cells(1, 1) = rng.Cells(1, 1)
.Cells(1, 2) = rng.Cells(1, 2)
On Error Resume Next
Set rngResult = AntiRange(rngCompare.Columns(1),
rngCompare.Columns(1).ColumnDifferences(.Cells(1, 1))).Offset(0, 1)
rngResult.Find rngResult.Cells(1, 1)
If Not Intersect(rngResult.FindNext, rngResult.Cells(1, 1)) Is
Nothing Then rng.Cells(1, 3).Value = "xXxXx"
Next
.Rows(1).Delete
End With
End Sub

'AntiRange of Jim Rech - MessageID:

Function AntiRange(BigRg As Range, SmallRg As Range) As Range
Dim NewRg As Range, CurrCell As Range
For Each CurrCell In BigRg.Cells
If Intersect(CurrCell, SmallRg) Is Nothing Then
If NewRg Is Nothing Then
Set NewRg = CurrCell
Else
Set NewRg = Union(NewRg, CurrCell)
End If
End If
Next
Set AntiRange = NewRg
End Function


Rob



"Matt" wrote in message
...
Hi Ron

That is the roughly the code I am using at the minute but as I said I

takes
for ever. Your suggesting of sorting may have something in it. Perhaps I
could sort and delete matching rows as I go, maybe that would be faster. I
don't know I am not an expert at VBA and always end up with problems when

I
delete rows. Although I not conviced that it cant be done with formulas

as
on Chip Peasons page and they are so much faster.

Thanks
Matt



"Rob van Gelder" wrote in message
...
Matt,

I can think of quicker ways. Merging, Sorting, etc.. But here's the

quick
and ugly. Not sure how it'll perform over 32000 rows - probably poorly.

Assumes data is in columns A and B and that XXXXX is written to column C

Sub testit()
Dim wksS As Worksheet, wksD As Worksheet
Dim i As Long, j As Long, lngLastRowS As Long, lngLastRowD As Long
Dim blnFound As Boolean

Set wksS = Sheet2
Set wksD = Sheet1

lngLastRowS = wksS.Cells(Rows.Count, 1).End(xlUp).Row
lngLastRowD = wksD.Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To lngLastRowS
blnFound = False
For j = 1 To lngLastRowD
If wksS.Cells(i, 1) = wksD.Cells(j, 1) And wksS.Cells(i, 2)

=
wksD.Cells(j, 2) Then
blnFound = True
Exit For
End If
Next
If Not blnFound Then wksS.Cells(i, 3) = "XXXXX"
Next
End Sub

Rob


"Matt" wrote in message
...

I'm trying to over come a problem of slow looping, I have 2 sheets

both
of
which have about 32,000 rows when I use a macro with loops it takes

for
ever
to find the entries that are on one sheet but not on another. I have

tried
the formala below and have tried to adapt it to suit my needs but can

not
get it to work. My two sheets have two columns and both of them havve

to
match. In the example below I need to isolate the row with the xxxxxx
beside it. I has invoice numbers that are on the other sheet and the

same
amount but the combination of invoice number and amount is unique. All

the
other pairs have a match on the other sheet. Any help would be

greatly
appreciatied.


=IF(COUNTIF($A$1:$A$10,B1)=0,B1,"")





sheet1 sheet 2

inv number amount invoice no amount


104546 $ 250.25 154265 $ 4,625.00
451567 $ 1,000.25 254256 $ 1,456.45
254256 $ 1,456.45 451567 $ 25.60
451453 $ 65,452.00 XXXXXXX 154265 $ 25.60 XXXXX
654245 $ 450.96 451453 $ 65,452.00
324154 $ 6,542.25 654245 $ 450.96
154265 $ 4,625.00 104546 $ 250.25
451567 $ 25.60 324154 $ 6,542.25
654245 $ 1,456.20 654245 $ 1,456.20
254256 $ 250.25 254256 $ 250.25
324154 $ 1,000.25 451567 $ 1,000.25
451567 $ 25.60 324154 $ 1,000.25
451567 $ 25.60



Matt









Reply
Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules

Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On


Similar Threads
Thread Thread Starter Forum Replies Last Post
Slow Excel Navigation with Up / Down Arrow and slow scrolling deddog Excel Discussion (Misc queries) 0 August 14th 07 09:56 PM
Looping David T Excel Discussion (Misc queries) 2 August 30th 06 10:51 PM
Slow Looping Matt[_21_] Excel Programming 4 December 22nd 03 08:53 AM
Looping Andrew Clark[_2_] Excel Programming 1 December 20th 03 05:01 PM
Looping Syd[_4_] Excel Programming 1 December 11th 03 11:17 PM


All times are GMT +1. The time now is 12:50 PM.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright ©2004-2024 ExcelBanter.
The comments are property of their posters.
 

About Us

"It's about Microsoft Excel"