11

I have a worksheet with 70,000 rows of data and a simple macro that counts the total number of rows:

Dim LastRow as Integer    
LastRow = SourceSheet.Cells.Find(what:="*", searchdirection:=xlPrevious, searchorder:=xlByRows).Row
MsgBox (LastRow)

This returns an overflow error. Changing LastRow to Long returns the correct value of 70,000.

According to Microsoft's website, a VBA integer should be able to hold values between -2,147,483,648 and 2,147,483,647. My output is well within this range, so why would it fail?

Thanks!

DixieFlatline
  • 484
  • 2
  • 5
  • 17

1 Answers1

32

The website you are looking at is for Visual Studio (.NET) .

VBA Integer is 32,768. You need to use a long.

A VBA Long variable holds whole numbers from -2,147,483,648 to 2,147,483,647 and uses 4 bytes (32 bits) of memory.

Dim lLastRow as Long
MatthewD
  • 6,719
  • 5
  • 22
  • 41
  • 1
    Gah! Of course I was looking at the wrong page. Thanks for the quick answer. +1 – DixieFlatline Jul 15 '15 at 17:04
  • 2
    @DixieFlatline Just an FYI, You can also access the last row at anytime by SourceSheet.UsedRange.Rows.Count and the last column by SourceSheet.UsedRange.Columns.Count – MatthewD Jul 15 '15 at 17:42
  • 1
    Thanks for the tip! I compared that with the method I was using and I noticed that mine only counts rows with data, and yours also counts rows with formatting. – DixieFlatline Jul 15 '15 at 20:09
  • 2
    @DixieFlatline [Actually `UsedRange` isn't reliable at all for that](http://stackoverflow.com/a/11169920/1188513) – Mathieu Guindon Apr 25 '16 at 21:31