Macro pour copier une plage de cellules

Seb8739

XLDnaute Nouveau
Bonjour,
J'ai un fichier excel dans lequel je veux ajouter des macros afin que de faciliter le travail d'autres utilisateurs qui ne sont pas habitués à faire des copier / coller avec excel.

1ère macro :
La ligne 2 reste fixe. (numéro de police)
la ligne 3 (champs A3:H3 sont) à recopier si besoin d'ajouter une catégorie, et à insérer à la prochaine ligne vide.

Private Sub AjoutdivisionmAAX_Click()
Range("A2").End(xlDown).Select
Selection.EntireRow.Copy
Selection.Insert Shift:=xlDown
Selection.Offset(1).Select 'descendre à la cellule en dessous, donc à la dernière ligne
[D4].ClearContents

2ème macro :

la ligne 5 sert de base pour la copie d'informations. (classe de base) - champs C5:D10 avant insertion de lignes avec la 1ère macro.

Private Sub AjoutClasseMAAX_Click()
Range("C5:D10").Select
Selection.Copy
Range("E5").Select
Selection.Insert Shift:=xlToRight
ActiveSheet.Paste
Range("G5").Select

Mon problème vient du fait que comme j'utilise le Range("C5:D10").Select, si de nouvelles lignes ont été ajoutées avant avec la 1ère macro, je me retrouve avec les mauvaises cellules à copier.

Comment arranger la macro pour que le champ soit par exemple le champ C5:C10 mais qui tient compte des lignes ajoutées et qui décale donc pour C6:C11,C7:C12...

Merci pour votre aide
 

Pièces jointes

  • Test.xlsm
    53 KB · Affichages: 59

Yurperqod

XLDnaute Occasionnel
Bonjour le forum

En utilisant tes macros modifiées ainsi, est-ce que ça marche?
VB:
Private Sub AjoutdivisionmAAX_Click()
Dim Ligne As Long
Ligne = Range("A2").End(xlDown).Row
Rows("2:" & Ligne).Copy
Rows("2:" & Ligne).Insert Shift:=xlDown
Range("A2").End(xlDown).Select
Range("C4") = Empty
End Sub

Private Sub AjoutClasseMAAX_Click()
Dim Ligne As Long
Ligne = Range("A2").End(xlDown).Row + 2
Cells(Ligne, "C").Resize(6).Copy
Cells(Ligne, 7).Insert Shift:=xlToRight
End Sub
 

Seb8739

XLDnaute Nouveau
Bonjour,
merci pour la réponse

En utilisant la macro modifiée comme ci-dessus, la ligne 2 est recopiée également. J'ai donc modifié pour

Private Sub AjoutdivisionmAAX_Click()
Dim Ligne As Long
Ligne = Range("A2").End(xlDown).Row
Rows("3:" & Ligne).Copy
Rows("3:" & Ligne).Insert Shift:=xlDown
Range("A2").End(xlDown).Select
Range("C4") = Empty
End Sub

par contre à présent si je clique de nouveau sur le bouton, 2 lignes sont copiées, et non 1, puis par la suite 3, puis 4...

pour la 2ème macro, cela fonctionne, mais copie uniquement la plage C5 à C10, et non C5 à D10, et c'est collé à la 7ème colonne, et non à la 1ère plage libre après les cellules déjà remplies.

Merci
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour Seb8739, Yurperqod,

Pour ce type de cas, j'utilise quelquefois des zone nommées au départ. Lors d'insertions ou suppressions de lignes et colonnes tout autour, la définition des zones nommées est automatiquement modifiée.

Deux zones au départ ont été définis (tapez F5 pour les sélectionner) :
  • la ligne 4 nommée LigneInsert
  • la zone E5 à F10 nommée CelluleInsert
Les insertions de divisions et classes se font par rapport à ces zones nommées.

Le code :
VB:
Private Sub AjoutdivisionmAAX_Click()
   'on insère une ligne avant la ligne nommée "LigneInsert"
   'on copie la deuxième ligne au-dessus de la ligne nommée "LigneInsert"
   '     sur la première ligne au-dessus de la ligne nommée "LigneInsert"
   'on efface la quatrième cellule de la première ligne au-dessus de la ligne nommée "LigneInsert"
   Range("LigneInsert").Insert xlShiftDown
   Range("LigneInsert").Offset(-2).Copy Range("LigneInsert").Offset(-1)
   Range("LigneInsert").Offset(-1)(1, 4).ClearContents
   Application.CutCopyMode = False
End Sub

Private Sub AjoutClasseMAAX_Click()
   'on insère 12 celllules avant la cellule nommée "CelluleInsert"
   'on copie les 12 cellules désirées avant la cellule nommée CelluleInsert
   Range("CelluleInsert").Insert xlShiftToRight
   Cells(Range("CelluleInsert").Row, "c").Resize(6, 2).Copy Range("CelluleInsert").Offset(, -2)
   Range("CelluleInsert").Offset(0, -2).Rows(1).ClearContents
   Application.CutCopyMode = False
End Sub
 

Pièces jointes

  • Seb8739- copie zone variables- v1.xlsm
    41.5 KB · Affichages: 51

Seb8739

XLDnaute Nouveau
Bonjour mapomme,

ça fonctionne !! merci beaucoup pour votre aide :)

Une dernière chose si je peux me permettre... est-il possible en conservant la même logique de macro, que ce soit la dernière plage créée qui soit copiée (dernière ligne pour macro 1, dernière plage de cellules pour la macro 2), et que pour la 2ème macro la nouvelle plage créée soit collée à la suite et non insérée?

Si pas de solution possible aucun problème, la solution déjà proposée est déjà très utile.

merci
 
Dernière édition:

Discussions similaires