Copier une plage de donnée en fonction d'une cellule variab
Bonjour,
Apres avoir recherché, sans succès, la solution à mon problème, je créé un nouveau sujet en espérant trouver une solution.
J’aimerai copier une plage de données d’un classeur à un autre en fonction d’une cellule variable.
Je m’explique sur un classeur appelé « Headcount » se trouve une liste d’employés (liste contenant un filtre automatique).
Dans le second classeur, « 2015 budget », se trouve ma cellule variable « B6 » (cellule contenant le critère). J’aimerai que lorsque j’entre un critère dans ma cellule B6, ma macro aille dans le classeur « Headcount », sélectionne les données qui correspondent à ce critère et les colle dans le classeur « 2015 Budget ».
Pour une meilleure compréhension, j’ai joint les deux fichiers en question.
Merci beaucoup pour votre aide !!
Bonjour,
A mettre dans le classeur "2015 Budget", dans le module de la feuille "Headcount" et ensuite, l'enregistrer au format ".xls" ou ".xlsm" pour garder la macro.
Note, le classeur "HEADCOUNT.xlsx" doit être ouvert durant le fonctionnement de la macro sinon, il faut modifier le code en ajoutant des lignes de commande d'ouverture et fermeture ou passer par ADO si le classeur doit rester fermé :
Private Sub Worksheet_Change(ByVal Target As Range)
Dim ClsHeadCount As Workbook
Dim Fe As Worksheet
Dim Plage As Range
Dim Cel As Range
Dim Ligne As Range
Dim I As Long
'seulement B6
If Target.Address(0, 0) <> "B6" Then Exit Sub
'gèle
Application.ScreenUpdating = False
Application.EnableEvents = False
'le classeur doit être ouvert !
'défini les valriable
Set ClsHeadCount = Workbooks("HEADCOUNT.xlsx")
Set Fe = ClsHeadCount.Worksheets("Employee")
'défini la plage de recherche
With Fe
'colonne H de la feuille "Employee" du classeur "HEADCOUNT.xlsx"
Set Plage = .Range(.Cells(2, 8), .Cells(.Rows.Count, 8).End(xlUp))
End With
'commence à la neuvième ligne
I = 9
'effectue la recherche du critère
For Each Cel In Plage
If Cel.Value = Target.Value Then
'défini la ligne qui doit être récupérée
Set Ligne = Fe.Range(Fe.Cells(Cel.Row, 1), Fe.Cells(Cel.Row, 9))
With ThisWorkbook.Worksheets("Headcount")
'inscrit les valeurs dans le tableau
.Range(.Cells(I, 2), .Cells(I, 10)).Value = Ligne.Value
'supprime la valeur du critère de la colonne "CCG" qu'elle valeur doit être récupérée ici ?
.Cells(I, 9) = ""
End With
'pour la ligne suivante
I = I + 1
End If
Next Cel
'rétabli
Application.EnableEvents = True
Application.ScreenUpdating = True
End SubHervé.
Bonjour Hervé,
Je tiens tout d’abord à m’excuser pour ma réponse un peu tardive et à vous remercier pour votre aide et votre temps. Hélas, je rencontre un problème. Apres avoir copié le code VBA sans mon fichier « 2015 Budget », je suis dans l’impossibilité de retrouver et exécuter la macro. Elle n’apparait pas dans ma liste de macro. J’ai comme vous l’avez spécifié sauvegarder ce dernier en .xlsm.
Enfin, en lisant la macro, si je ne me trompe pas, seule la colonne H du classeur « Headcount » est copiée dans le classeur « Budget 2015 ». Hors j’aurais besoin que les colonnes E à I soient copiées.
Merci encore pour votre aide.
Bonsoir,
Cette proc est en fait une proc évènementielle (elle se déclanche toute seule selon le type d'évènement choisi, ici "Change") donc, quand tu change la valeur dans la cellule "B6" et seulement dans cette dernière :
If Target.Address(0, 0) <> "B6" Then Exit Subla proc est exécutée.
Je t'ai dis de mettre la macro dans le module de la feuille "Headcount" :
A mettre dans le classeur "2015 Budget", dans le module de la feuille "Headcount"
Dans le VBE, tu double clique sur la feuille (fenêtre en haut à gauche) et à droite dans la fenêtre qui vient de s'ouvrir, tu colle le code que je t'ai posté ensuite, tu vas dans ta feuille Excel et tu entre une code dans la cellule B6 et quand tu valide, tu doit avoir les résultats qui s'inscrivent dans ton tableau au dessous
Enfin, en lisant la macro, si je ne me trompe pas, seule la colonne H du classeur « Headcount » est copiée dans le classeur "Budget 2015". Hors j’aurais besoin que les colonnes E à I soient copiées.
Non, ici, cette ligne de code récupère les valeurs de plusieurs colonnes (de A à I) :
Set Ligne = Fe.Range(Fe.Cells(Cel.Row, 1), Fe.Cells(Cel.Row, 9))
...
.Range(.Cells(I, 2), .Cells(I, 10)).Value = Ligne.ValueLa valeur d'une colonne est effacée (je crois que c'est la colonne I) car je n'ai pas su que mettre ?
.Cells(I, 9) = ""Hervé.
Bonjour Hervé,
Cela marche parfaitement !!! Merci beaucoup
Bonne journée !!