Reply
 
LinkBack Thread Tools Search this Thread Display Modes
  #1   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 82
Default VBA Question - Is there a better approach?

Below is a piece of code I use to delete rows that contain a specific keyword
in a designated column. Right now I specify the range m2:m1500, but rarely
have that many lines in the raw data. I chose the number 1500 to be sure the
code runs on all lines. Right now this is the largest time contributor to
the macro I run on the data, of which this is a small part.

Is there an approach I can follow other than the one shown below that
addresses the speed, and would also not require me to specify the range... so
it acts only the actual number of row of data in the worksheet?

Thanks,

Scott



'----------------------------------------------------
'Delete extra lines
'----------------------------------------------------
myWords = Array("2")

Set wks = ActiveSheet
With wks
With .Range("m2:m1500")
For iCtr = LBound(myWords) To UBound(myWords)
Do
Set FoundCell = .Cells.Find(What:=myWords(iCtr), _
after:=.Cells(.Cells.Count), _
LookIn:=xlValues, _
LookAt:=xlPart, _
SearchOrder:=xlByRows, _
searchdirection:=xlNext, _
MatchCase:=False)
If FoundCell Is Nothing Then
Exit Do
Else
FoundCell.EntireRow.Delete
End If
Loop
Next iCtr
End With
End With
  #2   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 1,080
Default VBA Question - Is there a better approach?

Instead of:

..Range("M2:M1500")

try using:

Intersect(.UsedRange, .Range("M2:M1500")



"Scott Wagner" wrote in message
...
Below is a piece of code I use to delete rows that contain a specific
keyword
in a designated column. Right now I specify the range m2:m1500, but
rarely
have that many lines in the raw data. I chose the number 1500 to be sure
the
code runs on all lines. Right now this is the largest time contributor to
the macro I run on the data, of which this is a small part.

Is there an approach I can follow other than the one shown below that
addresses the speed, and would also not require me to specify the range...
so
it acts only the actual number of row of data in the worksheet?

Thanks,

Scott



'----------------------------------------------------
'Delete extra lines
'----------------------------------------------------
myWords = Array("2")

Set wks = ActiveSheet
With wks
With .Range("m2:m1500")
For iCtr = LBound(myWords) To UBound(myWords)
Do
Set FoundCell = .Cells.Find(What:=myWords(iCtr), _
after:=.Cells(.Cells.Count), _
LookIn:=xlValues, _
LookAt:=xlPart, _
SearchOrder:=xlByRows, _
searchdirection:=xlNext, _
MatchCase:=False)
If FoundCell Is Nothing Then
Exit Do
Else
FoundCell.EntireRow.Delete
End If
Loop
Next iCtr
End With
End With



  #3   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 104
Default VBA Question - Is there a better approach?

Hi Scott, there is several ways to determine bottom row. See the example
below.
Enjoy Rick

dim LastRow as Long
LastRow = Range("M2").End(xlDn).Row
With Range("M2:M" & LastRow
(your code)

or

With Range("M2: M" & Range("M2").End(xlDn).Row )
(your code)


"Scott Wagner" wrote in message
...
Below is a piece of code I use to delete rows that contain a specific

keyword
in a designated column. Right now I specify the range m2:m1500, but

rarely
have that many lines in the raw data. I chose the number 1500 to be sure

the
code runs on all lines. Right now this is the largest time contributor to
the macro I run on the data, of which this is a small part.

Is there an approach I can follow other than the one shown below that
addresses the speed, and would also not require me to specify the range...

so
it acts only the actual number of row of data in the worksheet?

Thanks,

Scott



'----------------------------------------------------
'Delete extra lines
'----------------------------------------------------
myWords = Array("2")

Set wks = ActiveSheet
With wks
With .Range("m2:m1500")
For iCtr = LBound(myWords) To UBound(myWords)
Do
Set FoundCell = .Cells.Find(What:=myWords(iCtr), _
after:=.Cells(.Cells.Count), _
LookIn:=xlValues, _
LookAt:=xlPart, _
SearchOrder:=xlByRows, _
searchdirection:=xlNext, _
MatchCase:=False)
If FoundCell Is Nothing Then
Exit Do
Else
FoundCell.EntireRow.Delete
End If
Loop
Next iCtr
End With
End With



  #4   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 1
Default VBA Question - Is there a better approach?

Dear Scott,

Please see the following code:
'----------------------------------------------------
'Delete extra lines
'----------------------------------------------------
Dim myWords As Variant
Dim wks As Worksheet ' Worksheet object
Dim r As Integer ' Row Iterator
Dim w As Variant ' word iterator among myWords
Dim lastRow As Integer ' Variable to store the last row number

myWords = Array("2") ' Assign values to search for

Application.ScreenUpdating = False ' Disables screen redraw, which is
very slow
Set wks = ActiveSheet ' get reference to the active WorkSheet
lastRow = wks.Columns("M:M").Find("*", wks.Range("M1"), , , ,
xlPrevious).Row ' Find the last cell in the range, containing a value
For r = lastRow To 2 Step -1 ' Iterate from the last to the first row -
important to be backwards, because rows change after deletion
If wks.Cells(r, 13) < "" Then ' Do not check if cell is empty. Not
necessary
For Each w In myWords ' Iterate among all words
If InStr(wks.Cells(r, 13).Value, w) 0 Then 'Check if w is
contained in the cell
wks.Rows(r).Delete ' delete the row
Exit For ' exit word loop - no need to check other
words, since row is deleted
End If
Next w
End If
Next r

Application.ScreenUpdating = True ' Enables screen redraw

Please keep in mind that the UsedRange is not always correct in Excel. So
you can find the last cell "looking" backwards as shown above.
Moreover, if many rows are to be deleted, I believe that disabling screen
updating might speed up your code considerably


"Scott Wagner" написа:

Below is a piece of code I use to delete rows that contain a specific keyword
in a designated column. Right now I specify the range m2:m1500, but rarely
have that many lines in the raw data. I chose the number 1500 to be sure the
code runs on all lines. Right now this is the largest time contributor to
the macro I run on the data, of which this is a small part.

Is there an approach I can follow other than the one shown below that
addresses the speed, and would also not require me to specify the range... so
it acts only the actual number of row of data in the worksheet?

Thanks,

Scott



'----------------------------------------------------
'Delete extra lines
'----------------------------------------------------
myWords = Array("2")

Set wks = ActiveSheet
With wks
With .Range("m2:m1500")
For iCtr = LBound(myWords) To UBound(myWords)
Do
Set FoundCell = .Cells.Find(What:=myWords(iCtr), _
after:=.Cells(.Cells.Count), _
LookIn:=xlValues, _
LookAt:=xlPart, _
SearchOrder:=xlByRows, _
searchdirection:=xlNext, _
MatchCase:=False)
If FoundCell Is Nothing Then
Exit Do
Else
FoundCell.EntireRow.Delete
End If
Loop
Next iCtr
End With
End With

  #5   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 5,939
Default VBA Question - Is there a better approach?

Since you are using a find it will not make a substantial difference. In fact
I would be inclined to use

With .Columns("M")

Then you do not have to worry about how many cells are populated. You are
not iterating through each of the cells with a find...

If you want to get a performance improvement change the code to accumulate
all of the found ranges into one big range using the union operator and then
just do one big delete at the end. Deleting one row at a time is a
substantial drain on your resources.
--
HTH...

Jim Thomlinson


"Scott Wagner" wrote:

Below is a piece of code I use to delete rows that contain a specific keyword
in a designated column. Right now I specify the range m2:m1500, but rarely
have that many lines in the raw data. I chose the number 1500 to be sure the
code runs on all lines. Right now this is the largest time contributor to
the macro I run on the data, of which this is a small part.

Is there an approach I can follow other than the one shown below that
addresses the speed, and would also not require me to specify the range... so
it acts only the actual number of row of data in the worksheet?

Thanks,

Scott



'----------------------------------------------------
'Delete extra lines
'----------------------------------------------------
myWords = Array("2")

Set wks = ActiveSheet
With wks
With .Range("m2:m1500")
For iCtr = LBound(myWords) To UBound(myWords)
Do
Set FoundCell = .Cells.Find(What:=myWords(iCtr), _
after:=.Cells(.Cells.Count), _
LookIn:=xlValues, _
LookAt:=xlPart, _
SearchOrder:=xlByRows, _
searchdirection:=xlNext, _
MatchCase:=False)
If FoundCell Is Nothing Then
Exit Do
Else
FoundCell.EntireRow.Delete
End If
Loop
Next iCtr
End With
End With

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
Formula/Approach Question carl Excel Worksheet Functions 1 November 9th 07 04:47 PM
What is the right approach? Epinn Excel Worksheet Functions 3 October 8th 06 12:22 PM
How to approach this? mevetts Excel Discussion (Misc queries) 1 January 10th 06 04:20 PM
New approach davegb Excel Programming 6 December 6th 05 04:31 PM
How do I approach this? Grant Reid Excel Programming 5 May 25th 04 04:51 PM


All times are GMT +1. The time now is 03:31 PM.

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

About Us

"It's about Microsoft Excel"