Repeter un enregistrement Macro sur les ligne suivante
Bonjour,
Je suis débutant sur Excel et je m'aide beaucoup des tutos et astuce que vous posté régulièrement.
Mais la j'ai un petit problème (pour vous je pense et gros pour moi) que je n'arrive pas a résoudre.
Je travail sur la création d'un fichier de gestion d'entrée/sortie de matériel, sur mon classeur j'ai deux feuille (liste des équipement et fil de suivi).
J'ai effectuer un enregistrement de macro de pour récupérer certaine info de la premier feuille afin d'alimenté mon fil de suivi sur la deuxième feuille avec un bouton de contrôle de formule a qui je lui ai affecté cette macro .
Mon problème est que j'ai plus de milles ligne et que je souhaiterai affecté ce bouton (et macro) a chaque ligne, et tout ca en choisissant la ligne que je viens de renseigné.
Voici le code de la macro que j'ai enregistré:
Sub ValidationDépart1()
'
' ValidationDépart1 Macro
'
'
Sheets("Fil de suivi").Select
Rows("3:3").Select
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Range("A3").Select
Sheets("Liste Matériels").Select
Range("C8").Select
Selection.Copy
Sheets("Fil de suivi").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Liste Matériels").Select
Range("N8").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Fil de suivi").Select
Range("B3").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Liste Matériels").Select
Range("O8").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Fil de suivi").Select
Range("D3").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Liste Matériels").Select
Range("P8").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Fil de suivi").Select
Range("F3").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Liste Matériels").Select
Range("Q8").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Fil de suivi").Select
Range("G3").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Liste Matériels").Select
Range("R8").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = ""
Range("R8").Select
End Sub
Merci de votre aide
Bonne journée
Bonjour,
Voici une proposition de code (A PLACER DANS LE MODULE DE LA FEUILLE "LISTE").
A chaque double-clic sur la feuille, elle s'exécutera (avec un message préalable de confirmation d'exécution).
On clic sur une ligne de Liste, On reporte les valeurs des cellules de cette ligne en colonnes C, N, O, P, Q à la première ligne non vide de "Fil" (colonnes A, B, D, F, G) puis on efface la cellule en R sur Liste.
private sub worksheet_beforedoubleclick(byval target as range, cancel as boolean)
cancel = true
ligne = target.row
if msgbox("Confirmez-vous la copie de la ligne " & ligne & " ?", vbyesno) = vbyes then
set wsfil = Sheets("Fil de suivi")
colfil = array(1, 2, 4, 6, 7)
colliste = array(3, 14, 15, 16, 17)
with wsfil
nvl = .cells(.rows.count, 1).end(xlup).row + 1
for k = lbound(colfil) to ubound(colfil)
.cells(nvl, colfil(k)).value = Me.cells(ligne, colliste(k)).value
next k
end with
Me.cells(ligne, 18).value = ""
end if
End SubCdlt,
Bonjour 3GB,
Merci d'avoir pris le temps de me répondre et de m'avoir créer ce code.
Je viens de coller le code dans la feuille "liste" mais il copie la ligne dans l'entête des colonne de la feuille "FIL".
Il n'incrémente pas de nouvelle ligne sur la feuille.
Voici le tableau en Liens pour que tu puisse voir ce que j'ai exactement au niveau des deux boutons de validation de la ligne 8.
Et je souhaiterai faire la même chose sur les 1000 lignes qui suit
Merci de ton aide.
Bonjour,
Il y avait un problème à cause des fusions de cellules sur les en-têtes de votre tableau. Règle d'or : ne jamais fusionner de cellules !
J'ai donc enlevé ces fusions, mis le tout sous forme de tableau structuré et adapté un peu le code. Normalement, ça devrait aller maintenant pour 1000 ou 100 000 lignes, ça copiera à chaque fois sur la première ligne non vide (tant qu'il n'y a pas de lignes vides intercalées entre des lignes non vides) et les restructurations seront automatiques.
J'ai remarqué qu'il y avait 2 fois 2 colonnes pour l'état du matériel. A mon avis, une seule suffit à chaque fois surtout s'il s'agit de mettre OK ou NOK mais je n'ai pas modifié.
Version antérieure supprimée
Cdlt,
Bonjour,
Merci pour la restructuration du tableau.
Je viens de faire des essais et ca fonctionne très bien.
le seul bémol (chose que j'ai complétement oublié de mentionné) c'est que sur la feuille "Liste" j'ai deux enregistrement et je viens de m'apercevoir que j'en ai mis qu'un seul.
Le deuxième sert au retour de matériel il enregistre comme le premier mais seulement la deuxième parti du tableau et une fois enregistré il efface les renseignement de la ligne concerné.
Au niveau de la feuille "suivi" il incrément une nouvelle ligne avec un enregistrement dans des colonne différente.
Cette fois-ci je mets les deux enregistrement complet.
Sub ValidationDépart1()
'
' ValidationDépart1 Macro
'
'
Sheets("Fil de suivi").Select
Rows("3:3").Select
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Range("A3").Select
Sheets("Liste Matériels").Select
Range("C8").Select
Selection.Copy
Sheets("Fil de suivi").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Liste Matériels").Select
Range("N8").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Fil de suivi").Select
Range("B3").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Liste Matériels").Select
Range("O8").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Fil de suivi").Select
Range("D3").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Liste Matériels").Select
Range("P8").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Fil de suivi").Select
Range("F3").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Liste Matériels").Select
Range("Q8").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Fil de suivi").Select
Range("G3").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Liste Matériels").Select
Range("R8").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = ""
Range("R8").Select
End Sub
Sub ValidationRetour1()
'
' ValidationRetour1 Macro
'
'
Sheets("Fil de suivi").Select
Rows("3:3").Select
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Range("A3").Select
Sheets("Liste Matériels").Select
ActiveWindow.ScrollColumn = 3
ActiveWindow.ScrollColumn = 2
ActiveWindow.ScrollColumn = 1
Range("C8").Select
Selection.Copy
Sheets("Fil de suivi").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Liste Matériels").Select
Range("S8").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Fil de suivi").Select
Range("C3").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Liste Matériels").Select
Range("T8").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Fil de suivi").Select
Range("E3").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Liste Matériels").Select
Range("U8").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Fil de suivi").Select
Range("H3").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Liste Matériels").Select
Range("V8").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Fil de suivi").Select
Range("I3").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Liste Matériels").Select
Range("W8").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Fil de suivi").Select
Range("J3").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Liste Matériels").Select
Range("X8").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Fil de suivi").Select
Range("K3").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Liste Matériels").Select
Range("N8:X8").Select
Application.CutCopyMode = False
Selection.ClearContents
Range("N8").Select
End SubDésoler de cette oubli qui est important;
Cdlt,
Bonjour,
Ces 2 lignes :
colfil = array(1, 2, 4, 6, 7)
colliste = array(3, 14, 15, 16, 17)permettent de définir les colonnes de destination (colfil) et les colonnes d'origine (colliste).
Il suffit d'adapter. Par exemple (je ne dis pas que ça correspond à votre attente) :
colfil = array(1, 2, 4, 6, 7, 8) 'A, B, D, F, G, H
colliste = array(3, 14, 15, 16, 17, 18) 'C, N, O, P, Q, RIci, la colonne A de "fil" recoit la colonne C de "liste", B recoit N, D recoit O, ...., H recoit R.
Il faut juste que les 2 array soient de même dimension.
Merci de clôturer le sujet si le problème est résolu.
Cdlt,
Bonjour,
Merci beaucoup pour ce code.
Petite question (Je suis casse pied), peut-on affecté ce code a un bouton?
Merci de ton retour.
Cdlt
Bonjour,
Ce code là, on ne peut pas l'affecter à un bouton parce qu'il s'agit d'une macro évènementielle qui se déclenche, non pas au clic sur un bouton, mais au double-clic sur une cellule. A moins que le besoin n'ait évolué entre temps, je pense que le double-clic est à privilégier car il permet d'avoir une seule procédure, qui variabilise la ligne à copier, sous un même évènement. Sinon, il faudrait une multitude de boutons (ce n'est pas top) et adapter le code en conséquence (beaucoup d'efforts pour un moins bon rendement).
Cdlt,
OK, Mais comment je peux différencier mes deux enregistrement?
Ah oui, c'est vrai ! Il vous faut 2 enregistrements. Je vais modifier le code de manière à gérer ça mais il faudra que vous saisissiez vous-même les colonnes de destination et d'origine du second enregistrement.
A bientôt,
Re,
Voici le fichier avec un code qui s'exécute toujours au double clic mais qui dépend de la zone du clic.
Dans la macro doubleclick, on va définir, pour chaque zone, les colonnes de destination et d'origine et on va les rentrer en paramètres de la macro commune appelée copie.
Si le double-clic a lieu sur A:M, les colonnes 3, 14, ... sont copiées sur les colonnes 1, 2, 4, 6, 7 de Suivi, sinon, ce sont d'autres colonnes qui sont copiées (c'est à vous de faire les petits changements) sachant que la colonne 1 ("A") de Suivi est fondamentale pour la bonne exécution du code. Il faut qu'elle soit alimentée à chaque fois.
Private Sub worksheet_beforedoubleclick(ByVal target As Range, cancel As Boolean)
cancel = True
If Not Intersect(target, Range("A:M")) Is Nothing Then
tColonnesListe = Array(3, 14, 15, 16, 17) 'origine à définir
tColonnesSuivi = Array(1, 2, 4, 6, 7) 'destination à définir
Call copie(target, tColonnesListe, tColonnesSuivi) 'macro commune exécutée en fonction de ces paramètres ci-avant
ElseIf Not Intersect(target, Range("N:Y")) Is Nothing Then
tColonnesListe = Array(3, 14, 15, 19, 20) 'origine
tColonnesSuivi = Array(1, 2, 4, 8, 9) 'destination
Call copie(target, tColonnesListe, tColonnesSuivi)
End If
End Sub
Sub copie(rcible As Range, ColonnesOrigine, ColonnesDestination)
ligne = rcible.Row
If MsgBox("Confirmez-vous la copie de la ligne " & ligne & " ?", vbYesNo) = vbYes Then
With Sheets("Fil de suivi").Range("Suivi")
nvl = .Rows.Count - Application.CountBlank(.Columns(1)) + 1
For k = LBound(ColonnesDestination) To UBound(ColonnesDestination)
.Cells(nvl, ColonnesDestination(k)).Value = Sheets("Liste Matériels").Cells(ligne, ColonnesOrigine(k)).Value
Next k
End With
Sheets("Liste Matériels").Cells(ligne, 18).Value = ""
End If
End Sub
Cdlt,
Re,
Merci beaucoup,
Je viens de faire la modification des cellules a copier et a coller.
Dernière question (Après je ne t'embête plus) Peut-on dans la fin du code du second enregistrement on peut rajouter l'effacement de la ligne copier. ou mettre une foction dans la fentre de validation une case a cocher pour valider l'éffacement des colonnes (N à Y)
Merci
En ajoutant cette ligne normalement :
Private Sub worksheet_beforedoubleclick(ByVal target As Range, cancel As Boolean)
cancel = True
If Not Intersect(target, Range("A:M")) Is Nothing Then
tColonnesListe = Array(3, 14, 15, 16, 17) 'origine à définir
tColonnesSuivi = Array(1, 2, 4, 6, 7) 'destination à définir
Call copie(target, tColonnesListe, tColonnesSuivi) 'macro commune exécutée en fonction de ces paramètres ci-avant
ElseIf Not Intersect(target, Range("N:Y")) Is Nothing Then
tColonnesListe = Array(3, 14, 15, 19, 20) 'origine
tColonnesSuivi = Array(1, 2, 4, 8, 9) 'destination
Call copie(target, tColonnesListe, tColonnesSuivi)
range("N:Y").rows(target.row).clearcontents
End If
End SubDécidément, tu veux vraiment rajouter des boutons et des cases à cocher
Cdlt,
Magnifique
Merci Beaucoup
tout fonctionne.
Merci encore.
Cdlt
Merci pour ce chaleureux retour ! Je suis content qu'on y soit parvenus.
Bonne continuation à toi,
Cdlt,