Option Explicit
Private ClnCirc As Collection, CelRef As Range
Sub Test()
Dim Cel As Range, TRapport() As String, N As Integer
Set ClnCirc = New Collection
Set CelRef = ActiveSheet.CircularReference
If CelRef Is Nothing Then
MsgBox "Pas de référence circulaire.", vbInformation
Else
PrécédentCirc
ReDim TRapport(1 To ClnCirc.Count)
For Each Cel In ClnCirc
N = N + 1: TRapport(N) = Cel.Address(False, False, External:=True)
Next Cel
MsgBox "Circulaires :" & vbLf & Join(TRapport, vbLf), vbExclamation
End If
End Sub
Function PrécédentCirc(Optional ByVal Cel As Range) As Boolean
Dim CelPr As Range, RngPr As Range
If CelRef Is Nothing Then Exit Function
If Cel Is Nothing Then Set Cel = CelRef: ClnCirc.Add Cel, Key:=Cel.Address(False, False, External:=True)
On Error Resume Next
Set RngPr = Cel.DirectPrecedents
If Err Then Exit Function
On Error GoTo 0
If RngPr Is Nothing Then Exit Function
For Each CelPr In RngPr
If CelPr.Address(External:=True) = CelRef.Address(External:=True) Then PrécédentCirc = True: Exit For
If PrécédentCirc(CelPr) Then PrécédentCirc = True: Exit For
Next CelPr
If PrécédentCirc Then
On Error Resume Next
ClnCirc.Add Cel, Key:=Cel.Address(External:=True), Before:=1
End If
End Function