Option Explicit
Function PartantDe(ByVal Lig As Long, ByVal Col As Range) As Range
Set PartantDe = ColUti(Col.Rows(Lig))
End Function
'
Function ColUti(ByVal PlageDép As Range, Optional ByVal LMin As Long, Optional ByVal CMin As Long) As Range
Rem. Cherche la partie utilisée d'une colonne ou d'un groupe de colonnes, c'est à dire s'étendant jusqu'à la dernière ligne du tableau Excel
' la contenant, à défaut jusqu'à la dernière cellule renseignée de plus qu'une chaîne vide.
' PlageDép: Cellule(s) de départ. Seule la 1ère ligne spécifiée est prise en compte pour la déterminer, et suffit donc pour VBA.
' Pour utilisation en formules, il est néanmoins nécessaire de spécifier la plage depuis celle ci jusqu'au reste des colonnes entières,
' sinon Excel risque de ne pas détecter la nécessité d'une réévaluation de formule suite à un changement dans le restant non spécifié.
' LMin: Mombre de lignes minimum à considérer même si tout est vide.
' CMin: Mombre de colonnes minimum à considérer même si tout est vide.
Dim LO As ListObject: Set LO = PlageDép.ListObject
If LO Is Nothing Then
Set ColUti = PlgUti(PlageDép, Intersect(PlageDép.Worksheet.UsedRange, PlageDép.EntireColumn), LMin, CMin)
Else
Set ColUti = PlageDép.Resize(LO.ListRows.Count + PlageDép.Row - LO.DataBodyRange.Row): End If
End Function
'
Function PlgUti(ByVal PlageDép As Range, Optional ByVal PlagExam As Range = Nothing, _
Optional ByVal LMin As Long, Optional ByVal CMin As Long) As Range
Rem. Cherche la partie utilisée d'une plage, c'est à dire celle qui s'étend jusqu'à la dernière cellule renseignée de plus qu'une chaîne vide.
' PlageDép: Plage de départ. Seule la 1ère cellule spécifiée est prise en compte pour la déterminer, et suffit donc pour VBA.
' Pour utilisation en formules, il est néanmoins nécessaire de spécifier la plage depuis celle ci jusqu'au reste des colonnes entières,
' sinon Excel risque de ne pas détecter la nécessité d'une réévaluation de formule suite à un changement dans le restant non spécifié.
' PlageExam: Plus grande plage susceptible de contenir la plage cherchée.
' Facultatif: UsedRange assumé par défaut.
' LMin: Mombre de lignes minimum à considérer même si tout est vide.
' CMin: Mombre de colonnes minimum à considérer même si tout est vide.
Dim LMax As Long, CMax As Long, NbL As Long, NbC As Long
On Error GoTo RienTrouvé
If PlagExam Is Nothing Then Set PlagExam = PlageDép.Worksheet.UsedRange
LMax = PlagExam.Find("*", PlagExam.Cells(1, 1), xlValues, xlWhole, xlByRows, xlPrevious).Row
CMax = PlagExam.Find("*", PlagExam.Cells(1, 1), xlValues, xlWhole, xlByColumns, xlPrevious).Column
On Error GoTo 0
NbL = LMax - PlageDép.Row + 1: If NbL < LMin Then NbL = LMin
NbC = CMax - PlageDép.Column + 1: If NbC < CMin Then NbC = CMin
If NbL < 1 Or NbC < 1 Then GoTo CEstToutVide
Set PlgUti = PlageDép.Resize(NbL, NbC)
Exit Function
RienTrouvé: Resume CEstToutVide
CEstToutVide: Set PlgUti = Nothing
End Function