Determine max number of characters in any cell in a column in excel, using VBA

Using VBA, I need to determine the maximum number of characters in a column of anywhere from 20,000 to 200,000 records, using VBA.

I found a reference that indicates I can do this with an Array function in a cell by doing something like:  =MAX(Len(A1:A20000))) and then hitting Ctrl-Shift-Enter  which wraps the function in { }, but I need to do this in code, and need to do it for multiple columns, so it would be great if the solution involved a column# rather than an alpha representation of the column.
LVL 51
Dale FyeOwner, Developing Solutions LLCAsked:
Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Saqib Husain, SyedEngineerCommented:
Try this

col = 3
rw = 2000
Range("A1").FormulaArray = "=max(len(r1c" & col & ":R" & rw & "C" & col & "))"
0
Dale FyeOwner, Developing Solutions LLCAuthor Commented:
Any way to do that without pushing the value to a cell first, just going straight to a variable:

intMaxColLen = ????
0
aikimarkCommented:
@ssaqibh

Unfortunately, you can't use worksheetfunctions, since the Len() function is not a worksheet function.

You can create a user defined function for this.
Option Explicit

Public Function MaxLen(parmRange As Range) As Long
    Dim strItem As String
    Dim lngMaxLen As Long
    Dim lngLen As Long
    Dim rngCell As Range
    lngMaxLen = Len(parmRange.Cells(1, 1).Value)
    For Each rngCell In parmRange
        lngLen = Len(rngCell.Value)
        If lngMaxLen < lngLen Then
            lngMaxLen = lngLen
        Next
    Next
    MaxLen = lngMaxLen
End Function

Open in new window

You can get even more performance if you copy the range into a variant array and iterate the array.  This is the inverse of the technique I showed in my Fast Data Push to Excel article.
http://www.experts-exchange.com/A_2253.html
0
Exploring ASP.NET Core: Fundamentals

Learn to build web apps and services, IoT apps, and mobile backends by covering the fundamentals of ASP.NET Core and  exploring the core foundations for app libraries.

byundtMechanical EngineerCommented:
LEN is a perfectly valid worksheet function, so saqibh's approach will definitely work.

Rather than troll through an entire column of cells, it is more efficient to restrict it to the used range. I modified aikimark's function to do just that, adding in his suggestion of copying the range into a variant.
Public Function MaxLen(parmRange As Range) As Long
    Dim lngLen As Long
    Dim v As Variant, vData As Variant
    vData = Intersect(parmRange.Worksheet.UsedRange, parmRange).Value
    For Each v In vData
        If Len(v) > lngLen Then lngLen = Len(v)
    Next
    MaxLen = lngLen
End Function

Open in new window

0
Saqib Husain, SyedEngineerCommented:
Not very elegant but to avoid the loop I would have tried something like

col = 3
rw = 20000
tmp = Cells(1, col + 1).FormulaR1C1
Cells(1, col + 1).FormulaArray = "=max(len(r1c" & col & ":R" & rw & "C" & col & "))"
intMaxColLen = Cells(1, col + 1).Value
Cells(1, col + 1).FormulaR1C1 = tmp
0
aikimarkCommented:
when I wrote that you can't use worksheet functions, I meant that in the context of a VBA routine.  There is certainly a Len() function that can be used in a formula.
0
Rory ArchibaldCommented:
You could use Evaluate:

Sub GetLength(lColumn As Long)
   MsgBox Evaluate("MAX(LEN(" & Application.ConvertFormula("R1C" & lColumn & ":R20000C" & lColumn, xlR1C1, xlA1) & "))")
End Sub

Open in new window


Of course, you could pass the row number as well rather than using a fixed number, or pass a range using Cells if you only have a column Number.
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
byundtMechanical EngineerCommented:
Rory,
I get a type mismatch with your code in Excel 2013 whenever there are more than 255 cells being tested. Your sub works when there are 255 or fewer cells being tested.

Brad
0
Rory ArchibaldCommented:
Brad,

I can't reproduce that. Just ran a quick test with 800 odd cells populated in a column with no problems. Can you provide a workbook?

Rory
0
byundtMechanical EngineerCommented:
Rory,
The type mismatch occurred in Excel 2013 when I ran your macro from the Immediate pane command line. But when I ran it from a command button on the worksheet in response to your Comment requesting a workbook, your code worked. Hmm...

So I rebooted my computer (both Mac and Parallels), and now your code works both on the Immediate pane command line and when called from a worksheet command button. It also works when I turn your one-liner into a UDF called from a worksheet formula.

My computer must have had some corruption that was cured by rebooting.

I apologize for the false accusation.

Brad
0
Rory ArchibaldCommented:
No worries. :)
0
Dale FyeOwner, Developing Solutions LLCAuthor Commented:
This worked well, since I already had the workbook open and knew how many rows to include in the string.

Thanks, Rory.
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Microsoft Excel

From novice to tech pro — start learning today.