patricktoulon
XLDnaute Barbatruc
Bonjour à tous
une demande recente a été faite sur ce point par @Dudu2
comment lister les reference circulaires d'une feuille ou celle qui son inscrit dans le menu dans le ruban onglet formules
1° ma réponse est simple
lire les données de ce contrôle du ruban n'est pas possible car ce menu est de type XMLtypeTag "DynamicMenu"(voir les démos du creatorRibbonX sur ce contrôle menu un peu particulier )qui se charge lors du drop "invalidatecontentOnDrop" sans invalidate du ruban
du coup cette piste on peut oublier(c'est comme si on fouillait une boite vide)
par contre excel a depuis 2003 la possibilité en vba de lister les références circulaires avec le membre .CircularReference
d'une feuille
sauf que il donne que la première
que ce vous tienne
on va lister et a chaque ref circulaire trouvées on commente la formule (bloque la formule)
ainsi si on relance il passe a la suivante etc.. etc...
une fois toute les ref circulaire trouvées et listée dans une collection /dico ,on sort de la boucle et on débloque les formules
nous reste plus a dimensionner un tableau a la collection et renvoyer un tableau d'addresse style macro4 (pour le fun)
et voila comment née une fonction
patrick
une demande recente a été faite sur ce point par @Dudu2
comment lister les reference circulaires d'une feuille ou celle qui son inscrit dans le menu dans le ruban onglet formules
1° ma réponse est simple
lire les données de ce contrôle du ruban n'est pas possible car ce menu est de type XMLtypeTag "DynamicMenu"(voir les démos du creatorRibbonX sur ce contrôle menu un peu particulier )qui se charge lors du drop "invalidatecontentOnDrop" sans invalidate du ruban
du coup cette piste on peut oublier(c'est comme si on fouillait une boite vide)
par contre excel a depuis 2003 la possibilité en vba de lister les références circulaires avec le membre .CircularReference
d'une feuille
sauf que il donne que la première
que ce vous tienne
on va lister et a chaque ref circulaire trouvées on commente la formule (bloque la formule)
ainsi si on relance il passe a la suivante etc.. etc...
une fois toute les ref circulaire trouvées et listée dans une collection /dico ,on sort de la boucle et on débloque les formules
nous reste plus a dimensionner un tableau a la collection et renvoyer un tableau d'addresse style macro4 (pour le fun)
et voila comment née une fonction
VB:
Sub test()
Dim X
X = GetCircularReference
MsgBox Join(X, vbCrLf)
End Sub
Function GetCircularReference() As Variant
'fonction patricktoulon
'Recherche de ref circulaire et listage dans un tableau excel 2003 a excel 2024
Dim circs As Range, refs As Collection, fml As String, cell As Range, memoire As Object
With Application: .ScreenUpdating = False: .Calculation = xlCalculationManual: .CalculateFullRebuild: End With
Set memoire = CreateObject("Scripting.Dictionary")
Set refs = New Collection
Do
Set circs = ActiveSheet.CircularReference 'on capte la première
If circs Is Nothing Then Exit Do 'on sort il y en a pas
' Mémorise la formule et l’adresse
If Not memoire.Exists(circs.Address(External:=True)) Then
refs.Add circs.Address(External:=True) 'si elle n'existe pas on l'ajoute a la collection
memoire(circs.Address(External:=True)) = circs.Formula 'et on memorise dans le dico address/ref circulaire pour les remttre après
End If
circs.Formula = "'" & circs.Formula ' on commente la formule pour quelle ne soit pas trouvée au prochain tour
Application.Calculate 'on calculate pour pour que la feuille soit a jour en terme d'absence ou presence de ref circulaire
Loop 'et on tourne il prendra la suivante
' on remet le formules c'est pas compliqué a comprendre
For Each cell In ActiveSheet.UsedRange
If memoire.Exists(cell.Address(External:=True)) Then cell.Formula = memoire(cell.Address(External:=True))
Next
'on debloque tout
With Application: .Calculation = xlCalculationAutomatic: .ScreenUpdating = True: End With
' si y a pas bye bye!!
If refs.Count = 0 Then
MsgBox "Aucune référence circulaire.", vbInformation
Else
'sinon on compile les addresse de refs circulaire
ReDim tbl(1 To refs.Count)
For i = 1 To refs.Count
tbl(i) = refs(i)
Next i
GetCircularReference = tbl
End If
End Function
patrick
Dernière édition: