Remonter l'emplacement d' une case où un changement a opéré

Fermé
veyron79 Messages postés 6 Date d'inscription jeudi 17 novembre 2016 Statut Membre Dernière intervention 18 novembre 2016 - Modifié par veyron79 le 17/11/2016 à 10:39
yg_be Messages postés 22731 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 avril 2024 - 18 nov. 2016 à 13:30
hello every body
Je suis heureux de faire partie de cette grande famille de CCM et je vient vers vous en espérant que vous puissiez m'aider
Je débute en vba et j'essaye d'exploiter worksheet change pour repérer une cellule où un changement à eu lieu valeur et texte
En sachant que ce qui m'intéresse ne peut être que sur la ligne 9 pas besoins donc de checker toute la page ;)
Merci les amis par avance
Cordialement





Seek knowledge 
A voir également:

4 réponses

eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 214
Modifié par eriiic le 18/11/2016 à 00:11
Bonjour,

Bien que la proposition de patrice soit à mon sens privilégier(Change sur les cellules à l'origine du recalcul), celle de yg_be m'a donné une autre idée :
Function detect()
    Dim feuil As String, cel As String
    feuil = Application.Caller.Parent.Name
    cel = Application.Caller.Address(False, False, xlA1)
    detect = 0
    Select Case feuil
    Case "feuil1"
        Case "C2" 'cellule de la formule supervisée
        ' traitement
        '....
    End Select
End Function

Et dans tes formules à superviser, en C2 par exemple :
=A2+B2+detect()

En tenant compte des limitations des fonctions : elles ne peuvent modifier leur environnement !
eric
En essayant continuellement, on finit par réussir. 
Donc plus ça rate, plus on a de chances que ça marche.(les Shadoks)
En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
2
veyron79 Messages postés 6 Date d'inscription jeudi 17 novembre 2016 Statut Membre Dernière intervention 18 novembre 2016
18 nov. 2016 à 08:30
Merci Eric, ta solution est élégante je trouve ! elle me pose tout de même un petit souci, j'essaye de l'adapter à mon besoin et je reviens vers toi
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 214
18 nov. 2016 à 08:43
Si tu peux avoir plusieurs classeurs d'ouverts il faudra sans ajouter le contrôle du classeur d'origine.
Les fonctions personnalisées ont le défaut d'être parfois appelées à tort du classeur actif même si elles n'y sont pas.
classeur=Application.Caller.Parent.Parent.Name
0
yg_be Messages postés 22731 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 avril 2024 1 477
18 nov. 2016 à 13:30
intéressant, mettre la fonction dans la cellule à superviser!
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 776
17 nov. 2016 à 11:43
Bonjour,

Exemple :
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range
  Set rng = Intersect(Target, Me.Rows(9), Me.UsedRange)
  If rng Is Nothing Then Exit Sub
  'Attention : Target peut désigner une plage de cellules
  MsgBox "Toutes les cellules modifiées : " & Target.Address & vbCrLf _
       & "Cellules de ligne 9 modifiées : " & rng.Address
End Sub

1
veyron79 Messages postés 6 Date d'inscription jeudi 17 novembre 2016 Statut Membre Dernière intervention 18 novembre 2016
17 nov. 2016 à 14:04
Salut Patrice33740
Merci pour ton aide :)
alors ta solution fonctionne super bien a condition que la modif soit faite à la main
cela implique que je n'ais pas été assez clair et je m'en excuse, en faite la modif détecté sera automatique car il s'agit d'une cellule ou on fait un calcule qui dépend d'autres cellules
en d'autres terme imaginons que A9 = B1 + C1, ce qui m'intéresse est de détecté uniquement que A9 à bien été mise à jour sans remonter les valeurs que je met dans B1 et C1 car j'ai un tableau qui affichera donc ce résultat
Merci :)
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 776 > veyron79 Messages postés 6 Date d'inscription jeudi 17 novembre 2016 Statut Membre Dernière intervention 18 novembre 2016
17 nov. 2016 à 17:44
Bonjour,

Les cellules dont le résultat change lors du calcul n'activent pas l'évènement change (heureusement, car ça n'arrêterait pas !).
Seules le cellule modifiées (dans ton exemple B1 et C1) activent l'évènement Change.

Si tu connais les formules, le plus simple est de surveiller les cellules sources (les antécédents), leur modification entraine une modification du résultat de la formule.

Dans le cas contraire, c'est beaucoup plus compliqué : il faut analyser chaque formule pour rechercher tous les antécédents (et les antécédents de ces antécédents, et les antécédents de ces antécédents, et ...) et surveiller toutes ces cellules.
De plus, si un ou plusieurs antécédents se trouvent sur une autre feuille, c'est l'évènement change du classeur (Workbook_SheetChange) qu' il faut utiliser.

Cdlt
0
veyron79 Messages postés 6 Date d'inscription jeudi 17 novembre 2016 Statut Membre Dernière intervention 18 novembre 2016
18 nov. 2016 à 08:31
Merci patrice pour ton aide, je suis en train d'essayer les solution alternative proposées plus bas
Merci encore une fois pour ton aide :)
0
yg_be Messages postés 22731 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 avril 2024 1 477
17 nov. 2016 à 19:57
Si tu veux provoquer une action quand la valeur d'une cellule de B9 à F9 change, tu pourrais utiliser la technique suivante :
1) tu crées une fonction en VBA, exemple :
Option Explicit
Function detection_mouvement(Target As Range) As String
MsgBox "bougé"
detection_mouvement = "vu!"
End Function

2) dans une cellule quelconque (non utilisée) de ta feuille, tu enregistres la formule
=detection_mouvement(B9:F9)

La fonction sera appelée chaque fois qu'il y a un changement d'une cellule de B9 à F9.
Si tu souhaites savoir dans la fonction quelle est la cellule qui a été modifiée, tu peux enregistrer dans plusieurs cellules une formule avec la fonction, chaque fois pointant vers une cellule unique. Tu peux alors utiliser la variable Target plus ou moins comme Patrice33740 te le proposait.
1
veyron79 Messages postés 6 Date d'inscription jeudi 17 novembre 2016 Statut Membre Dernière intervention 18 novembre 2016
18 nov. 2016 à 08:28
Merci yb_be, pour ta solution, j'essaye de l'adapter à mon besoin et je reviens vers toi pour te dire ce qu'il en ais
0
veyron79 Messages postés 6 Date d'inscription jeudi 17 novembre 2016 Statut Membre Dernière intervention 18 novembre 2016
Modifié par veyron79 le 18/11/2016 à 10:46
En fait je n'ais qu'un seul classeur d'ouvert mais mon problème n'est pas là,
je vais devoir développer plus en détail mon utilisation afin que vous compreniez mon souci

j'ai utilisé les deux solution Eric et yg_be pour arriver à mes fins mais c'est toujours pas ça

pour comprend il faut savoir que mon fichier excel contien 3 feuilles fixes :
Summary / Global result / modèle
l'utilisateur du fichier vas donc par des macro que j'ai faites; ajouter des feuilles : test1, test2 ....etc
ces testX sont des copie de modèle qu'il va personnaliser à sa sauce plus tard
dans chaque feuille de test il a la possibité d'ajouter des lignes donc des tests à faire et des colonnes ( des version de soft à tester )
le tout se fait par des macro que j'ai faite au préalable dans Summary.
Dans ces TestX il y'a le resultat de chaque test fait et un case qui calcule le poucentage de réussite de ces test et remonte si les test on été réalisé et leur succé.
ces case sont toute dans la ligne 9 elle contiennent la formule suivante qui permet d'afficher un resultat global des test fait

=SI(G12=0;"NOT TESTED";SI(G11<=40;CONCATENER("NOK";CAR(10);"[";(100-G11);"%]");CONCATENER("OK";CAR(10);"[";G11;"%]")))

et mon but est de mettre à jour l'onglet GR qui regroupe les resultat de toutes les feuilles de test et n'affiche que le resultat
je veux donc raffréchir les bonnes case de cette onglet au moment ou une des feuilles TestX on été mis à jour

en utilisant la solution de Eric j'ai ajouter la fonction detecter() dans la formule plus haut
(100-G11+detecter());"% .... et .... );"[";G11+detecter();"%]")))

déjà les résultats ne s'affiche plus !! j'ai des #Valeur ! ce qui m'embete un peu
et voici comment j'ai adapter la fonction de Eric :


Function detect()

Dim ActualCellToUploadGR
Dim ActualSheetToUploadGR
Dim TestSheetPosition
Dim LineGR
Dim CellContent

Call InitTabAlphaNum ' remplissage du tablea AlphaNum par les lettre de l'Alphabet qui represente les colonnes
ActualSheetToUploadGR = Application.Caller.Parent.Name
ActualCellToUploadGR = Application.Caller.Address(False, False, xlA1)
TestSheetPosition = (Range("F1") - 3) ' cette case contient la formule =feuille() je connais donc la position exacte de cette feuille dans le classeur
CellContent = Range(ActualCellToUploadGR)
Select Case ActualCellToUploadGR
Case "G9"
LineGR = 5
Case "I9"
LineGR = 6
Case "K9"
LineGR = 7
Case "M9"
LineGR = 8
Case "O9"
LineGR = 9
Case "Q9"
LineGR = 10
Case "S9"
LineGR = 11
Case "U9"
LineGR = 12
Case "W9"
LineGR = 13
Case "Y9"
LineGR = 14
End Select

detect = 0
Sheets("Global result").Select
Range(TabAlphaNum(5 + TestSheetPosition) & LineGR) = CellContent
Sheets(ActualSheetToUploadGR).Select

End Function

mais cela ne fonctionne pas ...
et je constate que la fonction est appeler plusieurs fois si je met à jour une des feuilles Testx je ne comprend pas pourquoi ..

je tiens à souligner que ça fait moins d'un mois que je fait du VBA donc avant de m'insulter rappelez vous ce point et soyez indulgent ;)

Seek knowledge 
-1
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 214
Modifié par eriiic le 18/11/2016 à 11:18
Déjà le principe de cette fonction n'est pas d'être présente plusieurs fois dans une même formule.
Si tu as une cellule avec formule dont tu désires savoir si elle a été ré-évaluée et bien tu ajoutes une fois +detect() à la fin.
On se demande ce que Call InitTabAlphaNum vient y faire. Pas besoin d'un tableau pour trouver une lettre à partir d'un nombre. Lettre dont tu n'as pas besoin d'ailleurs, tu as Cells(ligne,colonne) qui est prévu pour.
A plusieurs reprises tu récupères le contenu d'un range sans préciser la feuille, ça ne peut t'amener que des déboires.
Sheets("Global result").Select 
Range(TabAlphaNum(5 + TestSheetPosition) & LineGR) = CellContent

Je t'ai dit qu'une fonction ne pouvait pas modifier son environnement.

Ca fait quand même beaucoup...
Tu débutes en vba et tu ne maitrises ni ne comprend pas tous les tenants et aboutissants.
De plus on ne sait même pas de quelles feuilles il s'agit dans tes explications, ni ce que tu veux faire exactement et tu t'avères incapable de fournir un fichier exemple pour exposer ta problématique. Il y a sans doute plusieurs façons d'y arriver de façon beaucoup plus standards et logiques que le choix que tu as fait pour résoudre un problème qui n'existe peut-être pas.
Donc je retire ma réponse et n'en fournirait pas d'autre sans connaissance exacte de ta problématique.

Tu as une formule qui utilises G11 et G12, utilise l'événement Change sur ces cellules.
Ou bien à l'activation de "Global result" tu mets à jour cette feuille tout simplement.
eric
0