ExcelBanter

ExcelBanter (https://www.excelbanter.com/)
-   Excel Programming (https://www.excelbanter.com/excel-programming/)
-   -   Why is this loop not working? (https://www.excelbanter.com/excel-programming/394036-why-loop-not-working.html)

Mike R.

Why is this loop not working?
 
Hi -
this seems like a pretty easy loop statement. What am I doing wrong? I am
trying to see if a value in a row equal's the word START and if so, delete
that row.
Help..

irows = ActiveSheet.UsedRange.Rows.Count
For iloop = 2 To irows
If Cells(iloop, "D").Value = "START" Then Cells(iloop,
"D").EntireRow.Delete
Next iloop

Barb Reinhardt

Why is this loop not working?
 
Two problems:

1) When you delete rows, the counter functionally skips a row
2) if the activerange doesn't include the first row, the rowcount will be off.

Try this

Sub test()
Dim myRange As Range
Set myRange = Nothing
Set myRange = ActiveSheet.Cells(ActiveSheet.Rows.Count, "D")
irows = myRange.End(xlUp).Row
Set myRange = Nothing

For iloop = 2 To irows
If Cells(iloop, "D").Value = "START" Then
If myRange Is Nothing Then
Set myRange = Rows(iloop)
Else
Set myRange = Union(myRange, Rows(iloop))
End If
End If
Next iloop

myRange.EntireRow.Delete
End Sub

HTH,
Barb Reinhardt

"Mike R." wrote:

Hi -
this seems like a pretty easy loop statement. What am I doing wrong? I am
trying to see if a value in a row equal's the word START and if so, delete
that row.
Help..

irows = ActiveSheet.UsedRange.Rows.Count
For iloop = 2 To irows
If Cells(iloop, "D").Value = "START" Then Cells(iloop,
"D").EntireRow.Delete
Next iloop


Jim Thomlinson

Why is this loop not working?
 
Not to pick but if the word Start is not found then the code will crash. You
should validate myRange before deleting

if not myRange is nothing then myRange.EntireRow.Delete
instead of just
myRange.EntireRow.Delete
--
HTH...

Jim Thomlinson


"Barb Reinhardt" wrote:

Two problems:

1) When you delete rows, the counter functionally skips a row
2) if the activerange doesn't include the first row, the rowcount will be off.

Try this

Sub test()
Dim myRange As Range
Set myRange = Nothing
Set myRange = ActiveSheet.Cells(ActiveSheet.Rows.Count, "D")
irows = myRange.End(xlUp).Row
Set myRange = Nothing

For iloop = 2 To irows
If Cells(iloop, "D").Value = "START" Then
If myRange Is Nothing Then
Set myRange = Rows(iloop)
Else
Set myRange = Union(myRange, Rows(iloop))
End If
End If
Next iloop

myRange.EntireRow.Delete
End Sub

HTH,
Barb Reinhardt

"Mike R." wrote:

Hi -
this seems like a pretty easy loop statement. What am I doing wrong? I am
trying to see if a value in a row equal's the word START and if so, delete
that row.
Help..

irows = ActiveSheet.UsedRange.Rows.Count
For iloop = 2 To irows
If Cells(iloop, "D").Value = "START" Then Cells(iloop,
"D").EntireRow.Delete
Next iloop


George Nicholson

Why is this loop not working?
 
Reverse the loop.

For iloop = irows to 2 Step -1

When deleting rows (or any object in a Collection) by index position, start
with the LAST member, and work forward.
The reason is that once you delete, the "next" highest element fills the
current index position...but you just evaluated the current position and are
about to move off of it. Result: every time you delete you end up 'skipping'
the next highest row/object and it is never evaluated. This isn't an issue
if you work backwards from the end of the collection.

When its possible to use a For Each..Next structure, this isn't an issue.
Each member will be evaluated.

HTH,


"Mike R." wrote in message
...
Hi -
this seems like a pretty easy loop statement. What am I doing wrong? I
am
trying to see if a value in a row equal's the word START and if so, delete
that row.
Help..

irows = ActiveSheet.UsedRange.Rows.Count
For iloop = 2 To irows
If Cells(iloop, "D").Value = "START" Then Cells(iloop,
"D").EntireRow.Delete
Next iloop




Jennifer[_2_]

Why is this loop not working?
 
For testing purposes I made a test sub that I ran manually. Worked
for me. How are you running it?


Barb Reinhardt

Why is this loop not working?
 
You're right. I missed that.

"Jim Thomlinson" wrote:

Not to pick but if the word Start is not found then the code will crash. You
should validate myRange before deleting

if not myRange is nothing then myRange.EntireRow.Delete
instead of just
myRange.EntireRow.Delete
--
HTH...

Jim Thomlinson


"Barb Reinhardt" wrote:

Two problems:

1) When you delete rows, the counter functionally skips a row
2) if the activerange doesn't include the first row, the rowcount will be off.

Try this

Sub test()
Dim myRange As Range
Set myRange = Nothing
Set myRange = ActiveSheet.Cells(ActiveSheet.Rows.Count, "D")
irows = myRange.End(xlUp).Row
Set myRange = Nothing

For iloop = 2 To irows
If Cells(iloop, "D").Value = "START" Then
If myRange Is Nothing Then
Set myRange = Rows(iloop)
Else
Set myRange = Union(myRange, Rows(iloop))
End If
End If
Next iloop

myRange.EntireRow.Delete
End Sub

HTH,
Barb Reinhardt

"Mike R." wrote:

Hi -
this seems like a pretty easy loop statement. What am I doing wrong? I am
trying to see if a value in a row equal's the word START and if so, delete
that row.
Help..

irows = ActiveSheet.UsedRange.Rows.Count
For iloop = 2 To irows
If Cells(iloop, "D").Value = "START" Then Cells(iloop,
"D").EntireRow.Delete
Next iloop


David Hilberg

Why is this loop not working?
 

- As soon as you delete a row, another moves up to fill its place,
possibly with a START value that now won't be examined.
- If your first row is blank, UsedRange will have 1 fewer row than you
thought.
- You lost your Endif

Assuming your first row isn't blank:

irows = ActiveSheet.UsedRange.Rows.Count
For iloop = irows To 2 Step -1
If Cells(iloop, "D").Value = "START" Then
Cells(iloop, "D").EntireRow.Delete
End If
Next iloop


Tim879

Why is this loop not working?
 
When you're deleting a row, you mess up the index in excel.

Think of it this way... you're up to row 3.... your index (iloop in
your case) =3. You decide to delete row 3. Excel deletes row 3 and
then moves all of the rows in the spreadsheet up 1 row. So now, what
was row 4 became row 3.

Check out this site.... it will likely have some code you can use.
http://www.cpearson.com/excel/deleting.htm


On Jul 24, 1:12 pm, Mike R. wrote:
Hi -
this seems like a pretty easy loop statement. What am I doing wrong? I am
trying to see if a value in a row equal's the word START and if so, delete
that row.
Help..

irows = ActiveSheet.UsedRange.Rows.Count
For iloop = 2 To irows
If Cells(iloop, "D").Value = "START" Then Cells(iloop,
"D").EntireRow.Delete
Next iloop




[email protected]

Why is this loop not working?
 
On Jul 24, 12:12 pm, Mike R. wrote:
Hi -
this seems like a pretty easy loop statement. What am I doing wrong? I am
trying to see if a value in a row equal's the word START and if so, delete
that row.
Help..

irows = ActiveSheet.UsedRange.Rows.Count
For iloop = 2 To irows
If Cells(iloop, "D").Value = "START" Then Cells(iloop,
"D").EntireRow.Delete
Next iloop


A couple common problems:
1) When you delete a row this way you will miss the next row
because the row counter increments.
2) Loop looks to be an integer which could be a problem if you have
a lot of rows.

Try:

Dim lLoop As Long

For lLoop = ActiveSheet.UsedRange.Rows.Count +
ActiveSheet.UsedRange.Row To 2 Step -1
If (UCase(Cells(lLoop, "D")) = "START") Then Rows(lLoop).Delete
shift:=xlUp
Next

Peter Richardson


Zone[_3_]

Why is this loop not working?
 
Mike, you really should go from the bottom when deleting rows:
For iloop=irows to 2 step -1
James

On Jul 24, 1:12?pm, Mike R. wrote:
Hi -
this seems like a pretty easy loop statement. What am I doing wrong? I am
trying to see if a value in a row equal's the word START and if so, delete
that row.
Help..

irows = ActiveSheet.UsedRange.Rows.Count
For iloop = 2 To irows
If Cells(iloop, "D").Value = "START" Then Cells(iloop,
"D").EntireRow.Delete
Next iloop




Tim879

Why is this loop not working?
 
your index is messed up.

consider this example. ILoop = 3, excel is now reviewing row 3 and it
turns out that this row should be deleted. Excel deletes row 3 and
moves all of the other rows up 1 (i.e. row 4 becomes row 3). Your
ILoop increments by 1, so now... ILoop = 4 but the current row should
be reviewing in excel is row 3.

check out:
http://www.cpearson.com/excel/deleting.htm

you should be able to modify that code to do what you need.



On Jul 24, 1:12 pm, Mike R. wrote:
Hi -
this seems like a pretty easy loop statement. What am I doing wrong? I am
trying to see if a value in a row equal's the word START and if so, delete
that row.
Help..

irows = ActiveSheet.UsedRange.Rows.Count
For iloop = 2 To irows
If Cells(iloop, "D").Value = "START" Then Cells(iloop,
"D").EntireRow.Delete
Next iloop




INTP56

Why is this loop not working?
 
Alternate method:

Option Explicit

Public Sub DeleteRows(WS As Worksheet, strSearch As String, intColumnNumber
As Integer)
Dim rngHitCell As Range
Set rngHitCell = WS.Columns(intColumnNumber).Find _
(What:=strSearch _
, LookIn:=xlFormulas _
, LookAt:=xlWhole _
, SearchOrder:=xlByRows _
, SearchDirection:=xlNext _
, MatchCase:=False _
, SearchFormat:=False _
)

While Not rngHitCell Is Nothing
WS.Rows(rngHitCell.Row).Delete
Set rngHitCell = WS.Columns(intColumnNumber).FindNext
Wend
End Sub

Public Sub TestDeleterows()
DeleteRows WS:=ThisWorkbook.Worksheets(1), strSearch:="START",
intColumnNumber:=4
End Sub

Bob

"Mike R." wrote:

Hi -
this seems like a pretty easy loop statement. What am I doing wrong? I am
trying to see if a value in a row equal's the word START and if so, delete
that row.
Help..

irows = ActiveSheet.UsedRange.Rows.Count
For iloop = 2 To irows
If Cells(iloop, "D").Value = "START" Then Cells(iloop,
"D").EntireRow.Delete
Next iloop


INTP56

Why is this loop not working?
 
Alternate method 2 -

You could also implement this by passing a search range in instead of a
worksheet and column number. This solves the problem of deleting START in row
1.

With the first method, you could grab the value of .Cells(1,4), change it,
run the PROC, then change it back. Or you could trap when rngHitCell was on
row 1, etc.

BTW, is there a nice way of specifying Columns(4) except for row 1?
Something like Exclude(rng1,rng2) that returns rng1 minus what's in rng2.

Bob

Option Explicit

Public Sub DeleteRows2(rngSearch As Range, strSearch As String)
Dim rngHitCell As Range
Set rngHitCell = rngSearch.Find _
(What:=strSearch _
, LookIn:=xlFormulas _
, LookAt:=xlWhole _
, SearchOrder:=xlByRows _
, SearchDirection:=xlNext _
, MatchCase:=False _
, SearchFormat:=False _
)

While Not rngHitCell Is Nothing
rngSearch.Parent.Rows(rngHitCell.Row).Delete
Set rngHitCell = rngSearch.FindNext
Wend
End Sub

Public Sub TestDeleteRows2()
With ThisWorkbook.Worksheets(1)
DeleteRows2 rngSearch:=.Range(.Cells(2, 4), .Cells(65536, 4)),
strSearch:="START"
End With
End Sub


"INTP56" wrote:

Alternate method:

Option Explicit

Public Sub DeleteRows(WS As Worksheet, strSearch As String, intColumnNumber
As Integer)
Dim rngHitCell As Range
Set rngHitCell = WS.Columns(intColumnNumber).Find _
(What:=strSearch _
, LookIn:=xlFormulas _
, LookAt:=xlWhole _
, SearchOrder:=xlByRows _
, SearchDirection:=xlNext _
, MatchCase:=False _
, SearchFormat:=False _
)

While Not rngHitCell Is Nothing
WS.Rows(rngHitCell.Row).Delete
Set rngHitCell = WS.Columns(intColumnNumber).FindNext
Wend
End Sub

Public Sub TestDeleterows()
DeleteRows WS:=ThisWorkbook.Worksheets(1), strSearch:="START",
intColumnNumber:=4
End Sub

Bob

"Mike R." wrote:

Hi -
this seems like a pretty easy loop statement. What am I doing wrong? I am
trying to see if a value in a row equal's the word START and if so, delete
that row.
Help..

irows = ActiveSheet.UsedRange.Rows.Count
For iloop = 2 To irows
If Cells(iloop, "D").Value = "START" Then Cells(iloop,
"D").EntireRow.Delete
Next iloop



All times are GMT +1. The time now is 05:35 PM.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
ExcelBanter.com