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 Functionpatrick
			
				Dernière édition: 
			
		
	
								
								
									
	
		
			
		
		
	
	
	
		
			
		
		
	
								
							
							 
	 
 
		 
 
		 
 
		