Calvin P
Calvin P

Reputation: 109

VBA - Range Object Sets Only Once in Loop

I am writing code which matches a date (from a file), puts this into a collection and then attempts to find this on a spreadsheet. Once it finds it, it puts the following two items in the collection in the two cells. When I run this I get the following error: "Object variable or With block variable not set". I have attempted to debug my code and it shows that after the first loop of the code below, the range object, "rthecell", changes to the proper value. Once the second iteration of the loop occurs the value of "rthecell" changes to "Nothing".

Ex:

    Set rtheCell = Range("A:A").Find(What:=LineItem1)
    rtheCell.Offset(, 1).Value = LineItem3 
    rtheCell.Offset(, 2).Value = LineItem2
    Set rtheCell = Nothing

Again, everything works as intended on the first iteration of the loop but I receive the error once the second iteration occurs.

Here is the full code:

Sub InputData()

'Declare variables

Dim sFilePath As String
Dim sLineFromFile As String
Dim saLineItems() As String
Dim element As Variant
Dim col As Collection
Dim LineItem1 As String
Dim LineItem2 As String
Dim LineItem3 As String
Dim rtheCell As Range

Set col = New Collection

'Insert file path name here, this file will be overwritten each morning

sFilePath = "P:\Billing_Count.csv"

Open sFilePath For Input As #1

Do Until EOF(1)

    Line Input #1, sLineFromFile

    'Split each line into a string array
    'First replace all space with comma, then replace all double comma with single comma
    'Replace all commas with space
    'Then perform split with all values separated by one space

    sLineFromFile = Replace(sLineFromFile, Chr(32), ",")
    sLineFromFile = Replace(sLineFromFile, ",,", ",")
    sLineFromFile = Replace(sLineFromFile, ",", " ")
    saLineItems = Split(sLineFromFile, " ")

    'Add line from saLineItem array to a collection
    For Each element In saLineItems
        If element <> " " Then
        col.Add element
        End If
    Next

Loop

Close #1

'Place each value of array into a smaller array of size 3
Dim i As Integer
i = 1

Do Until i > col.Count


    'Place each value of array into a string-type variable

    'This line is the date
    LineItem1 = col.Item(i)
    i = i + 1
    'This line should be the BW count make sure to check
    LineItem2 = col.Item(i)
    i = i + 1
    'This line should be the ECC count make sure to check
    LineItem3 = col.Item(i)
    i = i + 1

    'Find the matching date in existing Daily Billing File (dates on Excel must be formatted as
    'general or text) and add ECC and BW counts on adjacent fields

    Set rtheCell = Range("A3:A37").Find(What:=LineItem1)
    rtheCell.Offset(, 1).Value = LineItem3 'This is LineItem3 since we can ECC data to appear before BW
    rtheCell.Offset(, 2).Value = LineItem2
    Set rtheCell = Nothing
    LineItem1 = 0

Loop

'Format cells to appear as number with no decimals
'Format cells to have horizontal alignment
Sheets(1).Range("B3:C50").NumberFormat = "0"
Sheets(1).Range("C3:C50").HorizontalAlignment = xlRight


End Sub

Upvotes: 4

Views: 941

Answers (1)

user4039065
user4039065

Reputation:

when you use the Range.Find method, typically you would either use the After:= parameter in subsequent calls or use the Range.FindNext method which assumes After:= the last found item. Since you are not modifying the actual found cells' value(s) in any way, you need to record the original found cell (typically the address) because eventually you will loop back to the original.

dim fndrng as range, fndstr as string
set fndrng = Range("A:A").Find(What:=LineItem1, after:=cells(rows.count, "A"))
if not fndrng is nothing then
    fndstr = fndrng.address
    do while True

        'do stuff here

        set fndrng = Range("A:A").FindNext(after:=fndrng)
        if fndstr = fndrng.address then exit do
    loop
end if

That should give you the idea of looping through all the matching calls until you loop back to the original. tbh, it is hard to adequately expand on the small amount of code supplied.

Upvotes: 1

Related Questions