Reply
 
LinkBack Thread Tools Search this Thread Display Modes
  #1   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 9
Default Help with slow Macro

Hi there,
I have created a Macro that is performing very slowly, its task is this:

Label Cell F2 as Duplicate
Insert Formula into F3 to check if there are duplicates of A3
Copy this formula to all other cells in F
Insert conditional format on F3 to change to red background when cell is
true
Sort sheet by F Desc, A Asc

Here is my macro, can anyone see anything obviously wrong with it? I
made it by recording my actions.

Sub FindDuplicates()
'
' FindDuplicates Macro
' Macro recorded 30/10/2008 by ACLHW103
'

'
Range("F2").Select
ActiveCell.FormulaR1C1 = "Duplicate"
With ActiveCell.Characters(Start:=1, Length:=9).Font
.Name = "Arial"
.FontStyle = "Bold"
.Size = 10
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With
Range("F3").Select
ActiveCell.FormulaR1C1 = "=COUNTIF(C[-5],RC[-5])1"
Range("F3").Select
Selection.Copy
Range("F3:F4").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Range("F3").Select
Application.CutCopyMode = False
Selection.FormatConditions.Delete
Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
"=COUNTIF(A:A,A3)1"
Selection.FormatConditions(1).Interior.ColorIndex = 3
Selection.Copy
Range("F3:F4").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Rows("2:2").Select
Range(Selection, Selection.End(xlDown)).Select
Application.CutCopyMode = False
Selection.Sort Key1:=Range("F3"), Order1:=xlDescending,
Key2:=Range("A3") _
, Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1,
MatchCase:= _
False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal,
DataOption2 _
:=xlSortNormal
Application.WindowState = xlMinimized
End Sub

Cheers,

Steve
  #2   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 9
Default Help with slow Macro

Dooza wrote:
Hi there,
I have created a Macro that is performing very slowly, its task is this:

Label Cell F2 as Duplicate
Insert Formula into F3 to check if there are duplicates of A3
Copy this formula to all other cells in F
Insert conditional format on F3 to change to red background when cell is
true
Sort sheet by F Desc, A Asc


I have just realised that the formula is copied into rows that don't
have data, and goes to the maximum number of rows, which is why its
taking so long.

My worksheet has a title row, then a header row. The data is going to
change everytime this worksheet is used, so the number of rows will be
different. How do I make the macro select just the rows that have data
in them?

Cheers,

Steve
  #3   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 9,101
Default Help with slow Macro

It is more probable that the screen updating or events are slowing down the
code

Looking at rows with data will probably slow the code down more not less. I
rewrote the code the way that I normally writte code. There were some
duplicate statement that were being executed because you didn't use
intermediate variables. Intermediate variable don't slow down the code. It
makes it easy to undersand and can remove duplicate code.

Sub FindDuplicates()
'
' FindDuplicates Macro
' Macro recorded 30/10/2008 by ACLHW103
'

Application.ScreenUpdating = False
Application.EnableEvents = False

'
with Range("F2")
.FormulaR1C1 = "Duplicate"
.Characters(Start:=1, Length:=9).Font
.Name = "Arial"
.FontStyle = "Bold"
.Size = 10
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With

with Range("F3")
.FormulaR1C1 = "=COUNTIF(C[-5],RC[-5])1"
.Copy
set LastCells =Range("F3:F4").End(xlDown)
set PasteRange = Range(., LastCells)

PasteRange.PasteSpecial _
Paste:=xlPasteFormulas, _
Operation:=xlNone, _
SkipBlanks:=False, _
Transpose:=False

Application.CutCopyMode = False
.FormatConditions.Delete
.FormatConditions.Add _
Type:=xlExpression, _
Formula1:= "=COUNTIF(A:A,A3)1"
.FormatConditions(1).Interior.ColorIndex = 3
.Copy
PasteRange.PasteSpecial _
Paste:=xlPasteFormats, _
Operation:=xlNone, _
SkipBlanks:=False, _
Transpose:=False
end with

LastRow = Rows("2:2").Range(Selection, Selection.End(xlDown)).Row
Application.CutCopyMode = False
set SortRange = Rows("2:" & LastRow)
SortRange.Sort _
Key1:=Range("F3"), _
Order1:=xlDescending, _
Key2:=Range("A3"), _
Order2:=xlAscending, _
Header:=xlGuess, _
OrderCustom:=1,
MatchCase:= False, _
Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal, _
DataOption2:=xlSortNormal
Application.WindowState = xlMinimized

Application.ScreenUpdating = False
Application.EnableEvents = False

End Sub


"Dooza" wrote:

Dooza wrote:
Hi there,
I have created a Macro that is performing very slowly, its task is this:

Label Cell F2 as Duplicate
Insert Formula into F3 to check if there are duplicates of A3
Copy this formula to all other cells in F
Insert conditional format on F3 to change to red background when cell is
true
Sort sheet by F Desc, A Asc


I have just realised that the formula is copied into rows that don't
have data, and goes to the maximum number of rows, which is why its
taking so long.

My worksheet has a title row, then a header row. The data is going to
change everytime this worksheet is used, so the number of rows will be
different. How do I make the macro select just the rows that have data
in them?

Cheers,

Steve

  #4   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 9
Default Help with slow Macro

Joel wrote:
It is more probable that the screen updating or events are slowing down the
code

Looking at rows with data will probably slow the code down more not less. I
rewrote the code the way that I normally writte code. There were some
duplicate statement that were being executed because you didn't use
intermediate variables. Intermediate variable don't slow down the code. It
makes it easy to undersand and can remove duplicate code.


Hi Joel,
Thank you very much for looking at my problem for me. Whilst its not
worked, its a start.

Sub FindDuplicates()
'
' FindDuplicates Macro
' Macro recorded 30/10/2008 by ACLHW103
'

Application.ScreenUpdating = False
Application.EnableEvents = False

'
with Range("F2")
.FormulaR1C1 = "Duplicate"
.Characters(Start:=1, Length:=9).Font


Invalid use of property is the error I get at this point.

.Name = "Arial"
.FontStyle = "Bold"
.Size = 10
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With

with Range("F3")
.FormulaR1C1 = "=COUNTIF(C[-5],RC[-5])1"
.Copy
set LastCells =Range("F3:F4").End(xlDown)
set PasteRange = Range(., LastCells)


Syntax error is what I get here if I change the first bit back to the
way I had it before.

PasteRange.PasteSpecial _
Paste:=xlPasteFormulas, _
Operation:=xlNone, _
SkipBlanks:=False, _
Transpose:=False

Application.CutCopyMode = False
.FormatConditions.Delete
.FormatConditions.Add _
Type:=xlExpression, _
Formula1:= "=COUNTIF(A:A,A3)1"
.FormatConditions(1).Interior.ColorIndex = 3
.Copy
PasteRange.PasteSpecial _
Paste:=xlPasteFormats, _
Operation:=xlNone, _
SkipBlanks:=False, _
Transpose:=False
end with

LastRow = Rows("2:2").Range(Selection, Selection.End(xlDown)).Row
Application.CutCopyMode = False
set SortRange = Rows("2:" & LastRow)
SortRange.Sort _
Key1:=Range("F3"), _
Order1:=xlDescending, _
Key2:=Range("A3"), _
Order2:=xlAscending, _
Header:=xlGuess, _
OrderCustom:=1,


There was an error here due to a missing _

MatchCase:= False, _
Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal, _
DataOption2:=xlSortNormal
Application.WindowState = xlMinimized

Application.ScreenUpdating = False
Application.EnableEvents = False

End Sub


This is my first attempt at macro's, I really don't have a clue, but I
am trying.

Thanks for the help so far!

Steve
  #5   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 9,101
Default Help with slow Macro

I thought that would work.

from
Set PasteRange = Range(., LastCells)

to
Set PasteRange = Range(Range("F3"), LastCells)


"Dooza" wrote:

Joel wrote:
It is more probable that the screen updating or events are slowing down the
code

Looking at rows with data will probably slow the code down more not less. I
rewrote the code the way that I normally writte code. There were some
duplicate statement that were being executed because you didn't use
intermediate variables. Intermediate variable don't slow down the code. It
makes it easy to undersand and can remove duplicate code.


Hi Joel,
Thank you very much for looking at my problem for me. Whilst its not
worked, its a start.

Sub FindDuplicates()
'
' FindDuplicates Macro
' Macro recorded 30/10/2008 by ACLHW103
'

Application.ScreenUpdating = False
Application.EnableEvents = False

'
with Range("F2")
.FormulaR1C1 = "Duplicate"
.Characters(Start:=1, Length:=9).Font


Invalid use of property is the error I get at this point.

.Name = "Arial"
.FontStyle = "Bold"
.Size = 10
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With

with Range("F3")
.FormulaR1C1 = "=COUNTIF(C[-5],RC[-5])1"
.Copy
set LastCells =Range("F3:F4").End(xlDown)
set PasteRange = Range(., LastCells)


Syntax error is what I get here if I change the first bit back to the
way I had it before.

PasteRange.PasteSpecial _
Paste:=xlPasteFormulas, _
Operation:=xlNone, _
SkipBlanks:=False, _
Transpose:=False

Application.CutCopyMode = False
.FormatConditions.Delete
.FormatConditions.Add _
Type:=xlExpression, _
Formula1:= "=COUNTIF(A:A,A3)1"
.FormatConditions(1).Interior.ColorIndex = 3
.Copy
PasteRange.PasteSpecial _
Paste:=xlPasteFormats, _
Operation:=xlNone, _
SkipBlanks:=False, _
Transpose:=False
end with

LastRow = Rows("2:2").Range(Selection, Selection.End(xlDown)).Row
Application.CutCopyMode = False
set SortRange = Rows("2:" & LastRow)
SortRange.Sort _
Key1:=Range("F3"), _
Order1:=xlDescending, _
Key2:=Range("A3"), _
Order2:=xlAscending, _
Header:=xlGuess, _
OrderCustom:=1,


There was an error here due to a missing _

MatchCase:= False, _
Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal, _
DataOption2:=xlSortNormal
Application.WindowState = xlMinimized

Application.ScreenUpdating = False
Application.EnableEvents = False

End Sub


This is my first attempt at macro's, I really don't have a clue, but I
am trying.

Thanks for the help so far!

Steve



  #6   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 9
Default Help with slow Macro

Joel wrote:
I thought that would work.

from
Set PasteRange = Range(., LastCells)

to
Set PasteRange = Range(Range("F3"), LastCells)


Thats got that part working, but its still filling 65536 rows, not just
the ones that have data. Any way to stop it?

Cheers,

Steve
  #7   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 9,101
Default Help with slow Macro

You need to use xlup starting at 65536 not xldown. Rows.count = 65536

Sub FindDuplicates()
'
' FindDuplicates Macro
' Macro recorded 30/10/2008 by ACLHW103
'

Application.ScreenUpdating = False
Application.EnableEvents = False

'
With Range("F2")
.FormulaR1C1 = "Duplicate"
.Characters(Start:=1, Length:=9).Font
.Name = "Arial"
.FontStyle = "Bold"
.Size = 10
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With

With Range("F3")
.FormulaR1C1 = "=COUNTIF(C[-5],RC[-5])1"
.Copy
Set LastCells = Range("F" & Rows.Count).End(xlUp)
Set PasteRange = Range(Range("F3"), LastCells)

PasteRange.PasteSpecial _
Paste:=xlPasteFormulas, _
Operation:=xlNone, _
SkipBlanks:=False, _
Transpose:=False

Application.CutCopyMode = False
.FormatConditions.Delete
.FormatConditions.Add _
Type:=xlExpression, _
Formula1:="=COUNTIF(A:A,A3)1"
.FormatConditions(1).Interior.ColorIndex = 3
.Copy
PasteRange.PasteSpecial _
Paste:=xlPasteFormats, _
Operation:=xlNone, _
SkipBlanks:=False, _
Transpose:=False
End With

Application.CutCopyMode = False
Set SortRange = Rows("3:" & LastRow)
SortRange.Sort _
Key1:=Range("F3"), _
Order1:=xlDescending, _
Key2:=Range("A3"), _
Order2:=xlAscending, _
Header:=xlno, _
OrderCustom:=1, _
MatchCase:=False, _
Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal, _
DataOption2:=xlSortNormal
Application.WindowState = xlMinimized

Application.ScreenUpdating = True
Application.EnableEvents = True

End Sub


"Dooza" wrote:

Joel wrote:
I thought that would work.

from
Set PasteRange = Range(., LastCells)

to
Set PasteRange = Range(Range("F3"), LastCells)


Thats got that part working, but its still filling 65536 rows, not just
the ones that have data. Any way to stop it?

Cheers,

Steve

  #8   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 9
Default Help with slow Macro

Hi Joel,
Thanks again for the help, I feel we are close, but am getting a type
mismatch error after this line:

Set SortRange = Rows("3:" & LastRow)


Whats strange is that when going back to the worksheet, the first cell
has been created, but its not been copied. The part of the code where
its failing is the sorting part, so I would have expected the copy to
have happened already.

Steve
  #9   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 9,101
Default Help with slow Macro

from
Set SortRange = Rows("3:" & LastRow)
to
Set SortRange = Rows("3:" & LastCells.Row)

I simplified the code and forgot I eliminate the LastRow variable.

"Dooza" wrote:

Hi Joel,
Thanks again for the help, I feel we are close, but am getting a type
mismatch error after this line:

Set SortRange = Rows("3:" & LastRow)


Whats strange is that when going back to the worksheet, the first cell
has been created, but its not been copied. The part of the code where
its failing is the sorting part, so I would have expected the copy to
have happened already.

Steve

  #10   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 9
Default Help with slow Macro

Joel wrote:
from
Set SortRange = Rows("3:" & LastRow)
to
Set SortRange = Rows("3:" & LastCells.Row)

I simplified the code and forgot I eliminate the LastRow variable.


Thats sorted out the error, but its not doing anything. It just does the
first cell and thats it. Well, it also changes focus to the last used
window, like an email.

Steve


  #11   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 9,101
Default Help with slow Macro

Tthe problem is with the statement below. I was using column F to determine
where the lastt row was located. If there is no data in column F that would
explain thhe problem. Change the F to a column that contains data in the
last row.

Set LastCells = Range("F" & Rows.Count).End(xlUp)


"Dooza" wrote:

Joel wrote:
from
Set SortRange = Rows("3:" & LastRow)
to
Set SortRange = Rows("3:" & LastCells.Row)

I simplified the code and forgot I eliminate the LastRow variable.


Thats sorted out the error, but its not doing anything. It just does the
first cell and thats it. Well, it also changes focus to the last used
window, like an email.

Steve

  #12   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 9
Default Help with slow Macro

Joel wrote:
Tthe problem is with the statement below. I was using column F to determine
where the lastt row was located. If there is no data in column F that would
explain thhe problem. Change the F to a column that contains data in the
last row.

Set LastCells = Range("F" & Rows.Count).End(xlUp)


That makes sense, so I tried:

Set LastCells = Range("E" & Rows.Count).End(xlUp)

But this now copies the cells to E row and overwrites the information
there. We need to get the row count of E, but use it with F.

Steve
  #13   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 9,101
Default Help with slow Macro

Try these changes. I modified th e PastRange and the Sort Range. I
replaced LastCells with LastRow


Sub FindDuplicates()
'
' FindDuplicates Macro
' Macro recorded 30/10/2008 by ACLHW103
'

Application.ScreenUpdating = False
Application.EnableEvents = False

'
With Range("F2")
.FormulaR1C1 = "Duplicate"
.Characters(Start:=1, Length:=9).Font
.Name = "Arial"
.FontStyle = "Bold"
.Size = 10
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With

With Range("F3")
.FormulaR1C1 = "=COUNTIF(C[-5],RC[-5])1"
.Copy
LastRow = Range("E" & Rows.count).end(xlup).row
Set PasteRange = Range("F3:F" & LastRow)

PasteRange.PasteSpecial _
Paste:=xlPasteFormulas, _
Operation:=xlNone, _
SkipBlanks:=False, _
Transpose:=False

Application.CutCopyMode = False
.FormatConditions.Delete
.FormatConditions.Add _
Type:=xlExpression, _
Formula1:="=COUNTIF(A:A,A3)1"
.FormatConditions(1).Interior.ColorIndex = 3
.Copy
PasteRange.PasteSpecial _
Paste:=xlPasteFormats, _
Operation:=xlNone, _
SkipBlanks:=False, _
Transpose:=False
End With

Application.CutCopyMode = False
Set SortRange = Rows("3:" & LastRow)
SortRange.Sort _
Key1:=Range("F3"), _
Order1:=xlDescending, _
Key2:=Range("A3"), _
Order2:=xlAscending, _
Header:=xlno, _
OrderCustom:=1, _
MatchCase:=False, _
Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal, _
DataOption2:=xlSortNormal
Application.WindowState = xlMinimized

Application.ScreenUpdating = True
Application.EnableEvents = True

End Sub



"Dooza" wrote:

Joel wrote:
Tthe problem is with the statement below. I was using column F to determine
where the lastt row was located. If there is no data in column F that would
explain thhe problem. Change the F to a column that contains data in the
last row.

Set LastCells = Range("F" & Rows.Count).End(xlUp)


That makes sense, so I tried:

Set LastCells = Range("E" & Rows.Count).End(xlUp)

But this now copies the cells to E row and overwrites the information
there. We need to get the row count of E, but use it with F.

Steve

  #14   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 9
Default Help with slow Macro

Joel wrote:
Try these changes. I modified th e PastRange and the Sort Range. I
replaced LastCells with LastRow


Fantastic, now we're cooking on gas! Thats nice and quick too, for some
reason it still changes focus to another open program, but I can live
with that.

Thank you very much for your help!

Steve

  #15   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 9,101
Default Help with slow Macro

You are minimizing the window with this statement

Application.WindowState = xlMinimized

"Dooza" wrote:

Joel wrote:
Try these changes. I modified th e PastRange and the Sort Range. I
replaced LastCells with LastRow


Fantastic, now we're cooking on gas! Thats nice and quick too, for some
reason it still changes focus to another open program, but I can live
with that.

Thank you very much for your help!

Steve




  #16   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 9
Default Help with slow Macro

Joel wrote:
You are minimizing the window with this statement

Application.WindowState = xlMinimized


That must have crept in when I was recording it, as its not intentional.
Thank you once again!

Steve
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 Macro Frank Situmorang Excel Programming 7 June 30th 07 02:26 PM
Macro help, very slow Scott Marcus Excel Programming 0 November 8th 06 05:39 PM
Very slow macro CLR Excel Programming 10 September 21st 05 12:32 PM
Slow macro AG Excel Programming 5 August 25th 05 01:25 AM
Macro it's very Slow .... leo_nunez[_2_] Excel Programming 4 August 28th 04 03:45 PM


All times are GMT +1. The time now is 10:49 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"