Macro de Reprise de sélection multiple [Résolu]

Signaler
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018
-
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018
-
Salut le Forum,
Il est toujours temps de vous souhaiter mes meilleurs voeux 2012.
Perso, j'en ai un que je souhaiterais voir être exhaussé grâce à vous.

Je voudrais copier-coller une sélection multiple de LIGNES ENTIERES, d'un classeur vers un autre. A priori, aucun problème ...
Sub MultiRow()
'Copie GLOBALE de sélection multiple de différentes lignes entières

    'Reprise des lignes sélectionnées
    Range("4:4,6:6,8:8").Select
    
    'Copiage
    Selection.Copy
    'Activation du deuxième Classeur ouvert devant recevoir les copies
    Windows("Classeur2").Activate
    'Dernière ligne non vide (accueil des copies)
    Last = Sheets(1).Range("A65536").End(xlUp).Row
    'Correctif pour la toute première ligne
    If Sheets(1).Range("A65536").End(xlUp).Value <> "" Then Last = Last + 1
    Range("A" & Last).Select
    'Collage
    ActiveSheet.Paste
    'Retour au Classeur source
    Windows("Classeur1").Activate
    'Fin de Copier-Coller
    Application.CutCopyMode = False
    Range("A1").Select
    
End Sub


Sauf que : dans le code
    'Reprise des lignes sélectionnées
    Range("4:4,6:6,8:8").Select

Comment entrer automatiquement les valeurs appropriées dans Range("xxxxx").select lorsque l'utilisateur fait sa sélection par les Clic+Ctrl habituels ?

J'ai bien essayé par ActiveCell.row associé à une valeur de cellule en bout de ligne, puis par Worksheet_SelectionChange ou Worksheet_Activate...
J'ai aussi voulu tenter (bêtement!) de lancer par macro l'éditeur de macro pour "récupérer" la sélection de l'utilisateur. Echec!

Bref, je patauge! Qui aurait une idée SVP ?

Merci
Cordialement

Rataxes64

93 réponses

Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018

Encore un petit soucis avec des colonnes avec filtrage (je t'avais pas dit)/
j'ai donc ajouté deux lignes à ton code
Private Sub traitons(t As Range)
    Dim r As Range, tut As String
    For Each r In t.Rows
        If r.EntireRow.Hidden =  True Then GoTo line1
        If sele "" Then tut "@" Else tut = ""

et
        End Select
line1:
    Next

et tout est renté dans l'ordre sur un filrage actif.

Il faut maintenant "reprendre" pour chacune des lignes de la sélection ("e"), toutes les valeurs de la ligne dans la feuille "Archives", ainsi que dans chacune des feuilles complémentaire "Arch(2)" à "Arch(8)" pour la même valeur de ligne "e", si la valeur en colonne B de la feuille "Arch( n )" n'est pas vide ou =0: Dans ce cas, on passe à la valeur "e" suivante.

La "reprise" est copiée dans la première ligne d'un nouveau classeur, pour chacune de ses feuilles "Archives" et Arch(n), et dont le nom est composé des valeurs de la feuille "Archives" en colonne : B, C, D, E, et F (attention, en F c'est une date + heure), séparée du caratère "&". Ce nouveau classeur est alors enregistré sous un chemin précis (exemple dans mon appli C:\InfiltroPass\Archives).

Une fois l'exportation terminée, on trouvera donc x fichiers correspondant au x choix, et contenant en première ligne de chacune de leur feuilles "Archives" à Arch(8), les valeurs correspondantes à celles de chaque choix x.

Comme je te l'ai dit,
J'ai entré ma "mixture" telle que je viens de te l'envoyer dans mon appli,

ET TOUT MARCHE !


En récupérant la valeur "e" dans ma macro d'exportation lancée après les choix faits,ça tourne impeccable (même avec Filtrage actif donc).

Voilà, on peut considérer que l'ojbet de ce post est désormais traité.
"Réponse acceptée", donc.

Avec tous mes remerciements

Cordialement.
Rataxes64
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
233
Bonjour,
recommence ton code sans tes activate, select etc... en passant par le "Paste" (de quoi ?) sans "Copy" .....(enfin quoi : tout ce qui est inutile, lourd ... et que tu devrais savoir depuis tout ce temps, quand même !...) et je te viendrai alors (après ce petit "effort" en aide).


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018

Bonjour,
Ucfoutu, je sais que j'ai toujours des progrès à faire, notamment du point de vue du "ménage" dans mes codes.

J'ai avancé un peu, et tu vas probalement trouver que je me compliques la vie.

J'ai ajouté un bouton dans ma feuille source pour lancer la recopie de la sélection.
Private Sub CommandButton1_Click()
    MultiRow
End Sub

Toujours dans la feuille, j'ai utilisé SelectionChange avec une cellule (C1) pour reprendre les adresses de selection
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    With Selection
    Range("C1") = Selection.Address
    End With
End Sub

Mais à chaque clic, l'adresse remonte en C1, même si elle existe déjà... Il va y avoir du boulot là dessus pour supprimer les adresses en doublon en C1, et je ne sais pas trop encore comment attaquer le problème, d'autant que dans l'application finale, on ne pourra PAS sélectionner une ligne directement. Il faudra reprendre l'info ActiveCell.row...

Ensuite j'ai tenté de reprendre le code de la sub MultiRow et de le "simplifier"
Sub MultiRow()
'Copie GLOBALE de sélection multiple de différentes lignes entières

'Reprise des lignes sélectionnées reportées en C1
SEL = Workbooks("Classeur1").Sheets(1).Range("C1").Value

'Copiage de la sélection faite dans le classeur1 (on pourrait s'en passer??)
Workbooks("Classeur1").Sheets(1).Range(SEL).Copy

'Destination du collage dans le classeur2
'Dernière ligne non vide (accueil des copies dans le classeur2)
Last = Workbooks("Classeur2").Sheets(1).Range("A65536").End(xlUp).Row
'Correctif pour la toute première ligne
If Workbooks("Classeur2").Sheets(1).Range("A65536").End(xlUp).Value <> "" Then Last = Last + 1
    'Range("A" & Last).Select
    
'Collage de la sélection faite dans classeur1 vers le classeur2 en première ligne vide
Workbooks("Classeur1").Sheets(1).Range(SEL).Paste Destination:=Workbooks("Classeur2").Sheets(1).Range("A" & Last)
    
End Sub


Mais "propriété ou méthode non gérée par cet objet" sur la dernière ligne : donc, j'ai mal compris l'Aide, et ma syntaxe merde quelquepart! Où est donc mon erreur ?

Je n'ai jamais utilisé la syntaxe "xxx.Paste Destination:=yyy", et ne savais même pas qu'on pouvait se passer de Copy...
J'attends avec impatience de découvrir ça.

Cordialement
Rataxes64
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
233
Je suis donc allé directement à ta dernière ligne, donc, sans même lire le reste :
Une suggestion : va donc voir dans ton aide en ligne à quel objet (un seul) peut s'appliquer la méthode Paste que tu utilises !

Par ailleurs : le reproche que je te faisais dans ton code précédent était que tu y utilisais un paste alors qu'aucun Copy n'existait !

Et par ailleurs et surtout : il est parfaitement inutile de passer par un "paste" pour attribuer à une cellule (de quelque feuille) la valeur d'une cellule (de quelque autre feuille) !

Et je te conseille enfin d('apprendre ce qu'est Target dans
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

On ne peut sérieusement développer ainsi, sans même savoir ce que l'on écrit et pourquoi on l'écrit.
Or, voilà quelques années que tu "t'y es mis" (je devrais dire "que tu ne t'y es pas mis").
Je refuse d'être complice de cela car la chose durerait longtemps sans que tu commences à apprendre.
Désolé.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
233
Pour que l'on comprenne ma réaction (que j'estime justifiée) :
1) Voilà plus de quatre ans, CerberusPau, que tu travailles avec VBA/Excel
2) tu as même déposé 7 sources (de qui étaient-elles donc ?)

Tu comprends le paradoxe ?


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018

Salut,
Bon, à vouloir trop détailler pour essayer d'être clair dans la demande qu'on fait, on risque de passer pour un ignare.
J'avoue que c'est pas agréable, donc on va faire sans détour.

1°) Le job à réaliser par un utilisateur lamba:
Chaque fois qu'il clique sur une cellule d'une ligne, la ligne entière doit être prise en compte pour sa recopie dans un autre classeur, (dernière ligne vide) quand il clique sur un bouton (Export). Il ne peut PAS sélectionner directement une ligne (en-tête masquées).
Bien sûr les lignes concernées ne seront pas forcément consécutives... donc on est en sélections multiples.

2°) Les codes qu'il semble falloir "nettoyer"
a) "récupérer" les indexes des lignes en question, et sans doublon.
Cellules "relais" dans la feuille1 du classeur1 (source)
en C1 et E1 : Résultats de la macro
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    With Selection
        rw = ActiveCell.Row
        If Range("E" & rw) = 1 Then Exit Sub
        Range("C1").Value = Range("C1").Value & ActiveCell.Row & ":" & ActiveCell.Row & ","
        Range("E" & rw) = 1
    End With
End Sub

en D1, formule =GAUCHE(C1;NBCAR(C1)-1)
(en effet, une ligne dans la macro avec
Range("D1").Value = Left(Cells(1, 3).Value, Len(Cells(1, 3).Value) - 1)
ne donne pas un résultat exploitable pour une sélection unique(????)
b) "copier/coller" par le bouton "Export".
Code Bouton "Export"
Private Sub CommandButton1_Click()
    MultiRow
End Sub

Code "MultiRow"
Sub MultiRow()

    SEL = Workbooks("Classeur1").Sheets(1).Range("D1").Value
    Range(SEL).Select
    Selection.Copy
    Windows("Classeur2").Activate
    Range("A1").Select
    ActiveSheet.Paste
    Windows("Classeur1").Activate
    Application.CutCopyMode = False
    
End Sub


Là, ça marche, mais, c'est vrai, c'est pas beau, et je n'arrive pas à éviter les select et autre activate. de même je ne sais pas comment ne pas passer par les cellules "relais" C1 et F1, ni éviter la formule en D1... (la déclaration "Etat" ne fonctionne pas...)

Même après quelques années de pratique modeste, on a toujours à apprendre.
Merci de m'aider à m'améliorer.

Cordialement

Rataxes64
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
233
Tu ne fais que montrer que les rudiments eux-mêmes t'échappent totalement.

1) relis donc ce que je t'ai dit plus haut à propos de Target (et ouvre ton aide VBA ! tu en as sacrément besoin)

2) ton bloc With lui-même est surprenant ! (With de quoi ? de ta sélection ? ===>> mais ton code l'ignore totalement !) ===>> ouvre ton aide VBA sur l'instruction With !

Tu vois ? ce sont les tous premiers rudiments qui te font encore défaut, après tant d'années
Quand on en aura fini avec ces premiers pas au youpala, on arrivera à d'autres notions, que tu n'as pas acquises non plus !
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018

Bonjour,
C'est la dernière ligne qui me donnait du fil à retordre: un seul "ActiveSheet" devant Paste, et plus de select, ni d'Activate.
Sub NewMultiRow()

SEL = Workbooks("Classeur1").Sheets(1).Range("D1").Value
Workbooks("Classeur1").Sheets(1).Range(SEL).Copy
Last = Workbooks("Classeur2").Sheets(1).Range("A65536").End(xlUp).Row
If Workbooks("Classeur2").Sheets(1).Range("A65536").End(xlUp).Value <> "" Then Last = Last + 1
ActiveSheet.Paste Destination:=Workbooks("Classeur2").Sheets(1).Range("A" & Last)
    
End Sub


Reste encore à virer les cellules "relais"...
Une idée ?

Merci
Cordialement



Rataxes64
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
233
Désolé, CerberusPau
Vraiment désolé.
Je ne reviendrai dans cette discussion que lorsque tu te seras mis au youpala (me relire) et que tu auras corrigé proprement en conséquence tout ce qu'il convient d'écrire proprement dans ton évènement Worksheet_SelectionChange
Donnant donnant.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018

Bonjour,
Justement, l'aide Excel montre un exemple de Selectionchange utilisant le "With" DIRECTEMENT ...
Je ne vois pas du tout ce qu'il faudrait que je précise avant...
Evidemment, si RIEN n'est sélectionné dans la feuille, un click sur le bouton Export plante la macro, mais si une cellule est sélectionnée (et chaque fois qu'une nouvelle l'est), le "With SELECTION" dans Worksheet_SelectionChange s'y applique, et donc la macro remonte bien ses résultats dans mes cellules "relais".
Sincèrement, j'aimerais vraiment que tu m'éclaires un peu plus.

Cordialement
Rataxes64
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
233
montre un exemple de Selectionchange utilisant le "With" DIRECTEMENT .


1) et ce bloc With concerne une fenêtre
2) et je t'ai demandé d'ouvrir ton aide VBA sur l'instruction With

Dans les deux cas, d'ailleurs, la syntaxe n'est pas celle que tu utilises
et Target ? (tu ne veux pas t'en soucier ? cela te fatigue ? ===>> c'est moi, qui vais commencer à "fatiguer", tu vas voir !)
Au lieu de revenir sans cesse ici ...

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018

Bonjour,

J'avais bien sûr aussi regardé dans les "instructions", mais je ne vois pas ce qui DOIT être ajouté pour être "propre".

Pourquoi le With Selection, "direct", est-il incorrect dans l'instruction Private Sub Worksheet_SelectionChange ?
Je croyais que Target était par définition dans cette instruction la Nouvelle Sélection.

Tu montes dans les tours, et je ne sais pas ce que je vais "voir", mais sache que je ne pensais pas te "fatiguer" à éclairer ma lanterne plus avant pour que mon code (qui tourne) soit plus propre.
Je ne te demandes pas de l'écrire à ma place, mais dans l'Aide je ne vois vraiment pas ce que tu me suggères.

Zen
Cordialement
Rataxes64
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
233
Alors :
1) bye
2) que dieu t'accompagne et je te souhaite beaucoup de chance et succès.

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018

Bonjour,

A défaut, Dieu m'a accompagné, et dans sa grande mansuétude Il m'a fait remarquer que le With Selection était en fait tout simplement inutile!

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    rw = ActiveCell.Row
    If Range("E" & rw) = 1 Then Exit Sub
    Range("C1").Value = Range("C1").Value & ActiveCell.Row & ":" & ActiveCell.Row & ","
    Range("E" & rw) = 1
End Sub

Je suppose donc que (enfin) mon code est dorénavent propre.

Reste le coeur du problème: Comment se passer des cellules "relais" C1, E+row, et de D1 avec sa formule =GAUCHE(C1;NBCAR(C1)-1) , pour récuprérer SANS doublons la syntaxe (SEL) du Range pour la macro MultiRow à la ligne de code
Workbooks("Classeur1").Sheets(1).Range(SEL).Copy

C1 récupère le résultat des sélections successives "Row" fourni par la macro, avec une mise en forme compatible de type x:x,y:y,z:z,etc...

E+row=1, évite une deuxème prise en compte d'une ligne déjà sélectionnée.

D1 est supprimée. La suppression de la dernière virgule en C1 est obtenue par une nouvelle ligne de code
SEL = Left(Cells(1, 3).Value, Len(Cells(1, 3).Value) - 1)

Dans ces conditions, la syntaxe de SEL (sans la dernière virgule) est donc valide et interprétable : Range(x:x,y:y,z:z)
Code final:
Sub MultiRow()

'Reprise des indexes des lignes sélectionnées reportées en C1 moins la dernière virgule
SEL = Left(Cells(1, 3).Value, Len(Cells(1, 3).Value) - 1)

'Copiage de la sélection dans le classeur1
Workbooks("Classeur1").Sheets(1).Range(SEL).Copy

'Destination du collage dans le classeur1
'Dernière ligne non vide (accueil des copies dans le classeur1)
Last = Workbooks("Classeur2").Sheets(1).Range("A65536").End(xlUp).Row
'Correctif pour la toute première ligne
If Workbooks("Classeur2").Sheets(1).Range("A65536").End(xlUp).Value <> "" Then Last = Last + 1
    
'Collage de la sélection dans classeur1 vers le classeur2 en première ligne vide
ActiveSheet.Paste Destination:=Workbooks("Classeur2").Sheets(1).Range("A" & Last)

End Sub


Comment maintenant ne plus avoir à recourir aux cellules C1 et E+row ?

D'autant qu'il faudra pouvoir annuler une sélection faite par erreur (ça ne posera pas de problème en E+rox, mais ce sera plus compliqué pour corriger (SEL) en supprimant par exemple un y:y, au beau milieu de la syntaxe).

Personnellement, je ne vois pas comment faire autrement que de conserver ces cellules ; je m'en remets donc aux vôtres, grises celles-là!

Cordialement

Rataxes64
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
233
C'est déjà bien que tu aies vu que tu n'utilisais même pas ta sélection, dans ton bloc With
Te reste un pas à faire : savoir ce que représente Target
Allez ===>> Bonne lecture.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
233
Ah (trop vite dit) ===>>
te reste également:
- à analyser le sens de la deuxième ligne dans :
Last = Workbooks("Classeur2").Sheets(1).Range("A65536").End(xlUp).Row
'Correctif pour la toute première ligne
If Workbooks("Classeur2").Sheets(1).Range("A65536").End(xlUp).Value <> "" Then Last = Last + 1

!
- à découvrir que la méthode copy ne saurait s'appliquer à une plage discontinue. (la méthode Paste non plus, ipso facto) !
Etudie bien.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
233
ou le sens de la première ligne (dans ce que j'ai mis en exergue). Ou alors tu m'expliques dans quelle cas de figure une cellule non vide pourrait être vide (ton si <> "") !

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018

Bonjour,

Tu as raison, cette deuxième ligne appelle une précision du commentaire.

Au début, le classeur2 ne comporte AUCUNE ligne, la valeur Last renvoyée est égale à 1. Normal.
Le collage dans classeur2 sera donc fait à la valeur Last, donc en ligne 1. Jusque là tout va bien.
Maintenant, il existe une ligne (1), mais Last va EGALEMENT renvoyer 1. Et là, c'est pas bon car le collage va s'effectuer sur la ligne 1 (donc écraser le précédent) alors qu'il faudrait aller en ligne 2 (Last+1).
D'où mon commentaire :
'Correctif pour la toute première ligne
et la ligne If <>""

Concernant Target, j'ai regardé l'Aide à SheetSelectionChange évènement et SelectionChange évènement. Peut-être voulais-tu me suggérer d'utiliser par exemple rw= Target.Row au lieu rw=ActiveCell.row ?

Mais par ailleurs j'ai constaté que si pour un clic unique sur une cellule d'une ligne, tout "va bien", ça ne fonctionne pas sur une sélection continue dans une colonne (clic gauche de la souris tenu) car seule la première ligne de la sélection est prise en compte.

J'ai donc modifié le script comme suit :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    For Each cell In Selection
        rw = cell.Row
        If Range("E" & rw) <> 1 Then
            cell.Font.Bold = True
            cell.Interior.ColorIndex = 6
            Range("C1").Value = Range("C1").Value & cell.Row & ":" & cell.Row & ","
            Range("E" & rw) = 1
        End If
    Next
    
End Sub


Détail: J'en ai profité pour passer la sélection prise en compte en gras et y affecter un fond jaune.
Par conte, dans ce dernier code, je ne vois pas où utiliser Target...

Merci de m'avoir encore répondu.

Cordialement
Rataxes64
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018

Oups!
Je vais me faire "gronder"!
Erreur de copier/coller : Bien sûr il faut remplacer ces vilains rw par cell.Row!
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    For Each cell In Selection
        If Range("E" & cell.Row) <> 1 Then
            cell.Font.Bold = True
            cell.Interior.ColorIndex = 6
            Range("C1").Value = Range("C1").Value & cell.Row & ":" & cell.Row & ","
            Range("E" & cell.Row) = 1
        End If
    Next
    
End Sub



Rataxes64
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018

Bonjour,

J'ai fini le Else qui manquait, permettant d'annuler une sélection erronée.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    For Each cell In Selection
        If Range("E" & cell.Row).Value <> 1 Then
            cell.Font.Bold = True
            cell.Interior.ColorIndex = 6
            Range("C1").Value = Range("C1").Value & cell.Row & ":" & cell.Row & ","
            Range("E" & cell.Row).Value = 1
        Else
            Init = Range("C1").Value
            Supr = cell.Row & ":" & cell.Row & ","
            Repl = ""
            Range("C1").Value = Replace(Init, Supr, Repl)
            Range("E" & cell.Row).Value = ""
            cell.Font.Bold = False
            cell.Interior.ColorIndex = xlNone
        End If
    Next
    
End Sub


Mais je ne trouve toujours pas comment ne pas passer par mes cellules "relais" C1 et E+row...


Cordialement
Rataxes64