Bonsoir,
je reste intrigué par le fait que cela fonctionne sans problème chez moi et que cela ne fonctionne pas chez toi.
une solution sans appel récursif.
Sub test()
Set ws1 = Worksheets("feuil1")
Dim pl%(), pile%(10000, 2), ctrl%()
maxl% = ws1.Cells(Rows.Count, 1).End(xlUp).Row
maxc% = ws1.Cells(6, Columns.Count).End(xlToLeft).Column
npl% = 0
ReDim pl(maxl, maxc)
For i% = 6 To maxl
For j% = 1 To maxc
If ws1.Cells(i, j) <> 0 And pl(i, j) = 0 Then
npl = npl + 1
pl(i, j) = npl
p% = 1
pile(p, 1) = i
pile(p, 2) = j
While p > 0
p1% = p
ws1.Cells(pile(p1, 1), pile(p1, 2)).Interior.ColorIndex = npl + 2
For ik% = -1 To 1
For jk% = -1 To 1
If ik = 0 Or jk = 0 Then
ii% = pile(p1, 1) + ik: jj% = pile(p1, 2) + jk
If ii > 5 And ii <= maxl And jj > 0 And jj <= maxc Then
If ws1.Cells(ii, jj) <> 0 And pl(ii, jj) = 0 Then
pl(ii, jj) = npl
p = p + 1
If p > maxp Then maxp = p
pile(p, 1) = ii
pile(p, 2) = jj
End If
End If
End If
Next jk
Next ik
If p1 = p Then p = p - 1
Wend
End If
Next j
Next i
MsgBox "taille max de la pile " & maxp & vbNewLine & "nombre d'ilots " & npl
ReDim ctrl(npl)
For k% = 1 To npl
Worksheets.Add after:=Worksheets(Worksheets.Count)
Worksheets(Worksheets.Count).Name = "ilot" & k
Next k
For i = 6 To maxl
For j = 1 To maxc
If pl(i, j) <> 0 Then
ctrl(pl(i, j)) = ctrl(pl(i, j)) + 1
Sheets("ilot" & pl(i, j)).Cells(ctrl(pl(i, j)), 1) = ws1.Cells(i, j)
End If
Next j
Next i
End Sub