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   -
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 !





9 réponses

gbinforme Messages postés 14946 Date d'inscription   Statut Contributeur Dernière intervention   4 725
 
bonjour

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

0
yeye44 Messages postés 20 Date d'inscription   Statut Membre Dernière intervention   1
 
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.
0
gbinforme Messages postés 14946 Date d'inscription   Statut Contributeur Dernière intervention   4 725
 
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
0
yeye44 Messages postés 20 Date d'inscription   Statut Membre Dernière intervention   1
 
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 !

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 276
 
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 :
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
0
yeye44 Messages postés 20 Date d'inscription   Statut Membre Dernière intervention   1
 
RE bonjour

Je vais vous avouer que je n'ai pas tous compris mais ça marche.

Je vous remercie bien
Bonne journée !!
0
yeye44 Messages postés 20 Date d'inscription   Statut Membre Dernière intervention   1
 
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 !
0
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 276
 
Bonjour,

Tu devrais déposer un petit fichier exemple sur cijoint.fr et coller ici le lien fourni.
Décris les actions à effectuer pour avoir l'erreur.

eric
0
yeye44 Messages postés 20 Date d'inscription   Statut Membre Dernière intervention   1
 
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 !
0
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 276
 
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
0
yeye44 Messages postés 20 Date d'inscription   Statut Membre Dernière intervention   1
 
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.
0
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 276
 
Re,

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
0