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 23473 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 février 2025 - 18 nov. 2016 à 13:30
yg_be Messages postés 23473 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 février 2025 - 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
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:
- Remonter l'emplacement d' une case où un changement a opéré
- Changement dns - Guide
- Aller à la ligne dans une case excel - Guide
- Changement d'écriture - Guide
- Changement carte graphique - Guide
- Changement clavier azerty - Guide
4 réponses
eriiic
Messages postés
24603
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
15 décembre 2024
7 254
Modifié par eriiic le 18/11/2016 à 00:11
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 :
Et dans tes formules à superviser, en C2 par exemple :
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
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
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 779
17 nov. 2016 à 11:43
17 nov. 2016 à 11:43
Bonjour,
Exemple :
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
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
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 :)
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 :)
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 779
>
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
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
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
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
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 :)
Merci encore une fois pour ton aide :)
yg_be
Messages postés
23473
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
18 février 2025
Ambassadeur
1 568
17 nov. 2016 à 19:57
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 :
2) dans une cellule quelconque (non utilisée) de ta feuille, tu enregistres la formule
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) 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.
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
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
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
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
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
eriiic
Messages postés
24603
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
15 décembre 2024
7 254
Modifié par eriiic le 18/11/2016 à 11:18
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.
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
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
18 nov. 2016 à 08:30
18 nov. 2016 à 08:43
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
18 nov. 2016 à 13:30