VBA count des cellules consécutives non vides dans une colonne, à partir d'une donnée: doit traiter des cas spéciaux

J'ai des difficultés avec une tâche apparemment banale. J'écris une fonction qui, à partir d'une cellule, count toutes les cellules consécutives non vides ( y compris la première), ou s'arrête au cas où un nombre de cellules Ncells optionnel a été atteint. C'est ce que j'ai préparé:

Function CountCells(Row As Long, Column As Long, Optional Ncells As Variant, _ Optional sht As Worksheet) As Long Dim I As Long Dim xlsht As Worksheet ' ' set target worksheet ' If sht Is Nothing Then Set xlsht = ActiveSheet Else Set xlsht = sht End If If IsMissing(Ncells) Then Ncells = xlsht.Rows.Count End If With xlsht I = .Cells(Row, Column).End(xlDown).Row If I > Ncells Then I = Ncells End With CountCells = I - Row + 1 End Function 

Cela m'a l'air sympa, mais il échoue de façon spectaculaire si la première cellule située au-dessous de la cellule de départ xlsht.Cells (Row, Column) est vide. J'aimerais que CountCells renvoie 1 dans ce cas, mais il renvoie le nombre de cellules vides consécutives à la première non vide ou à la fin de la colonne. Le même résultat est obtenu si la cellule de départ est vide; dans ce cas, je dirais que l'user utilise la fonction de manière incorrecte, mais disons que la valeur de return doit être 0. Pouvez-vous m'aider? Merci,

meilleur

deltaquattro

EDITER un user a demandé un exemple. Comme il semble que les feuilles de calcul ne peuvent pas être jointes aux publications, je donne un lien vers Google Drive https://docs.google.com/file/d/0BxB-VPeuApOkeThFZUJ3X2hyTGs/edit?usp=sharing

.End(xlDown) a le même comportement qu'en appuyant sur Ctrl + flèche vers le bas .

Lorsque vous êtes dans la dernière cellule dans une zone non vide, le slider sautera à la première cellule de la zone non vide vide suivante.

Vous devez gérer cette affaire:

 If row > Ncells Then If xlsht.Cells(Row+1, Column).Value = Empty Then CountCells = 1 Exit Function End If 

Fin si

Notez que le nom Ncells induit par erreur, c'est vraiment un MaxRow .