ExcelBanter

ExcelBanter (https://www.excelbanter.com/)
-   Excel Programming (https://www.excelbanter.com/excel-programming/)
-   -   Macro lagging during loop (https://www.excelbanter.com/excel-programming/415878-macro-lagging-during-loop.html)

[email protected]

Macro lagging during loop
 
The following code bogs down at the "If Not FoundCell" statement and I
have no idea why. I was trying to make the code more efficient by
assigning all rows that I was deleting to Rng and it worked for all
other statements but this one.

When I break and step into the code, it gives me a 1004 error for the
Set Rng = Union step.

Any idea how to make this work?

RcdType = Array("TributeCardRecipient") ' "Tribute") ',
"NotApplicable")
For Each Thing In RcdType
Do
Set FoundCell = SrcRng.Find(What:=Thing)

If Not FoundCell Is Nothing Then
If Rng Is Nothing Then
Set Rng = Rows(FoundCell.Row & ":"
& FoundCell.Row)
Else: Set Rng = Union(Rng,
Rows(FoundCell.Row & ":" _
& FoundCell.Row))
End If
End If
Loop
Next

Bernie Deitrick

Macro lagging during loop
 
You have a Do Loop without a way out. What do you want to do? Find all instances of the values, or
just the first?

HTH,
Bernie
MS Excel MVP


wrote in message
...
The following code bogs down at the "If Not FoundCell" statement and I
have no idea why. I was trying to make the code more efficient by
assigning all rows that I was deleting to Rng and it worked for all
other statements but this one.

When I break and step into the code, it gives me a 1004 error for the
Set Rng = Union step.

Any idea how to make this work?

RcdType = Array("TributeCardRecipient") ' "Tribute") ',
"NotApplicable")
For Each Thing In RcdType
Do
Set FoundCell = SrcRng.Find(What:=Thing)

If Not FoundCell Is Nothing Then
If Rng Is Nothing Then
Set Rng = Rows(FoundCell.Row & ":"
& FoundCell.Row)
Else: Set Rng = Union(Rng,
Rows(FoundCell.Row & ":" _
& FoundCell.Row))
End If
End If
Loop
Next




Jim Thomlinson

Macro lagging during loop
 
There are a couple of issues in your code. The biggest thing is your loop has
not way out. Additioanlly you have not speicfied enough parameters in your
find which can cause problems... Try this...

Sub test()
Dim SrcRng As Range
Dim RcdType As Variant
Dim Thing As Variant

Set SrcRng = Cells
RcdType = Array("TributeCardRecipient", "Tribute", "NotApplicable")
For Each Thing In RcdType
Call FoundCells(Thing, SrcRng, FoundCell)
Next Thing
If Not FoundCell Is Nothing Then FoundCell.EntireRow.Select 'Change to delete
End Sub

Public Sub FoundCells(ByVal ToFind As String, ByVal SourceRange As Range, _
Optional ByRef FoundRange As Range)
Dim rngFound As Range
Dim strFirstAddress As String

Set rngFound = SourceRange.Find(What:=ToFind, _
LookAt:=xlWhole, _
LookIn:=xlFormulas, _
MatchCase:=False)
If Not rngFound Is Nothing Then
If FoundRange Is Nothing Then
Set FoundRange = rngFound
Else
Set FoundRange = Union(FoundRange, rngFound)
End If
strFirstAddress = rngFound.Address
Do
Set FoundRange = Union(FoundRange, rngFound)
Set rngFound = SourceRange.FindNext(rngFound)
Loop Until strFirstAddress = rngFound.Address
End If
End Sub
--
HTH...

Jim Thomlinson


" wrote:

The following code bogs down at the "If Not FoundCell" statement and I
have no idea why. I was trying to make the code more efficient by
assigning all rows that I was deleting to Rng and it worked for all
other statements but this one.

When I break and step into the code, it gives me a 1004 error for the
Set Rng = Union step.

Any idea how to make this work?

RcdType = Array("TributeCardRecipient") ' "Tribute") ',
"NotApplicable")
For Each Thing In RcdType
Do
Set FoundCell = SrcRng.Find(What:=Thing)

If Not FoundCell Is Nothing Then
If Rng Is Nothing Then
Set Rng = Rows(FoundCell.Row & ":"
& FoundCell.Row)
Else: Set Rng = Union(Rng,
Rows(FoundCell.Row & ":" _
& FoundCell.Row))
End If
End If
Loop
Next


Bernie Deitrick

Macro lagging during loop
 
Try something like this, if you want to delete rows: it is always better to sort prior to row
deletion, even compared to deleting a union. This assumes the values you are looking for are in
column H....

Sub DeleteAllInstancesOfCertainValues()
Dim myRow As Long
Dim Values As Variant
Dim myVal As Variant
Dim mySrcRange As Range

Set mySrcRange = Range("H:H")

Values = Array("TributeCardRecipient","Tribute","NotApplica ble")

With Application
.ScreenUpdating = False
.EnableEvents = False
End With

For Each myVal In Values
myRow = Cells(Rows.Count, mySrcRange.Column).End(xlUp).Row
mySrcRange.Offset(0, 1).EntireColumn.Insert
mySrcRange.Offset(0, 1).Cells(1, 1).Value = "Flag"
mySrcRange.Offset(0, 1).Cells(2, 1).Resize(myRow - 1, 1).FormulaR1C1 = _
"=IF(RC[-1]=""" & myVal & """,""Delete"","""")"
Cells.Sort key1:=mySrcRange.Offset(0, 1).Cells(1, 2), order1:=xlDescending, Header:=xlYes
mySrcRange.Offset(0, 1).AutoFilter Field:=1, Criteria1:="Delete"
mySrcRange.Offset(0, 1).Range("A2:A" &
Rows.Count).SpecialCells(xlCellTypeVisible).Entire Row.Delete
mySrcRange.Offset(0, 1).EntireColumn.Delete
Next myVal

With Application
.ScreenUpdating = True
.EnableEvents = True
End With

End Sub


HTH,
Bernie
MS Excel MVP


"Bernie Deitrick" <deitbe @ consumer dot org wrote in message
...
You have a Do Loop without a way out. What do you want to do? Find all instances of the values,
or just the first?

HTH,
Bernie
MS Excel MVP


wrote in message
...
The following code bogs down at the "If Not FoundCell" statement and I
have no idea why. I was trying to make the code more efficient by
assigning all rows that I was deleting to Rng and it worked for all
other statements but this one.

When I break and step into the code, it gives me a 1004 error for the
Set Rng = Union step.

Any idea how to make this work?

RcdType = Array("TributeCardRecipient") ' "Tribute") ',
"NotApplicable")
For Each Thing In RcdType
Do
Set FoundCell = SrcRng.Find(What:=Thing)

If Not FoundCell Is Nothing Then
If Rng Is Nothing Then
Set Rng = Rows(FoundCell.Row & ":"
& FoundCell.Row)
Else: Set Rng = Union(Rng,
Rows(FoundCell.Row & ":" _
& FoundCell.Row))
End If
End If
Loop
Next






[email protected]

Macro lagging during loop
 
Hi Bernie:

Thank you, I replaced that with the following code:

SrcEntRng.AutoFilter Field:=1,
Criteria1:="=TributeCardRecipient", Operator:=xlOr, _
Criteria2:="=Tribute"
Set Rng2 =
SrcRng.Columns(1).SpecialCells(xlVisible).EntireRo w
Rng2.Delete
SrcWS.AutoFilterMode = False

More efficient than going through each idividual row, and I should
have thought of it before.


S

On Aug 19, 12:43*pm, "Bernie Deitrick" <deitbe @ consumer dot org
wrote:
You have a Do Loop without a way out. *What do you want to do? Find all instances of the values, or
just the first?

HTH,
Bernie
MS Excel MVP

wrote in message

...



The following code bogs down at the "If Not FoundCell" statement and I
have no idea why. I was trying to make the code more efficient by
assigning all rows that I was deleting to Rng and it worked for all
other statements but this one.


When I break and step into the code, it gives me a 1004 error for the
Set Rng = Union step.


Any idea how to make this work?


* * * * * *RcdType = Array("TributeCardRecipient") ' "Tribute") ',
"NotApplicable")
* * * * * *For Each Thing In RcdType
* * * * * * * *Do
* * * * * * * * * *Set FoundCell = SrcRng.Find(What:=Thing)


* * * * * * * * * *If Not FoundCell Is Nothing Then
* * * * * * * * * * * * * * * *If Rng Is Nothing Then
* * * * * * * * * * * * * * * * * *Set Rng = Rows(FoundCell.Row & ":"
& FoundCell.Row)
* * * * * * * * * * * * * * * *Else: Set Rng = Union(Rng,
Rows(FoundCell.Row & ":" _
* * * * * * * * * * * * * * * * * * * *& FoundCell.Row))
* * * * * * * * * * * * * * * *End If
* * * * * * * * * *End If
* * * * * * * *Loop
* * * * * *Next- Hide quoted text -


- Show quoted text -




All times are GMT +1. The time now is 07:32 PM.

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