Je souhaite remplir une feuille (C) avec des données se trouvant dans une autre (A).
Chaque cellule destinatrice = une cellule issue d'une colonne de la feuille source.
Celle-ci est un tableau nominatif avec différentes attribution concernant la personne de la ligne.
Une solution est de copier la ligne souhaitée depuis (A) puis de la coller ailleurs (feuille B) pour que ce "ailleurs" serve de source constante (par exemple copier la ligne 13 de M Durand (feuille A) dans la feuille servant de relais (feuille B). La feuille destination (C) ayant des formules qui récupèrent ces données pour remplir ses propres cellules.
Mais est-il possible, juste en sélectionnant une ligne de la feuille A de lancer une macro qui fasse le travail de recopie ?
le fichier n'existant pas encore, difficile de le publier ;-)
Peux-tu me détailler comment fonctionne cette macro ? merci
J'ai mis ceci dans la feuille source mais ça ne fonctionne pas:
Private Sub Worksheet_Change(ByVal Target As Range)
Rows(ActiveCell.Row).Select
Selection.Copy
Sheets("lien").Select 'lien est la feuille "intermédiaire" qui recueille les éléments copiés de la feuille source
Range(A2).Select 'la feuille destination a des cellules qui sont = lien!B2 , =lien!H2 ...
ActiveSheet.Paste
End Sub
en effet, ça fonctionne bien, ce qui change tout est le "SelectionChange" (au lieu de Change seul) mais il y a un bug dans mes lignes de programmation (ça se plante à la ligne "Range(A2))
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Rows(ActiveCell.Row).Select
Selection.Copy
Sheets("lien").Select 'lien est la feuille "intermédiaire" qui recueille les éléments copiés de la feuille source
Range(A2).Select 'la feuille destination a des cellules qui sont = lien!B2 , =lien!H2 ...
ActiveSheet.Paste
End Sub
Et en appliquant ta macro
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not (Intersect(Target, Range("A:A")) Is Nothing) Then
Rows(ActiveCell.Row).Select
Selection.Copy
Sheets("lien").Select 'lien est la feuille "intermédiaire" qui recueille les éléments copiés de la feuille source
Range("A2").Select 'la feuille destination a des cellules qui sont = lien!B2 , =lien!H2 ...
ActiveSheet.Paste
End If
End Sub
par contre , là ça ne fonctionne pas (rien ne se passe), mais est-ce que tu pourrais m’expliquer chaque ligne car j’aime bien comprendre ce que je fais, plutôt que de recopier bêtement des lignes VBA dans un fichier sans cherche à m’instruire.
J’ai modifié Feuil2 par lien :
Code:
Private Sub Worksheet_SelectionChange(ByVal Cible As Range)
If (Cible.Rows.Count = 1) * (Cible.Columns.Count = Me.Columns.Count) Then
With lien
Cible.EntireRow.Copy Destination:=.Cells(.Cells(.Rows.Count, 1).End(xlUp).Row - Not IsEmpty(.Cells(.Rows.Count, 1).End(xlUp)), 1)
End With
End If
End Sub
Re : Peut-on lancer une macro juste en sélectionnnant une ligne ?
ça y est j'ai trouvé où ça buggait: il fallait écrire "ActiveSheet.Range("A2").Select"
donc la macro complète est:
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not (Intersect(Target, Range("A:A")) Is Nothing) Then
Rows(ActiveCell.Row).Select
Selection.Copy
Sheets("lien").Select 'lien est la feuille "intermédiaire" qui recueille les éléments copiés de la feuille source
ActiveSheet.Range("A2").Select 'la feuille destination a des cellules qui sont = lien!B2 , =lien!H2 ...
ActiveSheet.Paste
End If
End Sub
Maintenant, j'aimerais comprendre vos deux scripts afin de ne pas rester un simple consommateur et de pouvoir aider d'autres forumeurs. Merci d'avance.
"Ça" fonctionne pour qui sait lire.
Il est dit :
«Sélectionner une ligne (en cliquant sur son en-tête) provoque sa copie dans l'onglet Feuil2.»
Par conséquent, pour copier (par exemple) la ligne 12, je la sélectionne en cliquant sur son en-tête, en l'occurence le petit 12 placé devant la première cellule de la ligne...
Bonne continuation.
ℝOGER2327 #6981
Mercredi 18 As 141 (Saint Chambernac, pauvriseur - fête Suprême Quarte) 30 Brumaire An CCXXII, 3,8938h - rouleau 2013-W47-3T09:20:43Z
(...)
Maintenant, j'aimerais comprendre vos deux scripts afin de ne pas rester un simple consommateur et de pouvoir aider d'autres forumeurs. Merci d'avance.
Re : Peut-on lancer une macro juste en sélectionnant une ligne ?
whaou ! c'est un peu "costaud" pour moi
il reste encore un petit truc:
(pardon Roger, j'avais commencé avec la macro porposée par CHALET53, vu qu'il avait répondu le premier, j'ai donc poursuivi sur cette piste, mais je garde ta proposition sous le coude).
Voici donc ma macro complète:
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not (Intersect(Target, Range("A:A")) Is Nothing) Then
Rows(ActiveCell.Row).Select
Selection.Copy
Sheets("Lien").Visible = True
Sheets("Lien").Select
ActiveSheet.Range("A2").Select
ActiveSheet.Paste
Sheets("Lien").Visible = False
End If
Sheets("formulaire").Select
End Sub
Dans la feuille "source" (celle où se trouve la Private Sub), la première colonne est remplie de noms.
Si je laisse tel quel, la feuille lien recopie bien la ligne sélectionnée, mais, aussitôt après, le changement de feuille provoque le vidage de la première cellule de cette feuille et se traduit donc par un #SEL sur la cellule correspondante dans la feuille "formulaire" (destination).
Pour y remédier, j'ai ajouté une colonne vide devant les noms, mais il y a certainement mieux à faire, comme par exemple, n'éxecuter la macro que sur la feuille source (?)
L'autre problème est qu'en cliquant sur une autre cellule que celle de la première colonne, on va directement ouvrir la feuille formulaire sur le dernier champ rempli et la macro est shuntée.
Je pense que ça vient de la syntaxe de : If Not (Intersect(Target, Range("A:A")) Is Nothing)
mais comme je ne la maaîtrise pas, je ne sais pas ce qu'il faut rectifier.
Re : Peut-on lancer une macro juste en sélectionnant une ligne ?
salut
autre proposition avec variable booléenne pour éviter des copies à répétition
Code:
Option Explicit
Dim l() As Boolean
Private Sub Worksheet_SelectionChange(ByVal R As Range)
If R.Count > 1 Then Exit Sub
If R = "" Then Exit Sub
ReDim Preserve l([A6000].End(xlUp).Row)
If l(R.Row) Then Exit Sub
Rows(R.Row).Copy Feuil2.[A6000].End(xlUp)(2)
l(R.Row) = -1
End Sub
en effet, je l'ai appliqué à mon fichier, ça marche super, merci beaucoup !!!
J'ai même pu la simplifier un peu puisque je copie toujours dans la même ligne (feuil7 , ligne 2)
Code:
Private Sub Worksheet_SelectionChange(ByVal Cible As Range)
If (Cible.Rows.Count = 1) * (Cible.Columns.Count = Me.Columns.Count) Then
With Feuil7
Cible.EntireRow.Copy Destination:=.Cells(2, 1)
End With
End If
End Sub