Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2021 VBA - Visualiser les références circulaires

  • Initiateur de la discussion Initiateur de la discussion Dudu2
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Dudu2

XLDnaute Barbatruc
Bonjour,

Je modifie le sujet...

Excel affiche les flèches des références circulaires quand il en a envie.
Sur la dernière référence circulaire de la dernière feuille si j'en crois ce que je vois.
Je n'ai pas trouvé dans le ruban un bouton pour le faire.

Comment contrôler la zone sur laquelle Excel dessine les flèches des références circulaires ?

Merci par avance.
 
Dernière édition:
Solution
Bonjour,

Finalement j'ai modifié le code pour trouver le même résultat qu'Excel, comme ça pas de discussion.

Non seulement je peux afficher les flèches Excel où je veux et en plus je sais retrouver par avance les cellules Excel de TOUTES les références circulaires. Pas belle la vie ?
A force de bricoler sur la feuille, j'ai constaté que la touche <Suppr> modifiait parfois la zone où se forment les flèches mais c'est relativement aléatoire bien que ça se distribue assez régulièrement parmi les différentes références circulaires.

Donc j'ai fait ce code qui marche à peu près pour sélectionner la zone où on veut les flèches d'Excel.
En attendant mieux !
 

Pièces jointes

Bonjour
tu es encore la dessus toi
la réponse est non ce menu es un menu de XMLType/tag "DynamicMenu" qui est remplie l'ors du drop donc au repos il ne contient rien
par contre par vba tu peut te faire un script
en voici une demo
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
testé et approuvé

circulez les refs y a rien a voir
je lui ai donné un nom anglosandwitchs ça plait à @Dudu2 ça 🤣 🤣
LOL
 
Dernière édition:
Ok merci @patricktoulon pour la confirmation qu'on ne peut pas récupérer le contenu de la fenêtre, dommage, ça éviterait bien des prises de tête.

Ton code est assez violent avec le contenu de la feuille. Mais c'est le principe qu'il met en œuvre, donc RAS.
Je ne peux pas faire ça car problème c'est de démarrer avec ActiveSheet.CircularReference qui ne rend que la 1ère et il me les faut toutes.

J'ai donc dû développer un code qui trouve les Références Circulaires comme Excel dans sa liste du ruban, même s'il y en a plusieurs sur la feuille.
Ce n'est pas tout à fait simple car la méthode Range.Precedents retourne TOUS les précédents (en chaine) ce qui ne permet pas l'analyse des Références Circulaires mode Excel. La méthode StackOverflow fonctionne mais identifie plus de cellules qu'Excel.

Il faut développer une fonction que retourne uniquement les précédents directs de la cellule et une fonction récursive pour identifier le path d'une Référence Circulaire à la manière d'Excel. Je mettrai le code quand ce sera vérifié et mis au propre.
 
je ne vois pas ce qui te dérange dans mon code ,il fait exactement ce que le menu que tu cherche a trifouiller fait
il n'a rien de plus violent qu'a l'origine

a savoir
  • bloque les events quand il est développé(normal il est semie modal )
  • bloque les refs circulaires ( en bloquant le calcul iteratif(voir option excel))
  • les listes
  • et débloque tout
terminé
passer par les précédent et ou antécédent tu a pas fini par ce que là tu est obligé d'examiner tout le usedrange et punaise je plains celui qui va te faire le code d'examen string des formules par ce que les précédents ou antécédent peuvent être n'importe ou dans les formules et si des formules de 3.123456789 kilomètres comme on dit chez nous "BON! CHANCE" 😉 😉

mais c'est un défi honorable
 
re:
je précise les commentaires :
lit bien les comm'
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
        'ActiveSheet.CircularReference donne TOUJOURS !! la premiere  ref circulaire
     ' donc je la demande
    
     Set circs = ActiveSheet.CircularReference 'on capte la première
        
        If circs Is Nothing Then Exit Do 'SI!!! il y en a pas ou !! plus on sort
        
        ' Mémorise la formule et l’adresse
        If Not memoire.Exists(circs.Address(External:=True)) Then 'si dans le dico elle existe pas
            
            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
        
        '**********************************************
        'IMPORTANT A COMPRENDRE
        ' ICI ON COMMENTE LA FORMULE POUR LA BLOQUER
        ' sinon au prochain tours il me redonne la même puisque CircularReference me donne toujours la premiere
        ' et c'est normal puisque dans ce cas normalement tu a un message excel qui arrête forcement le calculate quand il calcule une ref circulaire
        'donc ca va pas plus loin que la première
        circs.Formula = "'" & circs.Formula ' on commente la formule pour quelle ne soit pas trouvée au prochain tour
        '*********************************************
        
        'ici on calculate mano mano pour faire comprendre dans le stack excel que la cellule n'a plus la formule avec ref circulaire
        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  donc il prendra forcement la suivante au prochain tour
    
    'voila le petit tour est fini  on apasser en revues toutes les refs circulaires on les a stoké
    
    ' ben maintenant on les remet les formules pour revenir a l'initiale
    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 ca tu connais
    With Application: .Calculation = xlCalculationAutomatic: .ScreenUpdating = True: End With
    
    ' si y a pas ben ...bye bye!!
    If refs.Count = 0 Then
        
        MsgBox "Aucune référence circulaire.", vbInformation
    
    Else
        
        'sinon on compile les addresse de refs circulaire on les transfert de la collects vers un tableau variant()
        ReDim tbl(1 To refs.Count)
        For i = 1 To refs.Count
            tbl(i) = refs(i)
        Next i
        GetCircularReference = tbl
    End If
End Function
 
Ok, merci pour tes commentaires.

De mon coté, j'ai codé pour retrouver les références circulaires à la sauce Excel.
En fait dans le cas complexe du tableau rouge, j'en trouve même une supplémentaire qui me semble valable qu'Excel ne donne pas.

Ce fichier contient les 2 méthodes (StackOverflow et @Dudu2), je pourrais même en ajouter une 3ème consistant à chercher par dichotomie les cellules des flèches Excel.

Au final, il n'y a que peu de différence entre les 2 méthodes et pour simplement montrer des référence circulaires, la méthode StackOverflow est probablement suffisante (plus courte, moins complexe), d'autant que le code activé sur la touche F7 permet d'afficher les flèches Excel dans la zone sélectionnée et donc de récupérer les cellules concernées via le ruban.
 
Bonjour,

Finalement j'ai modifié le code pour trouver le même résultat qu'Excel, comme ça pas de discussion.

Non seulement je peux afficher les flèches Excel où je veux et en plus je sais retrouver par avance les cellules Excel de TOUTES les références circulaires. Pas belle la vie ?
 

Pièces jointes

Les touches F5, F6 et F7 sont définies sur la fonction Aut😵pen(). Ça passe chez toi cette fonction ?
Sinon à mettre dans la Classe Workbook.

Les flèches sont celles qu'Excel affiche un peu où il veut (*). Ce sont les flèches des références circulaires et lorsqu'elles sont affichées on a la liste Excel des cellules correspondantes dans le ruban (Formules / Vérifications des erreurs / Références circulaires).

(*) Et c'est la raison d'être de la touche F7 qui provoque jusqu'à 100 tentatives pour afficher ces foutues flèches où on le souhaite.
 
testé sur le fichiers du posts 11
et si je fait appel au menu simplement
il me donne une cellule qui n'a rien mais qui est fusionnée
et pour le coup dans le menu comme il me donne Feuil1!C5 alors que il n'y a pas de Feuil1, je me pose des questions si il n'y a pas un stack xml dans le fichier excel qui ne serait éventuellement pas déchargé qui contiendrait eventuellement du travail precedent sur la feuil 1 que tu a visiblement supprimé
donc la pour le coup Tout est faux
et pour les fleches je crois qu'il y a confusion en dépendants et circulaire (j'ai regardé les formules )et certaines désignées par les flêches ne sont pas circulaire
du coup je vois plus très bien ce que tu cherche a obtenir

d'autres part même ma fonction qui ne fait que chopper les circulaire EXPLICITEMENT me les donnes pas toute
cela renforce mon idée du stack qui n'est pas déchargé
parti de la difficile de faire quoi que ce soit
et pour peu que le calcul itératif n'y soit pas pour rien aussi
ça veut dire que le regards sur les circulaire ne peut fonctionner réellement que si le calcul itératif est stoppé
bref ça soulève plus de supputations que de résultats concrêts



quand je regarde les formules du tableau je me demande en quoi les refs sont circulaires
que certaines soient dépendantes ok mais circulaires non
exemple concrêt
L16 multiplie L14*L15 en quoi elle est circulaire ????
L11 multiplie L16*0.5 en quoi elle est circulaire ??????
il y a oui une dépendance mais pas de circulaire
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
1
Affichages
794
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…