Difficulté avec Sub Worksheet_SelectionChange
Résolu
yeye44
Messages postés
20
Date d'inscription
Statut
Membre
Dernière intervention
-
eriiic Messages postés 24603 Date d'inscription Statut Contributeur Dernière intervention -
eriiic Messages postés 24603 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Je suis novice en Excel et suite à un problème j'ai finis par réutiliser un programme déjà proposé sous un forum.
Je l'ai appliqué et ça marche bien :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = "F6" Then
If Target.Value = [M6] Then Target.Value = ""
ElseIf Range("F6").Value = "" Then
Range("F6").Value = [M6]
End If
End Sub
Par défaut la valeur de f6 est celle contenu dans m6. Si je click sur f6 je peut changer la valeur. En supprimer ensuite le contenu de f6 la macro réaffiche dans f6 la valeur contenu dans m6 (par défaut).
Mon problème est que je veux faire ça sur un grand nombre de ligne.
QUESTION 1 :
Il n'y a-t'il pas un moyen pour ecrire toute les lignes d'un coup ?
Du type :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = "F6:F100" Then
If Target.Value = [M6:M6] Then Target.Value = ""
ElseIf Range("F6:F100").Value = "" Then
Range("F6:F100").Value = [M6:M100]
End If
End Sub
Je vous rassure, c'est un idée de ma part que je propose, donc ça ne marche pas du tous.
QUESTION 2 :
Je n'ai pas fini mon tableur et je serais amené à insérer des lignes et des colonnes plutard.
Comment faire pour que mes noms de cellules dans ma macro suivent le mouvement des mes cellules dans mon tableau. J'ai éssayer les dollars partous, mais ça ne marche pas.
Enfin pour savoir si j'ai bien compris ce que j'ai copier/coller, est-ce vrai que :
Private Sub Worksheet_SelectionChange(ByVal Target As Range) '= nom de la fonction'
If Target.Address = "F6" Then '= si je click sur f6'
If Target.Value = [M6] Then Target.Value = "" '=si la valeur lu est déjà celle contenu dans m6 alors la valeur de m6 est nulle ???????'
ElseIf Range("F6").Value = "" Then
Range("F6").Value = [M6] '=sinon si le contenu de f6 est nul alors mais la valeur de m6 dans f6'
End If
End Sub
Visiblement j'ai du mal.
Je vous remercie !
Je suis novice en Excel et suite à un problème j'ai finis par réutiliser un programme déjà proposé sous un forum.
Je l'ai appliqué et ça marche bien :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = "F6" Then
If Target.Value = [M6] Then Target.Value = ""
ElseIf Range("F6").Value = "" Then
Range("F6").Value = [M6]
End If
End Sub
Par défaut la valeur de f6 est celle contenu dans m6. Si je click sur f6 je peut changer la valeur. En supprimer ensuite le contenu de f6 la macro réaffiche dans f6 la valeur contenu dans m6 (par défaut).
Mon problème est que je veux faire ça sur un grand nombre de ligne.
QUESTION 1 :
Il n'y a-t'il pas un moyen pour ecrire toute les lignes d'un coup ?
Du type :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = "F6:F100" Then
If Target.Value = [M6:M6] Then Target.Value = ""
ElseIf Range("F6:F100").Value = "" Then
Range("F6:F100").Value = [M6:M100]
End If
End Sub
Je vous rassure, c'est un idée de ma part que je propose, donc ça ne marche pas du tous.
QUESTION 2 :
Je n'ai pas fini mon tableur et je serais amené à insérer des lignes et des colonnes plutard.
Comment faire pour que mes noms de cellules dans ma macro suivent le mouvement des mes cellules dans mon tableau. J'ai éssayer les dollars partous, mais ça ne marche pas.
Enfin pour savoir si j'ai bien compris ce que j'ai copier/coller, est-ce vrai que :
Private Sub Worksheet_SelectionChange(ByVal Target As Range) '= nom de la fonction'
If Target.Address = "F6" Then '= si je click sur f6'
If Target.Value = [M6] Then Target.Value = "" '=si la valeur lu est déjà celle contenu dans m6 alors la valeur de m6 est nulle ???????'
ElseIf Range("F6").Value = "" Then
Range("F6").Value = [M6] '=sinon si le contenu de f6 est nul alors mais la valeur de m6 dans f6'
End If
End Sub
Visiblement j'ai du mal.
Je vous remercie !
A voir également:
- Private sub worksheet_selectionchange(byval target as range)
- Navigation in private - Guide
- Out of range - Forum Windows
- Do not turn off target traduction - Forum Samsung
- Samsung galaxy tab S Bloquer Downloading do not turn off target - Forum Téléphones & tablettes Android
- Dekart private disk - Télécharger - Chiffrement
9 réponses
bonjour
Si j'ai compris ce que tu veux faire, tu pourrais essayer ceci :
Si j'ai compris ce que tu veux faire, tu pourrais essayer ceci :
Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Not Intersect(Target, Range("F6:F100")) Is Nothing Then If Target.Value = Cells(Target.Row, "M").Value Then Target.Value = "" ElseIf Target.Value = "" Then Target.Value = Cells(Target.Row, "M").Value End If End Sub
Bonjour
Merci pour votre réponse. Par contre cela ne fait rien, même lorsque j'ouvre un nouveau classeur et que je rempli ma colonne M avec des nombre.
Mais je pense qu'il ne manque pas grand chose pour que ça puisse répondre à ma question.
Merci pour votre réponse. Par contre cela ne fait rien, même lorsque j'ouvre un nouveau classeur et que je rempli ma colonne M avec des nombre.
Mais je pense qu'il ne manque pas grand chose pour que ça puisse répondre à ma question.
bonjour
Comme je n'ai pas très bien compris ce que tu voulais obtenir sur une plage, je n'ai fait que transposer ton code et c'est possible que le résultat espéré ne soit pas réalisé.
Si tu pouvais m'expliquer ce que tu attends, ce serait peut-être plus facile.
Toujours zen
Comme je n'ai pas très bien compris ce que tu voulais obtenir sur une plage, je n'ai fait que transposer ton code et c'est possible que le résultat espéré ne soit pas réalisé.
Si tu pouvais m'expliquer ce que tu attends, ce serait peut-être plus facile.
Toujours zen
Bonjour
En effet je n'ai peut-être pas été très clair.
Je veux faire un tableau pour calculer les consomation d'appareil electroménagers. Cela dépend du temps d'utilisation des appareils.
J'ai deux colonnes. Admettons La M et la F.
La F sont des donnés pas défaut (de temps d'utilisation suite à des étude faite par des organisme spécialisés ...) qui sont utiles quand on ne sais pas quoi mettre dans la colonne M.
Ce que j'utilise pour mes calculs c'est la M. A l'origine elle identique à la F. Mais je voudrais pouvoir changer des valeur de M si jamais on le temps d'utilisation est complètement différent de celui faite par les fameuse etudes ... (les durées de la colonne F. Par contre en modifiant M, je voudrais pouvoir retrouver plutard les valeur par défaut (donc identique à F).
Le programme que j'avais trouvé n'était pas trop mal :
Private Sub Worksheet_SelectionChange(ByVal Target As Range) '= nom de la fonction'
If Target.Address = "F6" Then '= si je click sur f6'
If Target.Value = [M6] Then Target.Value = "" '=si la valeur lu est déjà celle contenu dans m6 alors la valeur de m6 est nulle ???????'
ElseIf Range("F6").Value = "" Then
Range("F6").Value = [M6] '=sinon si le contenu de f6 est nul alors mais la valeur de m6 dans f6'
End If
End Sub
Au début M et F sont pareil. Quand je click sur une cellule (M6) elle s'éfface et je peut rentrer ce que je veux dessus. Si elle est vide (en supprimant le contenu), la valeur F6 s'affiche dans M6, et hop je retrouve la duree d'utilisation par défaut de l'appareil en question.
Le premier problème est que j'ai beaucoup d'appareil, et ca fait beaucoup de macro. Je voulais savoir si il n'était pas possible de tous faire défiller ...
Le deuxième problème est que une fois que j'ai faitmes macro, je n'ai plus intéret à ajouter ou supprimer des lignes ou des colonnes, au risque de tous décaller.
Merci de vos conseils, Bonne fin de semaine !
En effet je n'ai peut-être pas été très clair.
Je veux faire un tableau pour calculer les consomation d'appareil electroménagers. Cela dépend du temps d'utilisation des appareils.
J'ai deux colonnes. Admettons La M et la F.
La F sont des donnés pas défaut (de temps d'utilisation suite à des étude faite par des organisme spécialisés ...) qui sont utiles quand on ne sais pas quoi mettre dans la colonne M.
Ce que j'utilise pour mes calculs c'est la M. A l'origine elle identique à la F. Mais je voudrais pouvoir changer des valeur de M si jamais on le temps d'utilisation est complètement différent de celui faite par les fameuse etudes ... (les durées de la colonne F. Par contre en modifiant M, je voudrais pouvoir retrouver plutard les valeur par défaut (donc identique à F).
Le programme que j'avais trouvé n'était pas trop mal :
Private Sub Worksheet_SelectionChange(ByVal Target As Range) '= nom de la fonction'
If Target.Address = "F6" Then '= si je click sur f6'
If Target.Value = [M6] Then Target.Value = "" '=si la valeur lu est déjà celle contenu dans m6 alors la valeur de m6 est nulle ???????'
ElseIf Range("F6").Value = "" Then
Range("F6").Value = [M6] '=sinon si le contenu de f6 est nul alors mais la valeur de m6 dans f6'
End If
End Sub
Au début M et F sont pareil. Quand je click sur une cellule (M6) elle s'éfface et je peut rentrer ce que je veux dessus. Si elle est vide (en supprimant le contenu), la valeur F6 s'affiche dans M6, et hop je retrouve la duree d'utilisation par défaut de l'appareil en question.
Le premier problème est que j'ai beaucoup d'appareil, et ca fait beaucoup de macro. Je voulais savoir si il n'était pas possible de tous faire défiller ...
Le deuxième problème est que une fois que j'ai faitmes macro, je n'ai plus intéret à ajouter ou supprimer des lignes ou des colonnes, au risque de tous décaller.
Merci de vos conseils, Bonne fin de semaine !
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonjour tout le monde,
Comme gb ne veut pas se lever ce matin je me permet d'intervenir... ;-)
Avec tes explications c'est plus clair, mais je préfère utiliser l'évènement change.
Si tu vides une (ou plusieurs) cellule de M6:M100 la valeur en F est recopiée :
Pour l'initialisation du tableau si tu supprimes des cellules vides ça marche aussi.
eric
Comme gb ne veut pas se lever ce matin je me permet d'intervenir... ;-)
Avec tes explications c'est plus clair, mais je préfère utiliser l'évènement change.
Si tu vides une (ou plusieurs) cellule de M6:M100 la valeur en F est recopiée :
Private Sub Worksheet_Change(ByVal Target As Range) Dim c As Range If Intersect(Target, Range("M6:M100")) Is Nothing Then Exit Sub For Each c In Intersect(Target, Range("M6:M100")) If c = "" Then c = Cells(c.Row, "F").Value Next c End Sub
Pour l'initialisation du tableau si tu supprimes des cellules vides ça marche aussi.
eric
RE bonjour
Je vais vous avouer que je n'ai pas tous compris mais ça marche.
Je vous remercie bien
Bonne journée !!
Je vais vous avouer que je n'ai pas tous compris mais ça marche.
Je vous remercie bien
Bonne journée !!
Bonjour (RE après près de 3 mois)
Ma réapparition va paraître curieuse mais je me suis mis à refaire des petits programmes excels et voila que j'ai besoin d'utiliser la même macro que celle précédemment données, mais avec une différence, qui bien évidement me bloque !! je me souvient avoir eu des réponses qui m'avaient bien aidées la dernière fois, je vais donc retenter ma chance !
Pour faire simple je vais réutiliser le problème d'avant avec une colonne F qui sert à remplir un colonne M au cas ou cette dernière présentes des cellules vides.
Mon problème est maintenant que dans la colonne F il y a parfois des cellules contenant du texte. Et dans ce cas je n'ai pas besoin d'utiliser la macro. Le problème est que si je supprimer une cellule M (par erreur) dont la cellule F correspondante est une cellule contenant un texte, alors la macro n'apprécie pas du tous et block.
Il y aurait-il un moyen pour au lieu de prendre toute la colonne M prendre plusieurs portion de la colonne M (cf exemple ci dessous).
Ou bien faire en sort que la macro ne soit pas gênée si jamais la valeur dans F est un texte au lieu d'un chiffre.
J'ai essayé de faire avec ";" pour essayer de faire un "et" mais ça ne marche pas :
Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
If Intersect(Target, Range("M6:M20" ; "M50:M100")) Is Nothing Then Exit Sub
For Each c In Intersect(Target, Range("M6:M20" ; "M50:M100"))
If c = "" Then c = Cells(c.Row, "F").Value
Next c
End Sub
Vous l'aurez compris, je suis rester très novice depuis la dernière fois.
Merci d'avance !
Ma réapparition va paraître curieuse mais je me suis mis à refaire des petits programmes excels et voila que j'ai besoin d'utiliser la même macro que celle précédemment données, mais avec une différence, qui bien évidement me bloque !! je me souvient avoir eu des réponses qui m'avaient bien aidées la dernière fois, je vais donc retenter ma chance !
Pour faire simple je vais réutiliser le problème d'avant avec une colonne F qui sert à remplir un colonne M au cas ou cette dernière présentes des cellules vides.
Mon problème est maintenant que dans la colonne F il y a parfois des cellules contenant du texte. Et dans ce cas je n'ai pas besoin d'utiliser la macro. Le problème est que si je supprimer une cellule M (par erreur) dont la cellule F correspondante est une cellule contenant un texte, alors la macro n'apprécie pas du tous et block.
Il y aurait-il un moyen pour au lieu de prendre toute la colonne M prendre plusieurs portion de la colonne M (cf exemple ci dessous).
Ou bien faire en sort que la macro ne soit pas gênée si jamais la valeur dans F est un texte au lieu d'un chiffre.
J'ai essayé de faire avec ";" pour essayer de faire un "et" mais ça ne marche pas :
Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
If Intersect(Target, Range("M6:M20" ; "M50:M100")) Is Nothing Then Exit Sub
For Each c In Intersect(Target, Range("M6:M20" ; "M50:M100"))
If c = "" Then c = Cells(c.Row, "F").Value
Next c
End Sub
Vous l'aurez compris, je suis rester très novice depuis la dernière fois.
Merci d'avance !
Bonjour
Voici le lien :
http://www.cijoint.fr/cjlink.php?file=cj201109/cijSB04RBY.xlsm
Je ne sais pas si le liens est corect, c'est la première fois que j'utilise cijoint.fr.
Le problème précédent venait du fait que la macro n'aima pas quand les cellules "de secours" sont vides ou fusionnée.
En continuent je suis tombé sur un nouveau problème :
Je veux faire ça pour 2 colonne, la M (rempli avec F si des cellules sont vide), et un nouvelle, la N (rempli avec g si des cellules sont vides).
Je suis donc parti de la première macro qui fonctionnait corectement pour avoir la suivant (qui bien évidement ne marche pas étant donné mon niveau en programmation :
Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
If Intersect(Target, Range("M2:M44")) Is Nothing Then
If Intersect(Target, Range("N2:N44")) Is Nothing Then Exit Sub
For Each c In Intersect(Target, Range("N2:N44"))
If c = "" Then c = Cells(c.Row, "G").Value
Next c
For Each c In Intersect(Target, Range("M2:M44"))
If c = "" Then c = Cells(c.Row, "F").Value
Next c
End Sub
Si quelqu'un à une idée ...
Merci bien !
Voici le lien :
http://www.cijoint.fr/cjlink.php?file=cj201109/cijSB04RBY.xlsm
Je ne sais pas si le liens est corect, c'est la première fois que j'utilise cijoint.fr.
Le problème précédent venait du fait que la macro n'aima pas quand les cellules "de secours" sont vides ou fusionnée.
En continuent je suis tombé sur un nouveau problème :
Je veux faire ça pour 2 colonne, la M (rempli avec F si des cellules sont vide), et un nouvelle, la N (rempli avec g si des cellules sont vides).
Je suis donc parti de la première macro qui fonctionnait corectement pour avoir la suivant (qui bien évidement ne marche pas étant donné mon niveau en programmation :
Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
If Intersect(Target, Range("M2:M44")) Is Nothing Then
If Intersect(Target, Range("N2:N44")) Is Nothing Then Exit Sub
For Each c In Intersect(Target, Range("N2:N44"))
If c = "" Then c = Cells(c.Row, "G").Value
Next c
For Each c In Intersect(Target, Range("M2:M44"))
If c = "" Then c = Cells(c.Row, "F").Value
Next c
End Sub
Si quelqu'un à une idée ...
Merci bien !
Si quelqu'un à une idée ...
Oui, poser une question à la fois, là on ne sait plus ce que tu veux exactement.
Donc tu fais le tri dans ta tête et tu exposes clairement et complètement ton besoin.
1) Déjà, la fusion des cellules est une très mauvaise idée. Réserve ça pour quand c'est impératif et que tu ne peux faire autrement.
Sélectionne la plage et dans format de cellule tu choisis 'alignement / horizontal / centré sur plusieurs colonnes'
2) je ne vois pas pourquoi un texte ferait planter la macro (?)
Mais tu peux tester F pour qu'elle ne soit active que s'il y a un nombre :
If c = "" And IsNumeric(Cells(c.Row, "F")) Then c = Cells(c.Row, "F").Value
3) sépare tes plages par des ,
If Intersect(Target, [M6:M20], [M50:M100]) Is Nothing Then Exit Sub
eric
Oui, poser une question à la fois, là on ne sait plus ce que tu veux exactement.
Donc tu fais le tri dans ta tête et tu exposes clairement et complètement ton besoin.
1) Déjà, la fusion des cellules est une très mauvaise idée. Réserve ça pour quand c'est impératif et que tu ne peux faire autrement.
Sélectionne la plage et dans format de cellule tu choisis 'alignement / horizontal / centré sur plusieurs colonnes'
2) je ne vois pas pourquoi un texte ferait planter la macro (?)
Mais tu peux tester F pour qu'elle ne soit active que s'il y a un nombre :
If c = "" And IsNumeric(Cells(c.Row, "F")) Then c = Cells(c.Row, "F").Value
3) sépare tes plages par des ,
If Intersect(Target, [M6:M20], [M50:M100]) Is Nothing Then Exit Sub
eric
C'est vrai que je commence à m'embrouiller moi même. DSL
Pour être claire :
J'ai 2 colonne M et N qui sont remplis manuellement, SAUF dans le cas ou on ne sait pas quoi mettre. ET dans ce cas il suffit de faire "suppr" sur la cellule en question pour appeler une valeur par défaut (contenu dans F ou dans G) qui ne sera pas aussi bien mais qui fera l'affaire.
F contient les valeurs par défaut pour les cellules de la colonnes M
G contient les valeurs par défaut pour les cellules de la colonnes N
Voila maintenant ou j'en suis (car il y a eu de l'avancement depuis le début de la conversation).
La macro suivante me convient parfaitement, elle répond à ce que je viens de dire à propos de M (et de F) :
Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
If Intersect(Target, [M2:M44]) Is Nothing Then Exit Sub
For Each c In Intersect(Target, [M2:M44])
If c = "" Then c = Cells(c.Row, "F").Value
Next c
End Sub
SAUF que maintenant il me faut la même chose pour remplir la colonne N avec la colonne G, et ce dans la même fauille (puisque G,F,M et N sont sur tous sur la feuil1)
J'ai bien éssayer de faire 2 " Private Sub Worksheet_Change(ByVal Target As Range)" dans le même fichier xlsm, mais Visual basic n'aime pas : "Erreur de compilation, Nom ambigu détecté : Worksheet_Change".
J'éssai donc de chercher un moyen de pouvoir m'occuper de la colonne M et de la colonne N sous le même " Private Sub Worksheet_Change(ByVal Target As Range)".
Et c'est la que je bloque.
J'espère avoir été un peu plus clair.
Merci pour vos réponses.
Pour être claire :
J'ai 2 colonne M et N qui sont remplis manuellement, SAUF dans le cas ou on ne sait pas quoi mettre. ET dans ce cas il suffit de faire "suppr" sur la cellule en question pour appeler une valeur par défaut (contenu dans F ou dans G) qui ne sera pas aussi bien mais qui fera l'affaire.
F contient les valeurs par défaut pour les cellules de la colonnes M
G contient les valeurs par défaut pour les cellules de la colonnes N
Voila maintenant ou j'en suis (car il y a eu de l'avancement depuis le début de la conversation).
La macro suivante me convient parfaitement, elle répond à ce que je viens de dire à propos de M (et de F) :
Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
If Intersect(Target, [M2:M44]) Is Nothing Then Exit Sub
For Each c In Intersect(Target, [M2:M44])
If c = "" Then c = Cells(c.Row, "F").Value
Next c
End Sub
SAUF que maintenant il me faut la même chose pour remplir la colonne N avec la colonne G, et ce dans la même fauille (puisque G,F,M et N sont sur tous sur la feuil1)
J'ai bien éssayer de faire 2 " Private Sub Worksheet_Change(ByVal Target As Range)" dans le même fichier xlsm, mais Visual basic n'aime pas : "Erreur de compilation, Nom ambigu détecté : Worksheet_Change".
J'éssai donc de chercher un moyen de pouvoir m'occuper de la colonne M et de la colonne N sous le même " Private Sub Worksheet_Change(ByVal Target As Range)".
Et c'est la que je bloque.
J'espère avoir été un peu plus clair.
Merci pour vos réponses.
Re,
eric
Private Sub Worksheet_Change(ByVal Target As Range) Dim c As Range If Intersect(Target, Union([M2:M44], [N2:N44])) Is Nothing Then Exit Sub Application.EnableEvents = False For Each c In Intersect(Target, Union([M2:M44], [N2:N44])) If c = "" Then c = c.Offset(0, -7).Value Next c Application.EnableEvents = True End Sub
eric