Deleting rows that don't contain keywords

C

Chris

I have this following macro which I want to scan through all cells in
my worksheet and delete all rows that don't contain the keywords
"NAME:" and that don't contain the keywords "SUBJ:" I keep getting an
error on "test = Application.Range(r,c).Text" It says "method Range of
object _Application failed" Does anyone know how to get the text from
each cell and compare it to the strings I have? Thanks

Sub DeleteR()
Dim bool As Boolean
For r = Application.Rows.Count To 1 Step -1
bool = False
For c = Application.Columns.Count To 1 Step -1
Dim test As String
test = Application.Range(r, c).Text
If test = "NAME:" Then
'mark bool as true (we found a table name row)
bool = True
End If
If test = "SUBJ:" Then
'mark bool as true (we found a subject area row)
bool = True
End If
Next c
If bool = False Then
'Delete entire row
Application.Rows(r).EntireRow.Delete
End If
Next r
End Sub
 
J

Jim Cone

Chris,

You need to use "Cells" instead of "Range".
Range is just not designed to function the way you are using it.
So...
test = ActiveSheet.Cells(r, c).Text

There appears to be other issues with your code.
We will probably here from you again. <g>
--
Jim Cone
San Francisco, USA
http://www.realezsites.com/bus/primitivesoftware



"Chris"
<[email protected]>
wrote in message
I have this following macro which I want to scan through all cells in
my worksheet and delete all rows that don't contain the keywords
"NAME:" and that don't contain the keywords "SUBJ:" I keep getting an
error on "test = Application.Range(r,c).Text" It says "method Range of
object _Application failed" Does anyone know how to get the text from
each cell and compare it to the strings I have? Thanks

Sub DeleteR()
Dim bool As Boolean
For r = Application.Rows.Count To 1 Step -1
bool = False
For c = Application.Columns.Count To 1 Step -1
Dim test As String
test = Application.Range(r, c).Text
If test = "NAME:" Then
'mark bool as true (we found a table name row)
bool = True
End If
If test = "SUBJ:" Then
'mark bool as true (we found a subject area row)
bool = True
End If
Next c
If bool = False Then
'Delete entire row
Application.Rows(r).EntireRow.Delete
End If
Next r
End Sub
 
D

Don Guillett

As mentioned, you need to use cells(r,c) but if your strings to find are all
in the same column then
sub deleterows()
for i =1 to cells(rows.count,"a").end(xlup).row
if cells(i,"a")="NAME:" or cells(i,"a")="SUBJ:" then rows(i).delete
next i
end sub

If not in the same column, look in the vba help index for FINDNEXT. There is
a good example. There is no reason to look at EVERY cell.
 
C

Chris

Actually, that did the job, thanks! But what did you think was
wrong? It worked for 47k rows by 20 columns in a little under 5
minutes, probably not the most efficient, but it did work.
 
T

Tom Ogilvy

You could approach it this way:

Sub DeleteRows()
Dim lastrow as Long, i as long
Dim rng as Range
With ActiveSheet
set rng = .UsedRange
lastrow = rng(rng.count).row

for i = lastrow to 1 step -1
if application.Countif(.rows(i),"*NAME:*") + _
application.Countif(.rows(i),"*SUBJ:*") = 0 then
.rows(i).Delete
end if
Next i
End With
End Sub
 
T

Tom Ogilvy

To the OP.

I don't see where Find or FindNext has any role to play in deleting rows
that don't contain some prescribed value (except in a most roundabout
fashion).

Maybe that will save you some time.
 
D

Don Guillett

Tom, Friday.
However, it COULD find the values>move the row to the next available row on
another sheet>delete what's left>move all the rows back. Not good but saves
a little bit of face. <G>
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top