Finding the longest contiguous 1-d array of 0's

M

MJW

Hi All,

Ok, I can't think of any remotely-easy way to do this. My data exists as
such: accounts listed in the rows, dates (by month) listed in the columns;
in the fields corresponding to each account/dates is the quantity of items
the account purchased in that month.

Is it formulaically possible (barring VBA) to have Excel calculate the
longest contiguous string of zero-value cells for each row? (What I'm
trying to discern is a historical gap-analysis for the longest no-purchase
period of a given row/account.) Any thoughts or suggestions are greatly
appreciated, as always.

Thanks,

Jamie W.
 
H

Herbert Seidenberg

Assume you have a list like this:
XYZ 2 0 4 0 0 6 0 0 0 1
RST 1 0 0 0 0 4 3 0 0 1
MNO 4 7 0 0 0 0 0 4 0 2

Define this 3x11 array as MyArray.
Define another adjacent 3x11 array as MyAccu.
Insert > Name > Define > CSet and RSET respectively
=COLUMN(INDEX($1:$1,,1):INDEX($1:$1,,COLUMNS(MyArray)))
=ROW(INDEX($A:$A,1,):INDEX($A:$A,ROWS(MyArray),))
Tools > Options > Calculations > Iterate > 11 (your number of columns)
Select MyAccu and enter this array formula:
=IF(INDEX(MyArray,RSet,CSet-1)=0,INDEX(MyAccu,RSet,CSet-1)+1,0)
Adjacent, select a 3x1 column and enter this array formula:
=MAX(INDEX(MyAccu,RSet,))
The result should look like this:
0 0 0 1 0 1 2 0 1 2 3 3
0 0 0 1 2 3 4 0 0 1 2 4
0 0 0 0 1 2 3 4 5 0 1 5
You can hide MyAccu if desired.
The last column will show the maximum number
of adjacent 0's in a row in MyArray
Caveat: The last date is ignored to make things simple.
 
D

Don Guillett

Try this where text in col a and numbers in col 2-11
Sub findlongestzeros()
For i = 1 To Cells(Rows.Count, "a").End(xlUp).Row
mc = 0
For j = 2 To 11
If Cells(i, j) = 0 And Cells(i, j + 1) = 0 Then mc = mc + 1
Next j
'MsgBox mc
If mc > mss Then
mss = mc
mr = i
End If
Next i
MsgBox "Max is Row " & mr
'MsgBox mss
End Sub
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top