Microsoft 365 VBA - Tester si une cellule est pointée par une formule - Antécédent

guigol

XLDnaute Junior
Bonjour,

Je cherche, je creuse, et je ne trouve pas.

J'ai à analyser plusieurs dizaines de fichiers truffés de formules.
J'ai identifié un certain nombre de cellules qui doivent contenir des formules.
et un certain nombre qui doivent être pointée par des formules.

printscreen.png


Pour les premières, pas de souci : --> si HasFormula renvoie True --> OK
Ici B3 me renvoie True

Par contre, pour les secondes, comment faire avec une macro?

j'aimerais que D4 me renvoie True et D6 aussi.
J'aimerais que D8 me renvoie False.

En sachant que mes fichiers contiennent plusieurs feuilles, et que les cellules peuvent être pointées par des formules positionnées sur d'autres feuilles.

Une idée?
 
Dernière édition:

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Guigol,
Dans Formules vous avez Repérer les antécédents.
donc pointez sur une cellule, cliquez sur Repérer les antécédents et XL vous montre les cellules qui interviennent sur la formule. Si une cellule vient d'une autre page XL vous l'indique avec un symbole de page.
Et vous avez pareil pour les dépendants, c'est à dire toutes les cellules qui utilisent la cellule que vous avez pointé.
Vous avez aussi Affiche les formules qui peut être bien pratique.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Effectivement, ce n'est pas un détail. Et ça limite beaucoup les solutions.
Je ne sais même pas s'il en existe une.
Pour des calculs simples, on pourrait faire la somme des nombres de la page.
Pour chaque cellule qui contient un nombre, sauvegarder ce nombre, mettre la cellule à zéro, refaire la somme de la matrice plus la valeur sauvegardée, on devrait trouver la même somme si cette valeur n'est pas utilisée. Puis remettre la valeur.
Mais quid des fonctions complexes comme SI ...
Il ne reste alors que l'analyse syntaxique, mais à c'est une autre histoire.
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Quelque chose comme ça :
VB:
Sub Cellulesformules()
Dim cellules As Range, Aire As Range, cel As Range
On Error Resume Next
Set cellules = ActiveSheet.UsedRange.SpecialCells(xlCellTypeFormulas, 23)
On Error GoTo 0
For Each Aire In cellules.Areas
    For Each cel In Aire
        Debug.Print "Cellule Examinée: " & cel.Address(), cel.Parent.Name
        Afficher cel, True
        Afficher cel, False
    Next
Next
End Sub

Sub Afficher(cellule As Range, Optional Dependantes As Boolean = True)
    Dim plage As Range, cel As Range
    On Error GoTo FIN
    If Dependantes Then Set plage = cellule.Dependents Else Set plage = cellule.Precedents
 
    Debug.Print , IIf(Dependantes, "Dépendantes:", "Précédentes:")
    For Each cel In plage
        Debug.Print , cel.Address(), cel.Parent.Name
    Next
FIN:
On Error GoTo 0
End Sub

Il y a aussi les objets DirectDependents et DirectPrecedents... Je vous laisse peaufiner à votre besoin
 

Pièces jointes

  • dependantesetprecedentes.xlsm
    15.8 KB · Affichages: 1

Discussions similaires

Statistiques des forums

Discussions
312 198
Messages
2 086 145
Membres
103 130
dernier inscrit
FRCRUNGR